[libxml2/2.10: 4/11] Port doc/examples/index.py to Python 3
- From: Nick Wellnhofer <nwellnhof src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libxml2/2.10: 4/11] Port doc/examples/index.py to Python 3
- Date: Thu, 25 Aug 2022 11:31:55 +0000 (UTC)
commit 292167309f494a3631a8c3055001e35db5ddda6f
Author: Nick Wellnhofer <wellnhofer aevum de>
Date: Thu Aug 18 21:03:56 2022 +0200
Port doc/examples/index.py to Python 3
- Make sure that examples.xml is generated deterministically
- Sort includes by line number
doc/examples/examples.xsl | 1 +
doc/examples/index.py | 239 +++++++++++++++++++++-------------------------
2 files changed, 112 insertions(+), 128 deletions(-)
---
diff --git a/doc/examples/examples.xsl b/doc/examples/examples.xsl
index b3da2eaf..c515408d 100644
--- a/doc/examples/examples.xsl
+++ b/doc/examples/examples.xsl
@@ -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>
diff --git a/doc/examples/index.py b/doc/examples/index.py
index 9cc2db44..8ce8d12d 100755
--- a/doc/examples/index.py
+++ b/doc/examples/index.py
@@ -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,11 +28,11 @@ 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"
- sys.exit(1)
+ print("failed to parse ../libxml2-api.xml")
+ sys.exit(1)
def find_symbol(name):
global api_dict
@@ -43,50 +43,50 @@ 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)
- node = res[0]
- typ = node.name
- file = node.xpathEval("string(@file)")
- info = node.xpathEval("string(info)")
+ 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)
- return None
+ print("Reference %s not found in the API" % (name))
+ return None
ret = (typ, file, info)
api_dict[name] = ret
return ret
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'):
- line = line[1:]
+ line = line[1:]
while line != "" and line[0] == '*':
- line = line[1:]
+ line = line[1:]
while line != "" and (line[0] == ' ' or line[0] == '\t'):
- line = line[1:]
- try:
- (it, line) = string.split(line, ":", 1)
- item = it
- while line != "" and (line[0] == ' ' or line[0] == '\t'):
- line = line[1:]
- if res.has_key(item):
- res[item] = res[item] + " " + line
- else:
- res[item] = line
- except:
- if item != None:
- if res.has_key(item):
- res[item] = res[item] + " " + line
- else:
- res[item] = line
+ line = line[1:]
+ try:
+ (it, line) = line.split(":", 1)
+ item = it
+ while line != "" and (line[0] == ' ' or line[0] == '\t'):
+ line = line[1:]
+ if item in res:
+ res[item] = res[item] + " " + line
+ else:
+ res[item] = line
+ except:
+ if item != None:
+ if item in res:
+ res[item] = res[item] + " " + line
+ else:
+ res[item] = line
return res
def parse(filename, output):
@@ -100,83 +100,86 @@ def parse(filename, output):
output.write(" <example filename='%s'>\n" % filename)
try:
synopsis = info['synopsis']
- output.write(" <synopsis>%s</synopsis>\n" % escape(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));
+ 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));
+ 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)
- tests.append(command)
+ output.write(" <test>%s</test>\n" % escape(test));
+ progname=filename[0:-2]
+ command=test.replace(progname, './' + progname, 1)
+ tests.append(command)
except:
pass
try:
author = info['author']
- output.write(" <author>%s</author>\n" % escape(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));
+ 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):
- sections[section].append(filename)
- else:
- sections[section] = [filename]
+ output.write(" <section>%s</section>\n" % escape(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":
- str = info[topic]
- output.write(" <extra topic='%s'>%s</extra>\n" % (
- escape(topic), escape(str)))
+ topic != "author" and topic != "copy" and \
+ topic != "section" and topic != "synopsis" and topic != "test":
+ str = info[topic]
+ 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):
- sinfo = symbols[name]
- refs = sinfo[0]
- # gather at most 5 references per symbols
- if refs > 5:
- continue
- sinfo.append(filename)
- sinfo[0] = refs + 1
- else:
- symbols[name] = [1, filename]
- info = find_symbol(name)
- if info != None:
- type = info[0]
- file = info[1]
- output.write(" <%s line='%d' file='%s' name='%s'/>\n" % (type,
- line, file, name))
- else:
- type = id.get_type()
- output.write(" <%s line='%d' name='%s'/>\n" % (type,
- line, name))
+ name = id.get_name()
+ line = id.get_lineno()
+ if name in symbols:
+ sinfo = symbols[name]
+ refs = sinfo[0]
+ # gather at most 5 references per symbols
+ if refs > 5:
+ continue
+ sinfo.append(filename)
+ sinfo[0] = refs + 1
+ else:
+ symbols[name] = [1, filename]
+ info = find_symbol(name)
+ if info != None:
+ type = info[0]
+ file = info[1]
+ output.write(" <%s line='%d' file='%s' name='%s'/>\n" % (type,
+ line, file, name))
+ else:
+ type = id.get_type()
+ output.write(" <%s line='%d' name='%s'/>\n" % (type,
+ line, name))
output.write(" </uses>\n")
output.write(" </example>\n")
@@ -187,15 +190,13 @@ 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
- while i < len(info):
- output.write(" <ref filename='%s'/>\n" % (info[i]))
- i = i + 1
+ info = symbols[symbol]
+ i = 1
+ while i < len(info):
+ output.write(" <ref filename='%s'/>\n" % (info[i]))
+ i = i + 1
output.write(" </symbol>\n")
output.write(" </symbols>\n")
@@ -203,15 +204,13 @@ 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
- while i < len(info):
- output.write(" <example filename='%s'/>\n" % (info[i]))
- i = i + 1
+ info = sections[section]
+ i = 0
+ while i < len(info):
+ output.write(" <example filename='%s'/>\n" % (info[i]))
+ i = i + 1
output.write(" </section>\n")
output.write(" </sections>\n")
@@ -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()
@@ -269,28 +268,12 @@ clean-local:
Makefile = Makefile + '\t@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0\n'
Makefile = Makefile + "\t@rm *.tmp\n"
try:
- old = open("Makefile.am", "r").read()
- if old != Makefile:
- n = open("Makefile.am", "w").write(Makefile)
- print "Updated Makefile.am"
+ old = open("Makefile.am", "r").read()
+ if old != Makefile:
+ n = open("Makefile.am", "w").write(Makefile)
+ 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()
@@ -298,8 +281,8 @@ if __name__ == "__main__":
output.write("<examples>\n")
for file in sorted(glob.glob('*.c')):
- parse(file, output)
- examples.append(file[:-2])
+ parse(file, output)
+ examples.append(file[:-2])
dump_symbols(output)
dump_sections(output)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]