Edit

kc3-lang/brotli/tools/rfc-format.py

Branch :

  • Show log

    Commit

  • Author : Zoltan Szabadka
    Date : 2015-04-07 16:58:07
    Hash : 707b78ae
    Message : Add the current version of the brotli specification. Add the .nroff source file and a python script to generate the .txt version (requires the nroff command).

  • tools/rfc-format.py
  • #!/usr/bin/python
    #
    # Takes an .nroff source file and prints a text file in RFC format.
    #
    # Usage: rfc-format.py <source file>
    
    import re
    import sys
    from subprocess import Popen, PIPE
    
    
    def Readfile(fn):
      f = open(fn, "r")
      return f.read()
    
    
    def FixNroffOutput(buf):
      p = re.compile(r'(.*)FORMFEED(\[Page\s+\d+\])$')
      strip_empty = False
      out = ""
      for line in buf.split("\n"):
        line = line.replace("\xe2\x80\x99", "'")
        line = line.replace("\xe2\x80\x90", "-")
        for i in range(len(line)):
          if ord(line[i]) > 128:
            print >>sys.stderr, "Invalid character %d\n" % ord(line[i])
        m = p.search(line)
        if strip_empty and len(line) == 0:
          continue
        if m:
         out += p.sub(r'\1        \2\n\f', line)
         out += "\n"
         strip_empty = True
        else:
          out += "%s\n" % line
          strip_empty = False
      return out.rstrip("\n")
    
    
    def Nroff(buf):
      p = Popen(["nroff", "-ms"], stdin=PIPE, stdout=PIPE)
      out, err = p.communicate(input=buf)
      return FixNroffOutput(out)
    
    
    def FormatTocLine(section, title, page):
      line = ""
      level = 1
      if section:
        level = section.count(".")
      for i in range(level):
        line += "   "
      if section:
        line += "%s  " % section
      line += "%s " % title
      pagenum = "%d" % page
      nspace = 72 - len(line) - len(pagenum)
      if nspace % 2:
        line += " "
      for i in range(nspace / 2):
        line += ". "
      line += "%d\n" % page
      return line
    
    
    def CreateToc(buf):
      p1 = re.compile(r'^((\d+\.)+)\s+(.*)$')
      p2 = re.compile(r'^(Appendix [A-Z].)\s+(.*)$')
      p3 = re.compile(r'\[Page (\d+)\]$')
      found = 0
      page = 1
      out = ""
      for line in buf.split("\n"):
        m1 = p1.search(line)
        m2 = p2.search(line)
        m3 = p3.search(line)
        if m1:
          out += FormatTocLine(m1.group(1), m1.group(3), page)
        elif m2:
          out += FormatTocLine(m2.group(1), m2.group(2), page)
        elif line.startswith("Authors"):
          out += FormatTocLine(None, line, page)
        elif m3:
          page = int(m3.group(1)) + 1
      return out
    
    
    src = Readfile(sys.argv[1])
    out = Nroff(src)
    toc = CreateToc(out)
    src = src.replace("INSERT_TOC_HERE", toc)
    print Nroff(src)