i18n/hggettext
changeset 38855 617ae7e33a65
parent 36954 0585337ea787
child 43731 47ef023d0165
equal deleted inserted replaced
38854:96b2e66dfa74 38855:617ae7e33a65
    61             'msgid %s\n' % normalize(s) +
    61             'msgid %s\n' % normalize(s) +
    62             'msgstr ""\n')
    62             'msgstr ""\n')
    63 
    63 
    64 doctestre = re.compile(r'^ +>>> ', re.MULTILINE)
    64 doctestre = re.compile(r'^ +>>> ', re.MULTILINE)
    65 
    65 
    66 def offset(src, doc, name, default):
    66 def offset(src, doc, name, lineno, default):
    67     """Compute offset or issue a warning on stdout."""
    67     """Compute offset or issue a warning on stdout."""
    68     # remove doctest part, in order to avoid backslash mismatching
    68     # remove doctest part, in order to avoid backslash mismatching
    69     m = doctestre.search(doc)
    69     m = doctestre.search(doc)
    70     if m:
    70     if m:
    71         doc = doc[:m.start()]
    71         doc = doc[:m.start()]
    74     end = src.find(doc.replace('\\', '\\\\'))
    74     end = src.find(doc.replace('\\', '\\\\'))
    75     if end == -1:
    75     if end == -1:
    76         # This can happen if the docstring contains unnecessary escape
    76         # This can happen if the docstring contains unnecessary escape
    77         # sequences such as \" in a triple-quoted string. The problem
    77         # sequences such as \" in a triple-quoted string. The problem
    78         # is that \" is turned into " and so doc wont appear in src.
    78         # is that \" is turned into " and so doc wont appear in src.
    79         sys.stderr.write("warning: unknown offset in %s, assuming %d lines\n"
    79         sys.stderr.write("%s:%d:warning:"
    80                          % (name, default))
    80                          " unknown docstr offset, assuming %d lines\n"
       
    81                          % (name, lineno, default))
    81         return default
    82         return default
    82     else:
    83     else:
    83         return src.count('\n', 0, end)
    84         return src.count('\n', 0, end)
    84 
    85 
    85 
    86 
   104     """
   105     """
   105     mod = importpath(path)
   106     mod = importpath(path)
   106     if not path.startswith('mercurial/') and mod.__doc__:
   107     if not path.startswith('mercurial/') and mod.__doc__:
   107         with open(path) as fobj:
   108         with open(path) as fobj:
   108             src = fobj.read()
   109             src = fobj.read()
   109         lineno = 1 + offset(src, mod.__doc__, path, 7)
   110         lineno = 1 + offset(src, mod.__doc__, path, 1, 7)
   110         print(poentry(path, lineno, mod.__doc__))
   111         print(poentry(path, lineno, mod.__doc__))
   111 
   112 
   112     functions = list(getattr(mod, 'i18nfunctions', []))
   113     functions = list(getattr(mod, 'i18nfunctions', []))
   113     functions = [(f, True) for f in functions]
   114     functions = [(f, True) for f in functions]
   114 
   115 
   127             if funcmod.__package__ == funcmod.__name__:
   128             if funcmod.__package__ == funcmod.__name__:
   128                 extra = '/__init__'
   129                 extra = '/__init__'
   129             actualpath = '%s%s.py' % (funcmod.__name__.replace('.', '/'), extra)
   130             actualpath = '%s%s.py' % (funcmod.__name__.replace('.', '/'), extra)
   130 
   131 
   131             src = inspect.getsource(func)
   132             src = inspect.getsource(func)
   132             name = "%s.%s" % (actualpath, func.__name__)
       
   133             lineno = inspect.getsourcelines(func)[1]
   133             lineno = inspect.getsourcelines(func)[1]
   134             doc = docobj.__doc__
   134             doc = docobj.__doc__
   135             origdoc = getattr(docobj, '_origdoc', '')
   135             origdoc = getattr(docobj, '_origdoc', '')
   136             if rstrip:
   136             if rstrip:
   137                 doc = doc.rstrip()
   137                 doc = doc.rstrip()
   138                 origdoc = origdoc.rstrip()
   138                 origdoc = origdoc.rstrip()
   139             if origdoc:
   139             if origdoc:
   140                 lineno += offset(src, origdoc, name, 1)
   140                 lineno += offset(src, origdoc, actualpath, lineno, 1)
   141             else:
   141             else:
   142                 lineno += offset(src, doc, name, 1)
   142                 lineno += offset(src, doc, actualpath, lineno, 1)
   143             print(poentry(actualpath, lineno, doc))
   143             print(poentry(actualpath, lineno, doc))
   144 
   144 
   145 
   145 
   146 def rawtext(path):
   146 def rawtext(path):
   147     with open(path) as f:
   147     with open(path) as f: