1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2025-10-24 13:33:01 +03:00

Port doc/examples/index.py to Python 3

- Make sure that examples.xml is generated deterministically
- Sort includes by line number
This commit is contained in:
Nick Wellnhofer
2022-08-18 21:03:56 +02:00
parent 5264fa1100
commit 18d79460ab
2 changed files with 112 additions and 128 deletions

View File

@@ -37,6 +37,7 @@
<p>Includes:</p>
<ul>
<xsl:for-each select="includes/include">
<xsl:sort select="@line" data-type="number"/>
<xsl:apply-templates select='.'/>
</xsl:for-each>
</ul>

View File

@@ -2,12 +2,12 @@
#
# Indexes the examples and build an XML description
#
import string
import glob
import sys
try:
import libxml2
except:
print("libxml2 python bindings not available")
sys.exit(1)
sys.path.insert(0, "..")
from apibuild import CParser, escape
@@ -28,10 +28,10 @@ def load_api():
return
api_dict = {}
try:
print "loading ../libxml2-api.xml"
print("loading ../libxml2-api.xml")
api_doc = libxml2.parseFile("../libxml2-api.xml")
except:
print "failed to parse ../libxml2-api.xml"
print("failed to parse ../libxml2-api.xml")
sys.exit(1)
def find_symbol(name):
@@ -43,19 +43,19 @@ def find_symbol(name):
if name == None:
return
if api_dict.has_key(name):
if name in api_dict:
return api_dict[name]
ctxt = api_doc.xpathNewContext()
res = ctxt.xpathEval("/api/symbols/*[@name = '%s']" % (name))
if type(res) == type([]) and len(res) >= 1:
if len(res) > 1:
print "Found %d references to %s in the API" % (len(res), name)
print("Found %d references to %s in the API" % (len(res), name))
node = res[0]
typ = node.name
file = node.xpathEval("string(@file)")
info = node.xpathEval("string(info)")
else:
print "Reference %s not found in the API" % (name)
print("Reference %s not found in the API" % (name))
return None
ret = (typ, file, info)
api_dict[name] = ret
@@ -63,7 +63,7 @@ def find_symbol(name):
def parse_top_comment(filename, comment):
res = {}
lines = string.split(comment, "\n")
lines = comment.split("\n")
item = None
for line in lines:
while line != "" and (line[0] == ' ' or line[0] == '\t'):
@@ -73,17 +73,17 @@ def parse_top_comment(filename, comment):
while line != "" and (line[0] == ' ' or line[0] == '\t'):
line = line[1:]
try:
(it, line) = string.split(line, ":", 1)
(it, line) = line.split(":", 1)
item = it
while line != "" and (line[0] == ' ' or line[0] == '\t'):
line = line[1:]
if res.has_key(item):
if item in res:
res[item] = res[item] + " " + line
else:
res[item] = line
except:
if item != None:
if res.has_key(item):
if item in res:
res[item] = res[item] + " " + line
else:
res[item] = line
@@ -102,22 +102,22 @@ def parse(filename, output):
synopsis = info['synopsis']
output.write(" <synopsis>%s</synopsis>\n" % escape(synopsis));
except:
print "Example %s lacks a synopsis description" % (filename)
print("Example %s lacks a synopsis description" % (filename))
try:
purpose = info['purpose']
output.write(" <purpose>%s</purpose>\n" % escape(purpose));
except:
print "Example %s lacks a purpose description" % (filename)
print("Example %s lacks a purpose description" % (filename))
try:
usage = info['usage']
output.write(" <usage>%s</usage>\n" % escape(usage));
except:
print "Example %s lacks an usage description" % (filename)
print("Example %s lacks an usage description" % (filename))
try:
test = info['test']
output.write(" <test>%s</test>\n" % escape(test));
progname=filename[0:-2]
command=string.replace(test, progname, './' + progname, 1)
command=test.replace(progname, './' + progname, 1)
tests.append(command)
except:
pass
@@ -125,22 +125,22 @@ def parse(filename, output):
author = info['author']
output.write(" <author>%s</author>\n" % escape(author));
except:
print "Example %s lacks an author description" % (filename)
print("Example %s lacks an author description" % (filename))
try:
copy = info['copy']
output.write(" <copy>%s</copy>\n" % escape(copy));
except:
print "Example %s lacks a copyright description" % (filename)
print("Example %s lacks a copyright description" % (filename))
try:
section = info['section']
output.write(" <section>%s</section>\n" % escape(section));
if sections.has_key(section):
if section in sections:
sections[section].append(filename)
else:
sections[section] = [filename]
except:
print "Example %s lacks a section description" % (filename)
for topic in info.keys():
print("Example %s lacks a section description" % (filename))
for topic in sorted(info.keys()):
if topic != "purpose" and topic != "usage" and \
topic != "author" and topic != "copy" and \
topic != "section" and topic != "synopsis" and topic != "test":
@@ -148,16 +148,19 @@ def parse(filename, output):
output.write(" <extra topic='%s'>%s</extra>\n" % (
escape(topic), escape(str)))
output.write(" <includes>\n")
for include in idx.includes.keys():
for include in sorted(idx.includes.keys()):
if include.find("libxml") != -1:
output.write(" <include>%s</include>\n" % (escape(include)))
id = idx.includes[include]
line = id.get_lineno()
output.write(" <include line='%d'>%s</include>\n" %
(line, escape(include)))
output.write(" </includes>\n")
output.write(" <uses>\n")
for ref in idx.references.keys():
for ref in sorted(idx.references.keys()):
id = idx.references[ref]
name = id.get_name()
line = id.get_lineno()
if symbols.has_key(name):
if name in symbols:
sinfo = symbols[name]
refs = sinfo[0]
# gather at most 5 references per symbols
@@ -187,9 +190,7 @@ def dump_symbols(output):
global symbols
output.write(" <symbols>\n")
keys = symbols.keys()
keys.sort()
for symbol in keys:
for symbol in sorted(symbols.keys()):
output.write(" <symbol name='%s'>\n" % (symbol))
info = symbols[symbol]
i = 1
@@ -203,9 +204,7 @@ def dump_sections(output):
global sections
output.write(" <sections>\n")
keys = sections.keys()
keys.sort()
for section in keys:
for section in sorted(sections.keys()):
output.write(" <section name='%s'>\n" % (section))
info = sections[section]
i = 0
@@ -231,19 +230,19 @@ LDADD = $(top_builddir)/libxml2.la
CLEANFILES = *.tmp
rebuild:
cd $(srcdir) && $(PYTHON) index.py
$(MAKE) Makefile
cd $(srcdir) && xsltproc examples.xsl examples.xml
-cd $(srcdir) && xmllint --valid --noout index.html
\tcd $(srcdir) && $(PYTHON) index.py
\t$(MAKE) Makefile
\tcd $(srcdir) && xsltproc examples.xsl examples.xml
\t-cd $(srcdir) && xmllint --valid --noout index.html
.PHONY: rebuild
install-data-local:
$(MKDIR_P) $(DESTDIR)$(docdir)/examples
-$(INSTALL) -m 0644 $(srcdir)/*.html $(srcdir)/*.c $(DESTDIR)$(docdir)/examples/
\t$(MKDIR_P) $(DESTDIR)$(docdir)/examples
\t-$(INSTALL) -m 0644 $(srcdir)/*.html $(srcdir)/*.c $(DESTDIR)$(docdir)/examples/
clean-local:
test -f Makefile.am || rm -f test?.xml
\ttest -f Makefile.am || rm -f test?.xml
"""
examples.sort()
@@ -272,25 +271,9 @@ clean-local:
old = open("Makefile.am", "r").read()
if old != Makefile:
n = open("Makefile.am", "w").write(Makefile)
print "Updated Makefile.am"
print("Updated Makefile.am")
except:
print "Failed to read or save Makefile.am"
# #
# # Autogenerate the .cvsignore too ... DEPRECATED
# #
# ignore = """.memdump
#Makefile.in
#Makefile
#"""
# for example in examples:
# ignore = ignore + "%s\n" % (example)
# try:
# old = open(".cvsignore", "r").read()
# if old != ignore:
# n = open(".cvsignore", "w").write(ignore)
# print "Updated .cvsignore"
# except:
# print "Failed to read or save .cvsignore"
print("Failed to read or save Makefile.am")
if __name__ == "__main__":
load_api()