[libxml2/2.10: 4/11] Port doc/examples/index.py to Python 3




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]