diff options
author | Josh Matthews <josh@joshmatthews.net> | 2016-06-29 11:14:11 -0400 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2016-07-15 18:13:09 -0400 |
commit | 3c2435a172b1b11335b34a9071e6530514aaca46 (patch) | |
tree | 5f665f8f00b3e7921aeda69404adba98b3ec75c8 | |
parent | 2df5d705e13f78afc8ceeb1b5333fc886e2691fa (diff) | |
download | servo-3c2435a172b1b11335b34a9071e6530514aaca46.tar.gz servo-3c2435a172b1b11335b34a9071e6530514aaca46.zip |
Generate a list of supported DOM APIs from parsed WebIDLs.
9 files changed, 113 insertions, 12 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 2513b5b92eb..f6bb21932e6 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -8,6 +8,7 @@ from collections import defaultdict from itertools import groupby import operator +import os import re import string import textwrap @@ -6437,3 +6438,36 @@ impl %(base)s { # Done. return curr + + @staticmethod + def SupportedDomApis(config): + descriptors = config.getDescriptors(isExposedConditionally=False) + + base_path = os.path.join('dom', 'bindings', 'codegen') + with open(os.path.join(base_path, 'apis.html.template')) as f: + base_template = f.read() + with open(os.path.join(base_path, 'api.html.template')) as f: + api_template = f.read() + with open(os.path.join(base_path, 'property.html.template')) as f: + property_template = f.read() + with open(os.path.join(base_path, 'interface.html.template')) as f: + interface_template = f.read() + + apis = [] + interfaces = [] + for descriptor in descriptors: + props = [] + for m in descriptor.interface.members: + if PropertyDefiner.getStringAttr(m, 'Pref') or \ + PropertyDefiner.getStringAttr(m, 'Func') or \ + (m.isMethod() and m.isIdentifierLess()): + continue + display = m.identifier.name + ('()' if m.isMethod() else '') + props += [property_template.replace('${name}', display)] + name = descriptor.interface.identifier.name + apis += [(api_template.replace('${interface}', name) + .replace('${properties}', '\n'.join(props)))] + interfaces += [interface_template.replace('${interface}', name)] + + return CGGeneric((base_template.replace('${apis}', '\n'.join(apis)) + .replace('${interfaces}', '\n'.join(interfaces)))) diff --git a/components/script/dom/bindings/codegen/Configuration.py b/components/script/dom/bindings/codegen/Configuration.py index 9a39b1bc623..4074736a462 100644 --- a/components/script/dom/bindings/codegen/Configuration.py +++ b/components/script/dom/bindings/codegen/Configuration.py @@ -87,6 +87,8 @@ class Configuration: getter = lambda x: x.interface.isJSImplemented() elif key == 'isGlobal': getter = lambda x: x.isGlobal() + elif key == 'isExposedConditionally': + getter = lambda x: x.interface.isExposedConditionally() else: getter = lambda x: getattr(x, key) curr = filter(lambda x: getter(x) == val, curr) diff --git a/components/script/dom/bindings/codegen/GlobalGen.py b/components/script/dom/bindings/codegen/GlobalGen.py index 72a2faa71e4..23779d9e6d5 100644 --- a/components/script/dom/bindings/codegen/GlobalGen.py +++ b/components/script/dom/bindings/codegen/GlobalGen.py @@ -32,6 +32,8 @@ def main(): o = OptionParser(usage=usageString) o.add_option("--cachedir", dest='cachedir', default=None, help="Directory in which to cache lex/parse tables.") + o.add_option("--only-html", dest='only_html', action="store_true", + help="Only generate HTML from WebIDL inputs") (options, args) = o.parse_args() if len(args) < 2: @@ -51,24 +53,30 @@ def main(): parser.parse(''.join(lines), fullPath) parserResults = parser.finish() - # Write the parser results out to a pickle. - resultsPath = os.path.join(outputdir, 'ParserResults.pkl') - with open(resultsPath, 'wb') as resultsFile: - cPickle.dump(parserResults, resultsFile, -1) + if not options.only_html: + # Write the parser results out to a pickle. + resultsPath = os.path.join(outputdir, 'ParserResults.pkl') + with open(resultsPath, 'wb') as resultsFile: + cPickle.dump(parserResults, resultsFile, -1) # Load the configuration. config = Configuration(configFile, parserResults) to_generate = [ - ('PrototypeList', 'PrototypeList.rs'), - ('RegisterBindings', 'RegisterBindings.rs'), - ('InterfaceObjectMap', 'InterfaceObjectMap.rs'), - ('InterfaceTypes', 'InterfaceTypes.rs'), - ('InheritTypes', 'InheritTypes.rs'), - ('Bindings', os.path.join('Bindings', 'mod.rs')), - ('UnionTypes', 'UnionTypes.rs'), + ('SupportedDomApis', 'apis.html'), ] + if not options.only_html: + to_generate = [ + ('PrototypeList', 'PrototypeList.rs'), + ('RegisterBindings', 'RegisterBindings.rs'), + ('InterfaceObjectMap', 'InterfaceObjectMap.rs'), + ('InterfaceTypes', 'InterfaceTypes.rs'), + ('InheritTypes', 'InheritTypes.rs'), + ('Bindings', os.path.join('Bindings', 'mod.rs')), + ('UnionTypes', 'UnionTypes.rs'), + ] + for name, filename in to_generate: generate_file(config, name, os.path.join(outputdir, filename)) diff --git a/components/script/dom/bindings/codegen/api.html.template b/components/script/dom/bindings/codegen/api.html.template new file mode 100644 index 00000000000..807392693a4 --- /dev/null +++ b/components/script/dom/bindings/codegen/api.html.template @@ -0,0 +1,6 @@ +<table id="${interface}"> +<tr> +<th>${interface}</th> +</tr> +${properties} +</table> diff --git a/components/script/dom/bindings/codegen/apis.html.template b/components/script/dom/bindings/codegen/apis.html.template new file mode 100644 index 00000000000..a6f1e59d4ab --- /dev/null +++ b/components/script/dom/bindings/codegen/apis.html.template @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta name="generator" content="rustdoc"> + <meta name="description" content="API documentation for the Rust `servo` crate."> + <meta name="keywords" content="rust, rustlang, rust-lang, servo"> + <title>Supported DOM APIs - servo - Rust</title> + <link rel="stylesheet" type="text/css" href="../rustdoc.css"> + <link rel="stylesheet" type="text/css" href="../main.css"> +</head> +<body class="rustdoc"> + <!--[if lte IE 8]> + <div class="warning"> + This old browser is unsupported and will most likely display funky + things. + </div> + <![endif]--> + <nav class='sidebar'> + <div class='block crate'> + <h3>Interfaces</h3> + <ul> + ${interfaces} + </ul> + </div> + </nav> + <section id='main' class="content mod"> + <h1 class='fqn'><span class='in-band'>DOM APIs currently supported in <a class='mod' href=''>Servo</a></span></h1> + <div id='properties' class='docblock'> + ${apis} + </div> + </section> +</body> +</html> diff --git a/components/script/dom/bindings/codegen/interface.html.template b/components/script/dom/bindings/codegen/interface.html.template new file mode 100644 index 00000000000..92b023165e2 --- /dev/null +++ b/components/script/dom/bindings/codegen/interface.html.template @@ -0,0 +1 @@ +<li><a href="#${interface}">${interface}</a></li> diff --git a/components/script/dom/bindings/codegen/property.html.template b/components/script/dom/bindings/codegen/property.html.template new file mode 100644 index 00000000000..7b16aa78d0f --- /dev/null +++ b/components/script/dom/bindings/codegen/property.html.template @@ -0,0 +1,3 @@ +<tr> + <td>${name}</td> +</tr> diff --git a/components/script/makefile.cargo b/components/script/makefile.cargo index 5611b127c5a..e12c4bdab23 100644 --- a/components/script/makefile.cargo +++ b/components/script/makefile.cargo @@ -18,7 +18,7 @@ bindinggen_dependencies := $(addprefix $(BINDINGS_SRC)/,BindingGen.py Bindings.c globalgen_dependencies := $(addprefix $(BINDINGS_SRC)/,GlobalGen.py Bindings.conf Configuration.py CodegenRust.py parser/WebIDL.py) $(CACHE_DIR)/.done $(OUT_DIR)/Bindings/.done -.PHONY: all +.PHONY: all dom_docs all: $(AUTOGEN_SRC) $(OUT_DIR)/Bindings/.done: @@ -38,6 +38,16 @@ $(OUT_DIR)/ParserResults.pkl: $(globalgen_dependencies) $(WEBIDLS) . \ $(WEBIDLS) +dom_docs: $(CACHE_DIR)/.done + $(PYTHON) \ + $(BINDINGS_SRC)/GlobalGen.py \ + --cachedir=$(CACHE_DIR) \ + --only-html \ + $(BINDINGS_SRC)/Bindings.conf \ + $(OUT_DIR) \ + . \ + $(WEBIDLS) + $(AUTOGEN_SRC): $(OUT_DIR)/Bindings/%Binding.rs: $(bindinggen_dependencies) \ $(addprefix $(WEBIDLS_SRC)/,%.webidl) $(PYTHON) \ diff --git a/etc/ci/upload_docs.sh b/etc/ci/upload_docs.sh index 980032a1350..c172c4331cc 100755 --- a/etc/ci/upload_docs.sh +++ b/etc/ci/upload_docs.sh @@ -16,5 +16,7 @@ cp etc/doc.servo.org/* target/doc/ python components/style/properties/build.py servo html +OUT_DIR="`pwd`/target/doc" make -f makefile.cargo -C components/script dom_docs + ghp-import -n target/doc git push -qf "https://${TOKEN}@github.com/servo/doc.servo.org.git" gh-pages |