mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
Auto merge of #12451 - jdm:generate-dom-apis, r=Ms2ger
Generate a list of supported DOM APIs from parsed WebIDLs. Supplement the existing list of supported CSS properties with an equivalent list of DOM APIs. --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [X] `./mach build -d` does not report any errors - [X] `./mach test-tidy` does not report any errors - [X] These changes do not require tests because automatic generated documentation <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/12451) <!-- Reviewable:end -->
This commit is contained in:
commit
73ad0b928d
9 changed files with 113 additions and 12 deletions
|
@ -8,6 +8,7 @@ from collections import defaultdict
|
||||||
from itertools import groupby
|
from itertools import groupby
|
||||||
|
|
||||||
import operator
|
import operator
|
||||||
|
import os
|
||||||
import re
|
import re
|
||||||
import string
|
import string
|
||||||
import textwrap
|
import textwrap
|
||||||
|
@ -6437,3 +6438,36 @@ impl %(base)s {
|
||||||
|
|
||||||
# Done.
|
# Done.
|
||||||
return curr
|
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))))
|
||||||
|
|
|
@ -87,6 +87,8 @@ class Configuration:
|
||||||
getter = lambda x: x.interface.isJSImplemented()
|
getter = lambda x: x.interface.isJSImplemented()
|
||||||
elif key == 'isGlobal':
|
elif key == 'isGlobal':
|
||||||
getter = lambda x: x.isGlobal()
|
getter = lambda x: x.isGlobal()
|
||||||
|
elif key == 'isExposedConditionally':
|
||||||
|
getter = lambda x: x.interface.isExposedConditionally()
|
||||||
else:
|
else:
|
||||||
getter = lambda x: getattr(x, key)
|
getter = lambda x: getattr(x, key)
|
||||||
curr = filter(lambda x: getter(x) == val, curr)
|
curr = filter(lambda x: getter(x) == val, curr)
|
||||||
|
|
|
@ -32,6 +32,8 @@ def main():
|
||||||
o = OptionParser(usage=usageString)
|
o = OptionParser(usage=usageString)
|
||||||
o.add_option("--cachedir", dest='cachedir', default=None,
|
o.add_option("--cachedir", dest='cachedir', default=None,
|
||||||
help="Directory in which to cache lex/parse tables.")
|
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()
|
(options, args) = o.parse_args()
|
||||||
|
|
||||||
if len(args) < 2:
|
if len(args) < 2:
|
||||||
|
@ -51,24 +53,30 @@ def main():
|
||||||
parser.parse(''.join(lines), fullPath)
|
parser.parse(''.join(lines), fullPath)
|
||||||
parserResults = parser.finish()
|
parserResults = parser.finish()
|
||||||
|
|
||||||
# Write the parser results out to a pickle.
|
if not options.only_html:
|
||||||
resultsPath = os.path.join(outputdir, 'ParserResults.pkl')
|
# Write the parser results out to a pickle.
|
||||||
with open(resultsPath, 'wb') as resultsFile:
|
resultsPath = os.path.join(outputdir, 'ParserResults.pkl')
|
||||||
cPickle.dump(parserResults, resultsFile, -1)
|
with open(resultsPath, 'wb') as resultsFile:
|
||||||
|
cPickle.dump(parserResults, resultsFile, -1)
|
||||||
|
|
||||||
# Load the configuration.
|
# Load the configuration.
|
||||||
config = Configuration(configFile, parserResults)
|
config = Configuration(configFile, parserResults)
|
||||||
|
|
||||||
to_generate = [
|
to_generate = [
|
||||||
('PrototypeList', 'PrototypeList.rs'),
|
('SupportedDomApis', 'apis.html'),
|
||||||
('RegisterBindings', 'RegisterBindings.rs'),
|
|
||||||
('InterfaceObjectMap', 'InterfaceObjectMap.rs'),
|
|
||||||
('InterfaceTypes', 'InterfaceTypes.rs'),
|
|
||||||
('InheritTypes', 'InheritTypes.rs'),
|
|
||||||
('Bindings', os.path.join('Bindings', 'mod.rs')),
|
|
||||||
('UnionTypes', 'UnionTypes.rs'),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
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:
|
for name, filename in to_generate:
|
||||||
generate_file(config, name, os.path.join(outputdir, filename))
|
generate_file(config, name, os.path.join(outputdir, filename))
|
||||||
|
|
||||||
|
|
6
components/script/dom/bindings/codegen/api.html.template
Normal file
6
components/script/dom/bindings/codegen/api.html.template
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<table id="${interface}">
|
||||||
|
<tr>
|
||||||
|
<th>${interface}</th>
|
||||||
|
</tr>
|
||||||
|
${properties}
|
||||||
|
</table>
|
35
components/script/dom/bindings/codegen/apis.html.template
Normal file
35
components/script/dom/bindings/codegen/apis.html.template
Normal file
|
@ -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>
|
|
@ -0,0 +1 @@
|
||||||
|
<li><a href="#${interface}">${interface}</a></li>
|
|
@ -0,0 +1,3 @@
|
||||||
|
<tr>
|
||||||
|
<td>${name}</td>
|
||||||
|
</tr>
|
|
@ -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
|
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)
|
all: $(AUTOGEN_SRC)
|
||||||
|
|
||||||
$(OUT_DIR)/Bindings/.done:
|
$(OUT_DIR)/Bindings/.done:
|
||||||
|
@ -38,6 +38,16 @@ $(OUT_DIR)/ParserResults.pkl: $(globalgen_dependencies) $(WEBIDLS)
|
||||||
. \
|
. \
|
||||||
$(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) \
|
$(AUTOGEN_SRC): $(OUT_DIR)/Bindings/%Binding.rs: $(bindinggen_dependencies) \
|
||||||
$(addprefix $(WEBIDLS_SRC)/,%.webidl)
|
$(addprefix $(WEBIDLS_SRC)/,%.webidl)
|
||||||
$(PYTHON) \
|
$(PYTHON) \
|
||||||
|
|
|
@ -16,5 +16,7 @@ cp etc/doc.servo.org/* target/doc/
|
||||||
|
|
||||||
python components/style/properties/build.py servo html
|
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
|
ghp-import -n target/doc
|
||||||
git push -qf "https://${TOKEN}@github.com/servo/doc.servo.org.git" gh-pages
|
git push -qf "https://${TOKEN}@github.com/servo/doc.servo.org.git" gh-pages
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue