Changeset 267:60d6c3bc8992


Ignore:
Timestamp:
18.08.2010 14:20:52 (21 months ago)
Author:
slav0nic <slav0nic0@…>
Branch:
default
Message:

#88: bbmarkup updated

File:
1 edited

Legend:

Unmodified
Added
Removed
  • djangobb/djangobb_forum/markups/bbmarkup.py

    r237 r267  
    77 
    88__all__ = ('BBCODE_RULES', 'bbcode') 
    9  
    10 BBCODE_RULES = [ (r'\[url\](.*?)\[/url\]', r'<a href="\1">\1</a>'), 
    11         (r'\[url=(.*?)\](.*?)\[/url\]', r'<a href="\1">\2</a>'), 
    12         (r'\[link\](.*?)\[/link\]', r'<a href="\1">\1</a>'), 
    13         (r'\[link=(.*?)\](.*?)\[/link\]', r'<a href="\1">\2</a>'), 
    14         (r'\[email\](.*?)\[/email\]', r'<a href="mailto:\1">\1</a>'), 
    15         (r'\[email=(.*?)\](.*?)\[/email\]', r'<a href="mailto:\1">\2</a>'), 
    16         (r'\[img\](.*?)\[/img\]', r'<img src="\1">'), 
    17         (r'\[img=(.*?)\](.*?)\[/img\]', r'<img src="\1" alt="\2">'), 
    18         (r'\[color=([a-zA-Z]*|\#?[0-9a-fA-F]{6})\](.*?)\[/color\]', r'<span style="color:\1">\2</span>'), 
    19         (r'\[b\](.*?)\[/b\]', r'<strong>\1</strong>'), 
    20         (r'\[i\](.*?)\[/i\]', r'<em>\1</em>'), 
    21         (r'\[u\](.*?)\[/u\]', r'<u>\1</u>'), 
    22         (r'\[s\](.*?)\[/s\]', r'<strike>\1</strike>'), 
    23         (r'\[quote\](.*?)\[/quote\]', r'<blockquote>\1</blockquote>'), 
    24         (r'\[quote=(.*?)\](.*?)\[/quote\]', r'<blockquote><em>\1</em> <br /> \2</blockquote>'), 
    25         (r'\[center\](.*?)\[/center\]', r'<div style="text-align: center;">\1</div>'), 
    26         (r'\[big\](.*?)\[/big\]', r'<big>\1</big>'), 
    27         (r'\[small\](.*?)\[/small\]', r'<small>\1</small>'), 
    28         (r'\[list\](.*?)\[/list\]', r'<ul>\1</ul>'), 
    29         (r'\[list\=(\d+)\](.*?)\[/list\]', r'<ol start="\1">\2</ol>'), 
    30         (r'\[\*\](.*?)<br./>', r'<li>\1</li>'), 
    31         (r'\[br\]', r'<br />') ] 
    32  
    33 BBCODE_RULES += getattr(settings, 'BBMARKUP_EXTRA_RULES', []) 
    34  
    35  
    36 BBCODE_RULES_COMPILED = [] 
    37 for bbset in (getattr(settings, 'BBMARKUP_CUSTOM_RULES', []) or BBCODE_RULES): 
    38     p = re.compile(bbset[0], re.DOTALL) 
    39     BBCODE_RULES_COMPILED.append((p, bbset[1])) 
    40  
    419 
    4210def code_parser(matchobj): 
     
    5119    return "<pre><code>%s</code></pre>" % value 
    5220 
     21""" 
     22BBcode rule format: 
     23    'pattern' and 'repl'' - params for re.sub(); 'repl' can be function 
     24    'sortkey' - used to sort rules from highest to lowest; default value: 0 
     25    'nested' - show how many time tag can be nested to itself; only for [quote] now 
     26""" 
     27 
     28BBCODE_RULES = [ 
     29        {'pattern': r'\[code\](.*?)\[/code\]', 'repl': code_parser, 'sortkey': 100}, 
     30        {'pattern': r'\[url\](.*?)\[/url\]', 'repl': r'<a href="\1">\1</a>'}, 
     31        {'pattern': r'\[url=(.*?)\](.*?)\[/url\]', 'repl': r'<a href="\1">\2</a>'}, 
     32        {'pattern': r'\[link\](.*?)\[/link\]', 'repl': r'<a href="\1">\1</a>'}, 
     33        {'pattern': r'\[link=(.*?)\](.*?)\[/link\]', 'repl': r'<a href="\1">\2</a>'}, 
     34        {'pattern': r'\[email\](.*?)\[/email\]', 'repl': r'<a href="mailto:\1">\1</a>'}, 
     35        {'pattern': r'\[email=(.*?)\](.*?)\[/email\]', 'repl': r'<a href="mailto:\1">\2</a>'}, 
     36        {'pattern': r'\[img\](.*?)\[/img\]', 'repl': r'<img src="\1">'}, 
     37        {'pattern': r'\[img=(.*?)\](.*?)\[/img\]', 'repl': r'<img src="\1" alt="\2">'}, 
     38        {'pattern': r'\[color=([a-zA-Z]*|\#?[0-9a-fA-F]{6})\](.*?)\[/color\]', 'repl': r'<span style="color:\1">\2</span>'}, 
     39        {'pattern': r'\[b\](.*?)\[/b\]', 'repl': r'<strong>\1</strong>'}, 
     40        {'pattern': r'\[i\](.*?)\[/i\]', 'repl': r'<em>\1</em>'}, 
     41        {'pattern': r'\[u\](.*?)\[/u\]', 'repl': r'<u>\1</u>'}, 
     42        {'pattern': r'\[s\](.*?)\[/s\]', 'repl': r'<strike>\1</strike>'}, 
     43        {'pattern': r'\[quote\](.*?)\[/quote\]', 'repl': r'<blockquote>\1</blockquote>', 'nested': 5}, 
     44        {'pattern': r'\[quote=(.*?)\](.*?)\[/quote\]', 'repl': r'<blockquote><em>\1</em> <br /> \2</blockquote>', 'nested': 5}, 
     45        {'pattern': r'\[center\](.*?)\[/center\]', 'repl': r'<div style="text-align: center;">\1</div>'}, 
     46        {'pattern': r'\[big\](.*?)\[/big\]', 'repl': r'<big>\1</big>'}, 
     47        {'pattern': r'\[small\](.*?)\[/small\]', 'repl': r'<small>\1</small>'}, 
     48        {'pattern': r'\[list\](.*?)\[/list\]', 'repl': r'<ul>\1</ul>'}, 
     49        {'pattern': r'\[list\=(\d+)\](.*?)\[/list\]', 'repl': r'<ol start="\1">\2</ol>'}, 
     50        {'pattern': r'\[\*\](.*?)<br./>', 'repl': r'<li>\1</li>'}, 
     51        {'pattern': r'\[br\]', 'repl': r'<br />'}, 
     52] 
     53 
     54BBCODE_RULES += getattr(settings, 'BBMARKUP_EXTRA_RULES', []) 
     55BBCODE_RULES.sort(key=lambda r: r.get('sortkey', 0), reverse=True) 
     56 
     57BBCODE_RULES_COMPILED = [] 
     58for bbset in (getattr(settings, 'BBMARKUP_CUSTOM_RULES', []) or BBCODE_RULES): 
     59    bbset['pattern'] = re.compile(bbset['pattern'], re.DOTALL) 
     60    bbset.setdefault('sortkey', 0) 
     61    bbset.setdefault('nested', 0) 
     62    BBCODE_RULES_COMPILED.append(bbset) 
    5363 
    5464def bbcode(value, code_parser=code_parser): 
     
    5969    >>> bbcode('[i]Lorem[/i] \\n [s]imsum[/s]') 
    6070    u'<em>Lorem</em> <br /> <strike>imsum</strike>' 
    61     >>> bbmarkup.bbcode('[list] [*] 1\n [*]2\n [*] 3\n[/list]') 
    62     u'<ul> <li>1</li> <li>2</li> <li>3</li></ul>' 
    63     >>> bbmarkup.bbcode('[list=2] [*] a\n [*]b\n [*] c\n[/list]') 
    64     u'<ol start="2"> <li>a</li> <li>b</li> <li>c</li></ol>' 
    65     >>> bbmarkup.bbcode("[code]print 123\nprint '<br/>'[/code]") 
    66     u'<pre><code>print 123\nprint &#39;&lt;br/&gt;&#39;</code></pre>' 
    67     >>> bbmarkup.bbcode('[quote=test user]Test quote text[/quote]') 
     71    >>> bbcode('[list] [*] 1\\n [*]2\\n [*] 3\\n[/list]') 
     72    u'<ul> <li> 1</li> <li>2</li> <li> 3</li></ul>' 
     73    >>> bbcode('[list=2] [*] a\\n [*]b\\n [*] c\\n[/list]') 
     74    u'<ol start="2"> <li> a</li> <li>b</li> <li> c</li></ol>' 
     75    >>> bbcode("[code]print 123\\nprint '<br/>'[/code]") 
     76    u'<pre><code>print 123\\nprint &#39;&lt;br/&gt;&#39;</code></pre>' 
     77    >>> bbcode('[quote=test user]Test quote text[/quote]') 
    6878    u'<blockquote><em>test user</em> <br /> Test quote text</blockquote>' 
    69     >>> bbmarkup.bbcode('[color=red]Lorem[/color]') 
     79    >>> bbcode("[quote]Lorem [quote=sl]imsum[/quote] blabla [/quote]") 
     80    u'<blockquote>Lorem <blockquote><em>sl</em> <br /> imsum</blockquote> blabla </blockquote>' 
     81    >>> bbcode('[color=red]Lorem[/color]') 
    7082    u'<span style="color:red">Lorem</span>' 
    71     >>> bbmarkup.bbcode('[color=#FAaF12]Lorem[/color]') 
     83    >>> bbcode('[color=#FAaF12]Lorem[/color]') 
    7284    u'<span style="color:#FAaF12">Lorem</span>' 
    73     >>> bbmarkup.bbcode('[color=#FAaF121]Lorem[/color]') 
     85    >>> bbcode('[color=#FAaF121]Lorem[/color]') 
    7486    u'[color=#FAaF121]Lorem[/color]' 
    7587     
     
    7890    value = escape(value) 
    7991    value = linebreaksbr(value) 
    80     value = re.sub(re.compile(r'\[code\](.*?)\[/code\]', re.DOTALL), code_parser, value) 
    8192    for bbset in BBCODE_RULES_COMPILED: 
    82         value = bbset[0].sub(bbset[1], value) 
     93        for _ in xrange(bbset['nested'] + 1): 
     94            value = bbset['pattern'].sub(bbset['repl'], value) 
    8395 
    8496    return mark_safe(value) 
Note: See TracChangeset for help on using the changeset viewer.