blob: b47e29a7a3f7362dd13e1056fcb18caf897a535f [file] [log] [blame]
#!/usr/bin/env python
# Copyright (C) 2013 Igalia S.L.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301 USA
import os
import re
import sys
class WebKitDOMDocGenerator:
DELETED_CLASSES = ["WebKitDOMBarInfo", "WebKitDOMHTMLPropertiesCollection", "WebKitDOMMemoryInfo", "WebKitDOMMicroDataItemValue", "WebKitDOMPropertyNodeList" ]
def write_header(self):
pass
def write_section(self, symbol_file):
raise NotImplementedError
def write_deleted_classes(self):
raise NotImplementedError
def write_footer(self):
pass
class WebKitDOMDocGeneratorDocs(WebKitDOMDocGenerator):
def write_header(self):
sys.stdout.write('''<?xml version="1.0"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
<!ENTITY version SYSTEM "version.xml">
]>
<book id="index" xmlns:xi="http://www.w3.org/2003/XInclude">
<bookinfo>
<title>WebKitDOMGTK+ Reference Manual</title>
<releaseinfo>for WebKitDOMGTK+ &version;</releaseinfo>
</bookinfo>
<chapter>
<title>Class Overview</title>
''')
def write_section(self, symbol_file):
basename = os.path.basename(symbol_file)
sys.stdout.write(' <xi:include href="xml/%s"/>\n' % basename.replace(".symbols", ".xml"))
def write_deleted_classes(self):
for class_name in self.DELETED_CLASSES:
sys.stdout.write(' <xi:include href="xml/%s.xml"/>\n' % class_name)
def write_footer(self):
sys.stdout.write(''' </chapter>
<index id="index-all">
<title>Index</title>
<xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
</index>
<index id="api-index-deprecated" role="deprecated">
<title>Index of deprecated symbols</title>
<xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
</index>
<xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
</book>
''')
class WebKitDOMDocGeneratorSections(WebKitDOMDocGenerator):
def __init__(self, deprecated_symbol_file):
self._first_decamelize_re = re.compile('(.)([A-Z][a-z]+)')
self._second_decamelize_re = re.compile('([a-z0-9])([A-Z])')
self._dom_class_re = re.compile('(^WebKitDOM)(.+)$')
self._function_re = re.compile('^.+ (.+)\((.+)\)$')
self._deprecated_symbols = self._deprecated_symbols(deprecated_symbol_file)
def _dom_class(self, class_name):
return self._dom_class_re.sub(r'\2', class_name)
def _dom_class_decamelize(self, class_name):
s1 = self._first_decamelize_re.sub(r'\1_\2', self._dom_class(class_name))
retval = self._second_decamelize_re.sub(r'\1_\2', s1)
# Fix some exceptions.
retval = retval.replace('Web_Kit', 'WebKit')
retval = retval.replace('X_Path', 'XPath')
retval = retval.replace('HTMLI_Frame', 'HTML_IFrame')
return retval
def _deleted_class(self, function):
for deleted_class in self.DELETED_CLASSES:
decamelized = 'webkit_dom_%s' % self._dom_class_decamelize(deleted_class).lower()
if function.startswith(decamelized):
return deleted_class
return None
def _deprecated_symbols(self, symbol_file):
retval = {}
f = open(symbol_file, 'r')
for line in f.readlines():
match = self._function_re.match(line)
if not match:
continue
function = match.group(1)
args = match.group(2).split(', ')
class_name = args[0].strip('*')
if class_name == 'void':
class_name = self._deleted_class(function)
retval.setdefault(class_name, []).append(function)
return retval
def _symbol_list(self, symbol_file):
retval = []
f = open(symbol_file, 'r')
for line in f.readlines():
match = self._function_re.match(line)
if not match or match.group(1).endswith('get_type'):
continue
retval.append(match.group(1))
return retval
def write_section(self, symbol_file):
class_name = os.path.basename(symbol_file).replace(".symbols", "")
is_custom = class_name == 'WebKitDOMCustom'
is_interface = class_name == 'WebKitDOMEventTarget'
is_object = class_name == 'WebKitDOMObject'
sys.stdout.write('<SECTION>\n')
sys.stdout.write('<FILE>%s</FILE>\n<TITLE>%s</TITLE>\n' % (class_name, class_name))
if not is_custom:
sys.stdout.write('%s\n' % class_name)
sys.stdout.write('\n')
sys.stdout.write('\n'.join(self._symbol_list(symbol_file)) + '\n')
try:
deprecated_functions = self._deprecated_symbols[class_name]
sys.stdout.write('\n'.join(deprecated_functions) + '\n')
except KeyError:
pass
if not is_custom:
sys.stdout.write('\n<SUBSECTION Standard>\n')
sys.stdout.write('%sClass\n' % class_name)
dom_class = self._dom_class_decamelize(class_name).upper()
sys.stdout.write('WEBKIT_TYPE_DOM_%s\n' % dom_class)
sys.stdout.write('WEBKIT_DOM_%s\n' % dom_class)
if is_object:
sys.stdout.write('WEBKIT_IS_DOM_%s\n' % dom_class)
else:
sys.stdout.write('WEBKIT_DOM_IS_%s\n' % dom_class)
sys.stdout.write('WEBKIT_DOM_%s_CLASS\n' % dom_class)
if is_interface:
sys.stdout.write('WEBKIT_DOM_%s_GET_IFACE\n' % dom_class)
else:
if is_object:
sys.stdout.write('WEBKIT_IS_DOM_%s_CLASS\n' % dom_class)
else:
sys.stdout.write('WEBKIT_DOM_IS_%s_CLASS\n' % dom_class)
sys.stdout.write('WEBKIT_DOM_%s_GET_CLASS\n' % dom_class)
sys.stdout.write('\n<SUBSECTION Private>\n')
if is_object:
sys.stdout.write('%sPrivate\n' % class_name)
sys.stdout.write('webkit_dom_%s_get_type\n' % dom_class.lower())
sys.stdout.write('</SECTION>\n\n')
def write_deleted_classes(self):
for class_name in self.DELETED_CLASSES:
sys.stdout.write('<SECTION>\n')
sys.stdout.write('<FILE>%s</FILE>\n<TITLE>%s</TITLE>\n' % (class_name, class_name))
sys.stdout.write('\n'.join([name for name in self._deprecated_symbols[class_name] if not name.endswith('get_type')]) + '\n')
sys.stdout.write('\n<SUBSECTION Private>\n')
sys.stdout.write('webkit_dom_%s_get_type\n' % self._dom_class_decamelize(class_name).lower())
sys.stdout.write('</SECTION>\n\n')
symbol_files = sys.stdin.read().strip('\n').split(' ')
if 'docs' in sys.argv[1:]:
generator = WebKitDOMDocGeneratorDocs()
elif 'sections' in sys.argv[1:]:
deprecated_symbol_file = None
for symbol_file in symbol_files:
if 'WebKitDOMDeprecated' in symbol_file:
deprecated_symbol_file = symbol_file
break
generator = WebKitDOMDocGeneratorSections(deprecated_symbol_file)
generator.write_header()
for symbol_file in symbol_files:
if 'WebKitDOMDeprecated' in symbol_file:
continue
generator.write_section(symbol_file)
generator.write_deleted_classes()
generator.write_footer()