]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mdhelp: fixes in markdown to C parser
authorJaroslav Kysela <perex@perex.cz>
Mon, 4 Apr 2016 08:47:24 +0000 (10:47 +0200)
committerJaroslav Kysela <perex@perex.cz>
Mon, 4 Apr 2016 08:47:24 +0000 (10:47 +0200)
support/doc/md_to_c.py
support/doc/mistune.py

index 25593b83400a0f0a12c89726b0db1ea0f056710a..f585161ad07061489f4c7ac325ff0b5df49ac981 100755 (executable)
@@ -21,10 +21,7 @@ from mistune import Markdown, Renderer
 HUMAN=False
 DEBUG=False
 
-NOLANG=[
-  '.',
-  ','
-]
+NOLANG_CHARS=" "
 
 def debug(str):
    sys.stderr.write('DEBUG: ' + str + '\n')
@@ -36,18 +33,67 @@ class Object:
 class TVH_C_Renderer(Renderer):
 
   def get_nolang(self, text):
+    if not text:
+      return ''
     if HUMAN:
       return text
     else:
       return '_' + str(len(text)) + ':' + text
     
   def get_lang(self, text):
-    if text in NOLANG:
-      return self.get_nolang(text)
+    if not text:
+      return ''
+
+    n = ''
+    while text and text[0] in NOLANG_CHARS:
+      n += text[0]
+      text = text[1:]
+    e = ''
+    while text and text[-1] in NOLANG_CHARS:
+      e = text[-1] + e
+      text = text[:-1]
+
+    while text.find('  ') >= 0:
+      text = text.replace('  ', ' ')
+
+    if not HUMAN:
+      text = 'x' + str(len(text)) + ':' + text
+    return self.get_nolang(n) + text + self.get_nolang(e)
+
+  def get_human(self, text):
     if HUMAN:
       return text
-    else:
-      return 'x' + str(len(text)) + ':' + text
+    xfound = 0
+    xlink = []
+    d = ''
+    r = ''
+    while text:
+      type = text[0]
+      p = text.find(':')
+      if p <= 0:
+        fatal('wrong text entry: ' + repr(text))
+        break
+      l = int(text[1:p])
+      o = text[:p+1+l]
+      t = text[p+1:p+1+l]
+      text = text[p+l+1:]
+      if not t:
+        continue
+      if xlink:
+        xlink.append(o)
+        if t.find(']') >= 0 and (t.endswith(')') or t.endswith(') ')):
+          d += xfound and self.get_lang(r) or self.get_nolang(r)
+          xfound = 0
+          d += ''.join(xlink)
+          xlink = []
+        continue
+      if type == '_' and t == ('[' or t == '!['):
+        xlink.append(o)
+        continue
+      r += t
+      if type == 'x':
+        xfound = 1
+    return d + (xfound and self.get_lang(r) or self.get_nolang(r))
 
   def get_block(self, text):
     type = text[0]
@@ -67,8 +113,13 @@ class TVH_C_Renderer(Renderer):
       return ''
     if DEBUG: debug('text: ' + repr(text))
     text = text.replace('\n', ' ')
+    text = text.replace('\t', '        ')
     return self.get_lang(text)
 
+  def doescape(self, text):
+    if DEBUG: debug('escape: ' + repr(text))
+    return self.get_nolang(text)
+
   def linebreak(self):
     if DEBUG: debug('linebreak')
     return '\n'
@@ -83,7 +134,7 @@ class TVH_C_Renderer(Renderer):
 
   def paragraph(self, text):
     if DEBUG: debug('paragraph: ' + repr(text))
-    return '\n' + text + '\n'
+    return '\n' + self.get_human(text) + '\n'
 
   def list(self, text, ordered=True):
     r = '\n'
@@ -99,7 +150,7 @@ class TVH_C_Renderer(Renderer):
       text = text[1:]
     if DEBUG: debug('list item: ' + repr(text))
     a = text.split('\n')
-    text = a[0] + '\n'
+    text = self.get_human(a[0]) + '\n'
     for t in a[1:]:
       if t:
         text += self.get_nolang('  ') + t + '\n'
@@ -238,8 +289,8 @@ class TVH_C_Renderer(Renderer):
       if type(v) == type(True):
         v = v and 1 or 0
       v = str(v) and str(v) or ''
-      r += self.get_nolang('f' + str(len(fl) + 1 + len(v)) + ':' + fl + '=') + v
-    return r + self.get_nolang('c' + str(len(content)) + ':') + content
+      r += 'f' + str(len(fl) + 1 + len(v)) + ':' + fl + '=' + v
+    return r + 'c' + str(len(content)) + ':' + content
 
   def footnote_ref(self, key, index):
     return self.get_nolang('[^' + str(index) + ']')
index 399c96d7d812b7832010ae1b758685e8e32781ec..45428e2bf7a3e3a7de374f8fa48841c78e53758a 100755 (executable)
@@ -537,7 +537,7 @@ class InlineLexer(object):
         return output
 
     def output_escape(self, m):
-        return m.group(1)
+        return self.renderer.doescape(m.group(1))
 
     def output_autolink(self, m):
         link = m.group(1)
@@ -785,6 +785,13 @@ class Renderer(object):
         """
         return escape(text)
 
+    def doescape(self, text):
+        """Rendering escape text.
+
+        :param text: text content.
+        """
+        return escape(text)
+
     def autolink(self, link, is_email=False):
         """Rendering a given link or email address.