[gobject-introspection/wip/docs: 1/4] doctool: Add constants to the namespace



commit ee8442c9b495a28c1df40e459900e5fa27af5790
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Wed Mar 27 18:06:24 2013 -0400

    doctool: Add constants to the namespace
    
    This is an initial test before we port over to docbook to see if we
    can build a new structure for how the pages should act.

 Makefile-giscanner.am                              |    3 +
 giscanner/doctemplates/C/constant.tmpl             |    5 +
 giscanner/doctemplates/Gjs/constant.tmpl           |    5 +
 giscanner/doctemplates/Python/constant.tmpl        |    5 +
 giscanner/doctemplates/namespace.tmpl              |    8 ++
 giscanner/docwriter.py                             |   59 +++++++++++
 tests/scanner/Regress-1.0-C-expected/index.page    |  110 ++++++++++++++++++++
 tests/scanner/Regress-1.0-Gjs-expected/index.page  |  110 ++++++++++++++++++++
 .../scanner/Regress-1.0-Python-expected/index.page |  110 ++++++++++++++++++++
 9 files changed, 415 insertions(+), 0 deletions(-)
---
diff --git a/Makefile-giscanner.am b/Makefile-giscanner.am
index e8def0e..8fd5254 100644
--- a/Makefile-giscanner.am
+++ b/Makefile-giscanner.am
@@ -59,6 +59,7 @@ nobase_dist_template_DATA =           \
        giscanner/doctemplates/class.tmpl       \
        giscanner/doctemplates/namespace.tmpl   \
        giscanner/doctemplates/C/class.tmpl     \
+       giscanner/doctemplates/C/constant.tmpl  \
        giscanner/doctemplates/C/constructor.tmpl       \
        giscanner/doctemplates/C/default.tmpl   \
        giscanner/doctemplates/C/enum.tmpl      \
@@ -70,6 +71,7 @@ nobase_dist_template_DATA =           \
        giscanner/doctemplates/C/signal.tmpl    \
        giscanner/doctemplates/C/vfunc.tmpl     \
        giscanner/doctemplates/Python/class.tmpl        \
+       giscanner/doctemplates/Python/constant.tmpl     \
        giscanner/doctemplates/Python/constructor.tmpl  \
        giscanner/doctemplates/Python/default.tmpl      \
        giscanner/doctemplates/Python/enum.tmpl \
@@ -81,6 +83,7 @@ nobase_dist_template_DATA =           \
        giscanner/doctemplates/Python/signal.tmpl       \
        giscanner/doctemplates/Python/vfunc.tmpl        \
        giscanner/doctemplates/Gjs/class.tmpl   \
+       giscanner/doctemplates/Gjs/constant.tmpl        \
        giscanner/doctemplates/Gjs/constructor.tmpl     \
        giscanner/doctemplates/Gjs/default.tmpl \
        giscanner/doctemplates/Gjs/enum.tmpl    \
diff --git a/giscanner/doctemplates/C/constant.tmpl b/giscanner/doctemplates/C/constant.tmpl
new file mode 100644
index 0000000..2401cee
--- /dev/null
+++ b/giscanner/doctemplates/C/constant.tmpl
@@ -0,0 +1,5 @@
+<%page args="constant"/>
+<item>
+  <title><code>#define ${constant.ctype} ${formatter.format_value(constant.value)}</code></title>
+  ${formatter.format(constant, constant.doc)}
+</item>
diff --git a/giscanner/doctemplates/Gjs/constant.tmpl b/giscanner/doctemplates/Gjs/constant.tmpl
new file mode 100644
index 0000000..bada58c
--- /dev/null
+++ b/giscanner/doctemplates/Gjs/constant.tmpl
@@ -0,0 +1,5 @@
+<%page args="constant"/>
+<item>
+  <title><code>${constant.parent.name}.${constant.name} = 
${formatter.format_value(constant.value)};</code></title>
+  ${formatter.format(constant, constant.doc)}
+</item>
diff --git a/giscanner/doctemplates/Python/constant.tmpl b/giscanner/doctemplates/Python/constant.tmpl
new file mode 100644
index 0000000..96e5539
--- /dev/null
+++ b/giscanner/doctemplates/Python/constant.tmpl
@@ -0,0 +1,5 @@
+<%page args="constant"/>
+<item>
+  <title><code>${constant.parent.name}.${constant.name} = 
${formatter.format_value(constant.value)}</code></title>
+  ${formatter.format(constant, constant.doc)}
+</item>
diff --git a/giscanner/doctemplates/namespace.tmpl b/giscanner/doctemplates/namespace.tmpl
index bb58bb1..2c27ee4 100644
--- a/giscanner/doctemplates/namespace.tmpl
+++ b/giscanner/doctemplates/namespace.tmpl
@@ -15,5 +15,13 @@
     <title>Other</title>
   </links>
 </%block>
+<%block name="details">
+<terms>
+% for constant in formatter.collect('constant'):
+<%include file="${language}/constant.tmpl" args="constant=constant"/>
+% endfor
+</terms>
+</%block>
+
 <%block name="since_version">
 </%block>
diff --git a/giscanner/docwriter.py b/giscanner/docwriter.py
index 3279f51..dea6e61 100644
--- a/giscanner/docwriter.py
+++ b/giscanner/docwriter.py
@@ -21,6 +21,8 @@
 # 02110-1301, USA.
 #
 
+import itertools
+import json
 import os
 import re
 import tempfile
@@ -165,11 +167,19 @@ class DocFormatter(object):
         return saxutils.escape(text)
 
     def should_render_node(self, node):
+        # Handled inline
         if isinstance(node, ast.Constant):
             return False
 
         return True
 
+    def collect(self, type_name):
+        namespace = self._transformer.namespace
+        type_ = {'constant': ast.Constant}[type_name]
+        for item in namespace.itervalues():
+            if isinstance(item, type_):
+                yield item
+
     def format(self, node, doc):
         if doc is None:
             return ''
@@ -301,6 +311,9 @@ class DocFormatter(object):
         else:
             return parameter.argname
 
+    def format_value(self, value):
+        raise NotImplementedError
+
     def format_function_name(self, func):
         raise NotImplementedError
 
@@ -368,6 +381,45 @@ class DocFormatterC(DocFormatter):
         "NULL": "NULL",
     }
 
+    def _c_escape_dictionary():
+        escapes = {
+            '\\': '\\\\',
+            '"': '\\"',
+            '\b': '\\b',
+            '\f': '\\f',
+            '\n': '\\n',
+            '\r': '\\r',
+            '\t': '\\t',
+            }
+        for i in itertools.chain(xrange(0, 0x20), xrange(0x80, 0x100)):
+            escapes[chr(i)] = '\\x%x' % (i, )
+        return escapes
+
+    def format_value(self, value, escapes=_c_escape_dictionary()):
+        def format_bytes(v):
+            return '"' + ''.join(escapes.get(c, c) for c in v) + '"'
+
+        def format_unicode(v):
+            # Assume UTF8 encoding
+            return format_bytes(v.encode('utf8'))
+
+        def format_integer(v):
+            return "%d" % (v, )
+
+        def format_float(v):
+            return "%g" % (v, )
+
+        if isinstance(value, str):
+            return format_bytes(value)
+        if isinstance(value, unicode):
+            return format_unicode(value)
+        elif isinstance(value, (int, long)):
+            return format_integer(value)
+        elif isinstance(value, float):
+            return format_float(value)
+        else:
+            raise NotImplementedError(type(value))
+
     def format_type(self, type_):
         if isinstance(type_, ast.Array):
             return self.format_type(type_.element_type) + '*'
@@ -423,6 +475,9 @@ class DocFormatterPython(DocFormatterIntrospectableBase):
 
         return False
 
+    def format_value(self, value):
+        return "%r" % (value, )
+
     def format_parameter_name(self, node, parameter):
         # Force "self" for the first parameter of a method
         if self.is_method(node) and parameter is node.instance_parameter:
@@ -495,6 +550,9 @@ class DocFormatterGjs(DocFormatterIntrospectableBase):
 
         return False
 
+    def format_value(self, value):
+        return json.dumps(value)
+
     def format_fundamental_type(self, name):
         fundamental_types = {
             "utf8": "String",
@@ -625,6 +683,7 @@ class DocWriter(object):
 
         template = self._lookup.get_template(template_name)
         result = template.render(namespace=namespace,
+                                 language=self._language,
                                  node=node,
                                  page_id=page_id,
                                  page_kind=page_kind,
diff --git a/tests/scanner/Regress-1.0-C-expected/index.page b/tests/scanner/Regress-1.0-C-expected/index.page
index a5426d8..5581d1a 100644
--- a/tests/scanner/Regress-1.0-C-expected/index.page
+++ b/tests/scanner/Regress-1.0-C-expected/index.page
@@ -17,7 +17,117 @@
   
 
   
+<terms>
+
+<item>
+  <title><code>#define REGRESS_ANNOTATION_CALCULATED_DEFINE "100"</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>#define REGRESS_ANNOTATION_CALCULATED_LARGE "10000000000UL"</code></title>
+  <p>Constant to define a calculated large value</p>
+</item>
+
+
+<item>
+  <title><code>#define REGRESS_ANNOTATION_CALCULATED_LARGE_DIV "1000000UL"</code></title>
+  <p>Constant to define a calculated large value</p>
+</item>
+
+
+<item>
+  <title><code>#define REGRESS_DOUBLE_CONSTANT "44.220000"</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>#define REGRESS_FOO_DEFINE_SHOULD_BE_EXPOSED "should be exposed"</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>#define REGRESS_FOO_PIE_IS_TASTY "3.141590"</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>#define REGRESS_FOO_SUCCESS_INT "4408"</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>#define REGRESS_GUINT64_CONSTANT "18446744073709551615"</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>#define REGRESS_GUINT64_CONSTANTA "18446744073709551615"</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>#define REGRESS_G_GINT64_CONSTANT "1000"</code></title>
   
+</item>
+
+
+<item>
+  <title><code>#define REGRESS_INT_CONSTANT "4422"</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>#define REGRESS_LONG_STRING_CONSTANT 
"TYPE,VALUE,ENCODING,CHARSET,LANGUAGE,DOM,INTL,POSTAL,PARCEL,HOME,WORK,PREF,VOICE,FAX,MSG,CELL,PAGER,BBS,MODEM,CAR,ISDN,VIDEO,AOL,APPLELINK,ATTMAIL,CIS,EWORLD,INTERNET,IBMMAIL,MCIMAIL,POWERSHARE,PRODIGY,TLX,X400,GIF,CGM,WMF,BMP,MET,PMB,DIB,PICT,TIFF,PDF,PS,JPEG,QTIME,MPEG,MPEG2,AVI,WAVE,AIFF,PCM,X509,PGP"</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>#define REGRESS_MAXUINT64 "18446744073709551615"</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>#define REGRESS_MININT64 "-9223372036854775808"</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>#define REGRESS_Mixed_Case_Constant "4423"</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>#define REGRESS_NEGATIVE_INT_CONSTANT "-42"</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>#define REGRESS_STRING_CONSTANT "Some String"</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>#define REGRESS_UTF8_CONSTANT "const \xe2\x99\xa5 utf8"</code></title>
+  
+</item>
+
+</terms>
+
   
   <links type="topic" ui:expanded="true" groups="class" style="linklist">
     <title>Classes</title>
diff --git a/tests/scanner/Regress-1.0-Gjs-expected/index.page 
b/tests/scanner/Regress-1.0-Gjs-expected/index.page
index a5426d8..b704d8b 100644
--- a/tests/scanner/Regress-1.0-Gjs-expected/index.page
+++ b/tests/scanner/Regress-1.0-Gjs-expected/index.page
@@ -17,7 +17,117 @@
   
 
   
+<terms>
+
+<item>
+  <title><code>Regress.ANNOTATION_CALCULATED_DEFINE = "100";</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.ANNOTATION_CALCULATED_LARGE = "10000000000UL";</code></title>
+  <p>Constant to define a calculated large value</p>
+</item>
+
+
+<item>
+  <title><code>Regress.ANNOTATION_CALCULATED_LARGE_DIV = "1000000UL";</code></title>
+  <p>Constant to define a calculated large value</p>
+</item>
+
+
+<item>
+  <title><code>Regress.DOUBLE_CONSTANT = "44.220000";</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.FOO_DEFINE_SHOULD_BE_EXPOSED = "should be exposed";</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.FOO_PIE_IS_TASTY = "3.141590";</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.FOO_SUCCESS_INT = "4408";</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.GUINT64_CONSTANT = "18446744073709551615";</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.GUINT64_CONSTANTA = "18446744073709551615";</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.G_GINT64_CONSTANT = "1000";</code></title>
   
+</item>
+
+
+<item>
+  <title><code>Regress.INT_CONSTANT = "4422";</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.LONG_STRING_CONSTANT = 
"TYPE,VALUE,ENCODING,CHARSET,LANGUAGE,DOM,INTL,POSTAL,PARCEL,HOME,WORK,PREF,VOICE,FAX,MSG,CELL,PAGER,BBS,MODEM,CAR,ISDN,VIDEO,AOL,APPLELINK,ATTMAIL,CIS,EWORLD,INTERNET,IBMMAIL,MCIMAIL,POWERSHARE,PRODIGY,TLX,X400,GIF,CGM,WMF,BMP,MET,PMB,DIB,PICT,TIFF,PDF,PS,JPEG,QTIME,MPEG,MPEG2,AVI,WAVE,AIFF,PCM,X509,PGP";</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.MAXUINT64 = "18446744073709551615";</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.MININT64 = "-9223372036854775808";</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.Mixed_Case_Constant = "4423";</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.NEGATIVE_INT_CONSTANT = "-42";</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.STRING_CONSTANT = "Some String";</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.UTF8_CONSTANT = "const \u2665 utf8";</code></title>
+  
+</item>
+
+</terms>
+
   
   <links type="topic" ui:expanded="true" groups="class" style="linklist">
     <title>Classes</title>
diff --git a/tests/scanner/Regress-1.0-Python-expected/index.page 
b/tests/scanner/Regress-1.0-Python-expected/index.page
index a5426d8..bec1c57 100644
--- a/tests/scanner/Regress-1.0-Python-expected/index.page
+++ b/tests/scanner/Regress-1.0-Python-expected/index.page
@@ -17,7 +17,117 @@
   
 
   
+<terms>
+
+<item>
+  <title><code>Regress.ANNOTATION_CALCULATED_DEFINE = '100'</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.ANNOTATION_CALCULATED_LARGE = '10000000000UL'</code></title>
+  <p>Constant to define a calculated large value</p>
+</item>
+
+
+<item>
+  <title><code>Regress.ANNOTATION_CALCULATED_LARGE_DIV = '1000000UL'</code></title>
+  <p>Constant to define a calculated large value</p>
+</item>
+
+
+<item>
+  <title><code>Regress.DOUBLE_CONSTANT = '44.220000'</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.FOO_DEFINE_SHOULD_BE_EXPOSED = 'should be exposed'</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.FOO_PIE_IS_TASTY = '3.141590'</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.FOO_SUCCESS_INT = '4408'</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.GUINT64_CONSTANT = '18446744073709551615'</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.GUINT64_CONSTANTA = '18446744073709551615'</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.G_GINT64_CONSTANT = '1000'</code></title>
   
+</item>
+
+
+<item>
+  <title><code>Regress.INT_CONSTANT = '4422'</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.LONG_STRING_CONSTANT = 
'TYPE,VALUE,ENCODING,CHARSET,LANGUAGE,DOM,INTL,POSTAL,PARCEL,HOME,WORK,PREF,VOICE,FAX,MSG,CELL,PAGER,BBS,MODEM,CAR,ISDN,VIDEO,AOL,APPLELINK,ATTMAIL,CIS,EWORLD,INTERNET,IBMMAIL,MCIMAIL,POWERSHARE,PRODIGY,TLX,X400,GIF,CGM,WMF,BMP,MET,PMB,DIB,PICT,TIFF,PDF,PS,JPEG,QTIME,MPEG,MPEG2,AVI,WAVE,AIFF,PCM,X509,PGP'</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.MAXUINT64 = '18446744073709551615'</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.MININT64 = '-9223372036854775808'</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.Mixed_Case_Constant = '4423'</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.NEGATIVE_INT_CONSTANT = '-42'</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.STRING_CONSTANT = 'Some String'</code></title>
+  
+</item>
+
+
+<item>
+  <title><code>Regress.UTF8_CONSTANT = u'const \u2665 utf8'</code></title>
+  
+</item>
+
+</terms>
+
   
   <links type="topic" ui:expanded="true" groups="class" style="linklist">
     <title>Classes</title>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]