forked from atom/autocomplete-css
-
Notifications
You must be signed in to change notification settings - Fork 2
/
update.coffee
56 lines (46 loc) · 1.77 KB
/
update.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# Run this to update completions stored in the completions.json
path = require 'path'
fs = require 'fs'
request = require 'request'
cheerio = require 'cheerio'
referenceURL = 'https://docs.oracle.com/javase/8/javafx/api/javafx/scene/doc-files/cssref.html'
fetch = ->
request {url: referenceURL}, (error, response, reference) ->
if error?
console.error(error.message)
return
if response.statusCode isnt 200
console.error("Request for JavaFX CSS Reference Guide failed: #{response.statusCode}")
return
html = cheerio.load(reference)
rows = html(".csspropertytable tr")
completions =
tags: {}
properties: Collect(rows, GetProperty),
pseudoSelectors: Collect(rows, GetSelector),
classNames: Collect(html(".styleclass"), GetClassNames)
fs.writeFileSync(path.join(__dirname, 'completions.json'), "#{JSON.stringify(completions, null, ' ')}\n")
Collect = (rows, getter) ->
dict = {}
dict[item.name] = item for item in (getter(row) for row in rows) when item?
delete item.name for name, item of dict
dict
GetProperty = (row) ->
name = cheerio("td.propertyname", row)
value = cheerio("td.value", row)
{
name: Text(name),
values: (val for val in Text(value).split(" ") when not /[<>|,=]|\[|\]|\//.test(val)).sort()
description: Text(cheerio("td:nth-child(4)", row))
} if name.length and value.length
GetSelector = (row) ->
name = cheerio("td.propertyname", row)
{
name: ":" + Text(name),
description: Text(cheerio("td:nth-child(2)", row))
} if name.length and cheerio("td", row).length is 2
GetClassNames = (row) ->
name = Text(cheerio(row)).replace("Style class:", "").trim()
{name: "." + name} unless /\s+|\./.test(name)
Text = (node) -> node.text().replace(/\s+/g, " ").trim()
fetch()