diff --git a/rhodecode/config/rcextensions/__init__.py b/rhodecode/config/rcextensions/__init__.py --- a/rhodecode/config/rcextensions/__init__.py +++ b/rhodecode/config/rcextensions/__init__.py @@ -6,6 +6,14 @@ # build by pygments EXTRA_MAPPINGS = {} +# additional lexer definitions for custom files +# it's overrides pygments lexers, and uses defined name of lexer to colorize the +# files. Format is {'ext': 'lexer_name'} +# List of lexers can be printed running: +# python -c "import pprint;from pygments import lexers;pprint.pprint([(x[0], x[1]) for x in lexers.get_all_lexers()]);" + +EXTRA_LEXERS = {} + #============================================================================== # WHOOSH INDEX EXTENSIONS #============================================================================== diff --git a/rhodecode/lib/annotate.py b/rhodecode/lib/annotate.py --- a/rhodecode/lib/annotate.py +++ b/rhodecode/lib/annotate.py @@ -10,14 +10,13 @@ :copyright: (C) 2011-2012 Marcin Kuzminski :license: GPLv3, see COPYING for more details. """ +import StringIO from rhodecode.lib.vcs.exceptions import VCSError from rhodecode.lib.vcs.nodes import FileNode from pygments.formatters import HtmlFormatter from pygments import highlight -import StringIO - def annotate_highlight(filenode, annotate_from_changeset_func=None, order=None, headers=None, **options): @@ -34,11 +33,12 @@ def annotate_highlight(filenode, annotat :param headers: dictionary with headers (keys are whats in ``order`` parameter) """ + from rhodecode.lib.utils import get_custom_lexer options['linenos'] = True formatter = AnnotateHtmlFormatter(filenode=filenode, order=order, headers=headers, annotate_from_changeset_func=annotate_from_changeset_func, **options) - lexer = filenode.lexer + lexer = get_custom_lexer(filenode.extension) or filenode.lexer highlighted = highlight(filenode.content, lexer, formatter) return highlighted diff --git a/rhodecode/lib/helpers.py b/rhodecode/lib/helpers.py --- a/rhodecode/lib/helpers.py +++ b/rhodecode/lib/helpers.py @@ -41,7 +41,7 @@ from webhelpers.html.tags import _set_in convert_boolean_attrs, NotGiven, _make_safe_id_component from rhodecode.lib.annotate import annotate_highlight -from rhodecode.lib.utils import repo_name_slug +from rhodecode.lib.utils import repo_name_slug, get_custom_lexer from rhodecode.lib.utils2 import str2bool, safe_unicode, safe_str, \ get_changeset_safe, datetime_to_time, time_to_datetime, AttributeDict from rhodecode.lib.markup_renderer import MarkupRenderer @@ -253,13 +253,14 @@ class CodeHtmlFormatter(HtmlFormatter): def pygmentize(filenode, **kwargs): - """pygmentize function using pygments + """ + pygmentize function using pygments :param filenode: """ - - return literal(code_highlight(filenode.content, - filenode.lexer, CodeHtmlFormatter(**kwargs))) + lexer = get_custom_lexer(filenode.extension) or filenode.lexer + return literal(code_highlight(filenode.content, lexer, + CodeHtmlFormatter(**kwargs))) def pygmentize_annotation(repo_name, filenode, **kwargs): diff --git a/rhodecode/lib/utils.py b/rhodecode/lib/utils.py --- a/rhodecode/lib/utils.py +++ b/rhodecode/lib/utils.py @@ -550,6 +550,26 @@ def load_rcextensions(root_path): log.debug('adding extra into INDEX_EXTENSIONS') conf.INDEX_EXTENSIONS.extend(getattr(EXT, 'EXTRA_INDEX_EXTENSIONS', [])) + # auto check if the module is not missing any data, set to default if is + # this will help autoupdate new feature of rcext module + from rhodecode.config import rcextensions + for k in dir(rcextensions): + if not k.startswith('_') and not hasattr(EXT, k): + setattr(EXT, k, getattr(rcextensions, k)) + + +def get_custom_lexer(extension): + """ + returns a custom lexer if it's defined in rcextensions module, or None + if there's no custom lexer defined + """ + import rhodecode + from pygments import lexers + #check if we didn't define this extension as other lexer + if rhodecode.EXTENSIONS and extension in rhodecode.EXTENSIONS.EXTRA_LEXERS: + _lexer_name = rhodecode.EXTENSIONS.EXTRA_LEXERS[extension] + return lexers.get_lexer_by_name(_lexer_name) + #============================================================================== # TEST FUNCTIONS AND CREATORS