diff options
-rw-r--r-- | grc/src/platforms/python/utils/extract_docs.py | 53 | ||||
-rw-r--r-- | grc/todo.txt | 1 |
2 files changed, 16 insertions, 38 deletions
diff --git a/grc/src/platforms/python/utils/extract_docs.py b/grc/src/platforms/python/utils/extract_docs.py index ac0fe59b4..c7d42b4ab 100644 --- a/grc/src/platforms/python/utils/extract_docs.py +++ b/grc/src/platforms/python/utils/extract_docs.py @@ -20,12 +20,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA from .. Constants import DOCS_DIR from lxml import etree import os +import re DOXYGEN_NAME_XPATH = '/doxygen/compounddef/compoundname' DOXYGEN_BRIEFDESC_GR_XPATH = '/doxygen/compounddef/briefdescription' DOXYGEN_DETAILDESC_GR_XPATH = '/doxygen/compounddef/detaileddescription' -DOXYGEN_BRIEFDESC_BLKS2_XPATH = '/doxygen/compounddef/sectiondef[@kind="public-func"]/memberdef/briefdescription' -DOXYGEN_DETAILDESC_BLKS2_XPATH = '/doxygen/compounddef/sectiondef[@kind="public-func"]/memberdef/detaileddescription' def extract_txt(xml, parent_text=None): """ @@ -40,37 +39,7 @@ def extract_txt(xml, parent_text=None): map(lambda x: extract_txt(x, text), xml) ) + tail -def is_match(key, file): - """ - Is the block key a match for the given file name? - @param key block key - @param file the xml file name - @return true if matches - """ - if not file.endswith('.xml'): return False - file = file.replace('.xml', '') #remove file ext - file = file.replace('__', '_') #doxygen xml files have 2 underscores - if key.startswith('gr_'): - if not file.startswith('classgr_'): return False - key = key.replace('gr_', 'classgr_') - elif key.startswith('trellis_'): - if not file.startswith('classtrellis_'): return False - key = key.replace('trellis_', 'classtrellis_') - elif key.startswith('blks2_'): - if not file.startswith('classgnuradio_'): return False - if 'blks2' not in file: return False - file = file.replace('_1_1', '_') #weird blks2 doxygen syntax - key = key.replace('blks2_', '') - else: return False - for k, f in zip(*map(reversed, map(lambda x: x.split('_'), [key, file]))): - if k == f: continue - ks = k.split('x') - if len(ks) == 2 and f.startswith(ks[0]) and f.endswith(ks[1]): continue - if len(ks) > 2 and all(ki in ('x', fi) for ki, fi in zip(k, f)): continue - return False - return True - -def extract(key): +def _extract(key): """ Extract the documentation from the doxygen generated xml files. If multiple files match, combine the docs. @@ -82,7 +51,9 @@ def extract(key): elif os.path.exists(UBUNTU_DOCS_DIR): docs_dir = UBUNTU_DOCS_DIR else: return '' #extract matches - matches = filter(lambda f: is_match(key, f), os.listdir(docs_dir)) + pattern = key.replace('_', '_*').replace('x', '\w') + prog = re.compile('^class%s\..*$'%pattern) + matches = filter(lambda f: prog.match(f), os.listdir(docs_dir)) #combine all matches doc_strs = list() for match in matches: @@ -95,9 +66,6 @@ def extract(key): if key.startswith('gr_') or key.startswith('trellis_'): brief_desc = extract_txt(xml.xpath(DOXYGEN_BRIEFDESC_GR_XPATH)[0]).strip('\n') detailed_desc = extract_txt(xml.xpath(DOXYGEN_DETAILDESC_GR_XPATH)[0]).strip('\n') - elif key.startswith('blks2_'): - brief_desc = extract_txt(xml.xpath(DOXYGEN_BRIEFDESC_BLKS2_XPATH)[0]).strip('\n') - detailed_desc = extract_txt(xml.xpath(DOXYGEN_DETAILDESC_BLKS2_XPATH)[0]).strip('\n') else: brief_desc = '' detailed_desc = '' @@ -106,6 +74,17 @@ def extract(key): except IndexError: pass #bad format return '\n\n'.join(doc_strs) +_docs_cache = dict() +def extract(key): + """ + Call the private extract and cache the result. + @param key the block key + @return a string with documentation + """ + try: assert _docs_cache.has_key(key) + except: _docs_cache[key] = _extract(key) + return _docs_cache[key] + if __name__ == '__main__': import sys print extract(sys.argv[1]) diff --git a/grc/todo.txt b/grc/todo.txt index 581f2f713..33cf58e65 100644 --- a/grc/todo.txt +++ b/grc/todo.txt @@ -25,4 +25,3 @@ -save/restore cwd -threads dont die on exit in probe and variable sink -overloaded gui classes for each platform, move param input objects into overloaded --update extract_docs.py for current doxygen setup |