diff --git a/gluon/highlight.py b/gluon/highlight.py index 9a47f1cd..d7482654 100644 --- a/gluon/highlight.py +++ b/gluon/highlight.py @@ -14,6 +14,23 @@ import re __all__ = ['highlight'] +class all_styles(object): + """ + Custom non-data descriptor for lazy initialization of + Highlighter.all_styles class attribute. + + see: + https://docs.python.org/2/reference/datamodel.html#implementing-descriptors + or + https://docs.python.org/3/reference/datamodel.html#implementing-descriptors + """ + + def __get__(self, instance, owner): + val = _get_all_styles(owner) + setattr(owner, 'all_styles', val) + return val + + class Highlighter(object): """Does syntax highlighting. @@ -121,83 +138,7 @@ class Highlighter(object): return 'PYTHON' return None - all_styles = { - 'C': (c_tokenizer, ( - ('COMMENT', re.compile(r'//.*\r?\n'), - 'color: green; font-style: italic'), - ('MULTILINECOMMENT', re.compile(r'/\*.*?\*/', re.DOTALL), - 'color: green; font-style: italic'), - ('PREPROCESSOR', re.compile(r'\s*#.*?[^\\]\s*\n', - re.DOTALL), 'color: magenta; font-style: italic'), - ('PUNC', re.compile(r'[-+*!&|^~/%\=<>\[\]{}(),.:]'), - 'font-weight: bold'), - ('NUMBER', - re.compile(r'0x[0-9a-fA-F]+|[+-]?\d+(\.\d+)?([eE][+-]\d+)?|\d+'), - 'color: red'), - ('KEYWORD', re.compile(r'(sizeof|int|long|short|char|void|' - + r'signed|unsigned|float|double|' - + r'goto|break|return|continue|asm|' - + r'case|default|if|else|switch|while|for|do|' - + r'struct|union|enum|typedef|' - + r'static|register|auto|volatile|extern|const)(?![a-zA-Z0-9_])'), - 'color:#185369; font-weight: bold'), - ('CPPKEYWORD', - re.compile(r'(class|private|protected|public|template|new|delete|' - + r'this|friend|using|inline|export|bool|throw|try|catch|' - + r'operator|typeid|virtual)(?![a-zA-Z0-9_])'), - 'color: blue; font-weight: bold'), - ('STRING', re.compile(r'r?u?\'(.*?)(?\[\]{}(),.:]'), - 'font-weight: bold'), - ('NUMBER', - re.compile(r'0x[0-9a-fA-F]+|[+-]?\d+(\.\d+)?([eE][+-]\d+)?|\d+' - ), 'color: red'), - ('KEYWORD', - re.compile(r'(def|class|break|continue|del|exec|finally|pass|' - + r'print|raise|return|try|except|global|assert|lambda|' - + r'yield|for|while|if|elif|else|and|in|is|not|or|import|' - + r'from|True|False)(?![a-zA-Z0-9_])'), - 'color:#185369; font-weight: bold'), - ('WEB2PY', - re.compile(r'(request|response|session|cache|redirect|local_import|HTTP|TR|XML|URL|BEAUTIFY|A|BODY|BR|B|CAT|CENTER|CODE|COL|COLGROUP|DIV|EM|EMBED|FIELDSET|LEGEND|FORM|H1|H2|H3|H4|H5|H6|IFRAME|HEAD|HR|HTML|I|IMG|INPUT|LABEL|LI|LINK|MARKMIN|MENU|META|OBJECT|OL|ON|OPTION|P|PRE|SCRIPT|SELECT|SPAN|STYLE|TABLE|THEAD|TBODY|TFOOT|TAG|TD|TEXTAREA|TH|TITLE|TT|T|UL|XHTML|IS_SLUG|IS_STRONG|IS_LOWER|IS_UPPER|IS_ALPHANUMERIC|IS_DATETIME|IS_DATETIME_IN_RANGE|IS_DATE|IS_DATE_IN_RANGE|IS_DECIMAL_IN_RANGE|IS_EMAIL|IS_EXPR|IS_FILE|IS_FLOAT_IN_RANGE|IS_IMAGE|IS_INT_IN_RANGE|IS_IN_SET|IS_IPV4|IS_LIST_OF|IS_LENGTH|IS_MATCH|IS_EQUAL_TO|IS_EMPTY_OR|IS_NULL_OR|IS_NOT_EMPTY|IS_TIME|IS_UPLOAD_FILENAME|IS_URL|CLEANUP|CRYPT|IS_IN_DB|IS_NOT_IN_DB|DAL|Field|SQLFORM|SQLTABLE|xmlescape|embed64)(?![a-zA-Z0-9_])' - ), 'link:%(link)s;text-decoration:None;color:#FF5C1F;'), - ('MAGIC', re.compile(r'self|None'), - 'color:#185369; font-weight: bold'), - ('MULTILINESTRING', re.compile(r'r?u?(\'\'\'|""")'), - 'color: #FF9966'), - ('STRING', re.compile(r'r?u?\'(.*?)(?]*-->|'), - 'color: green; font-style: italic'), - ('XMLCRAP', re.compile(r']*>'), - 'color: blue; font-style: italic'), - ('SCRIPT', re.compile(r'', re.IGNORECASE + + re.DOTALL), 'color: black'), + ('TAG', re.compile(r''), + 'color: darkred; font-weight: bold'), + )), + } + + def highlight( code, language, diff --git a/gluon/packages/dal b/gluon/packages/dal index 95057e5b..f2b6afd6 160000 --- a/gluon/packages/dal +++ b/gluon/packages/dal @@ -1 +1 @@ -Subproject commit 95057e5bc11869cc1f15e900f8de1a83b4e21bb7 +Subproject commit f2b6afd6d321d586fa6df019460ce400d6b6f45d