Edgewall Software

Ticket #4144: relative-links-fix2.diff

File relative-links-fix2.diff, 4.7 KB (added by Tim Hatch <trac@…>, 2 years ago)

Second draft, all three types of links

  • trac/wiki/formatter.py

     
    2323import urllib 
    2424 
    2525from StringIO import StringIO 
     26from os.path import dirname 
    2627 
    2728from trac.core import * 
    2829from trac.mimeview import * 
     
    230231    _processor_re = re.compile('#\!([\w+-][\w+-/]*)') 
    231232    _anchor_re = re.compile('[^\w:.-]+', re.UNICODE) 
    232233 
    233     def __init__(self, env, req=None, absurls=False, db=None): 
     234    def __init__(self, env, req=None, absurls=False, db=None, itemurl=None): 
    234235        self.env = env 
    235236        self.req = req 
    236237        self._db = db 
     238        self._itemurl = itemurl 
    237239        self._absurls = absurls 
    238240        self._anchors = {} 
    239241        self._open_tags = [] 
     
    428430    def _make_relative_link(self, url, text): 
    429431        if url.startswith('//'): # only the protocol will be kept 
    430432            return html.A(text, class_="ext-link", href=url) 
     433        elif self._itemurl and url and url[0] in "#.": 
     434            # This is for links that are hashref or relative, not those 
     435            # that have a leading slash (presumably relative to the 
     436            # server, not trac instance 
     437            if url[0] == "#": # hash ref 
     438                return html.A(text, href=self._itemurl+url) 
     439            else: # file link 
     440                return html.A(text, href=dirname(self._itemurl)+"/"+url) 
    431441        else: 
    432442            return html.A(text, href=url) 
    433443 
     
    861871    """ 
    862872    flavor = 'oneliner' 
    863873 
    864     def __init__(self, env, absurls=False, db=None, req=None): 
    865         Formatter.__init__(self, env, req, absurls, db) 
     874    def __init__(self, env, absurls=False, db=None, req=None, itemurl=None): 
     875        Formatter.__init__(self, env, req, absurls, db, itemurl) 
    866876 
    867877    # Override a few formatters to disable some wiki syntax in "oneliner"-mode 
    868878    def _list_formatter(self, match, fullmatch): return match 
     
    9981008# -- wiki_to_* helper functions 
    9991009 
    10001010def wiki_to_html(wikitext, env, req, db=None, 
    1001                  absurls=False, escape_newlines=False): 
     1011                 absurls=False, escape_newlines=False, itemurl=None): 
    10021012    if not wikitext: 
    10031013        return Markup() 
    10041014    out = StringIO() 
    1005     Formatter(env, req, absurls, db).format(wikitext, out, escape_newlines) 
     1015    Formatter(env, req, absurls, db, itemurl=itemurl).format(wikitext, out, escape_newlines) 
    10061016    return Markup(out.getvalue()) 
    10071017 
    10081018def wiki_to_oneliner(wikitext, env, db=None, shorten=False, absurls=False, 
    1009                      req=None): 
     1019                     req=None, itemurl=None): 
    10101020    if not wikitext: 
    10111021        return Markup() 
    10121022    out = StringIO() 
    1013     OneLinerFormatter(env, absurls, db, req=req).format(wikitext, out, shorten) 
     1023    OneLinerFormatter(env, absurls, db, itemurl=itemurl, req=req).format(wikitext, out, shorten) 
    10141024    return Markup(out.getvalue()) 
    10151025 
    10161026def wiki_to_outline(wikitext, env, db=None, 
  • templates/timeline.html

     
    4242            </a></dt> 
    4343            <dd class="${event.kind}" py:with="wikify = event.use_oneliner and wiki_to_oneliner or wiki_to_html"> 
    4444              ${event.markup} 
    45               <py:if test="event.message">${wikify(event.message)}</py:if> 
     45              <py:if test="event.message">${wikify(event.message, itemurl=event.href)}</py:if> 
    4646            </dd> 
    4747          </py:for> 
    4848        </dl> 
  • templates/wiki_diff.html

     
    5151        <dt class="property message">Comment:</dt> 
    5252        <dd class="message" py:choose=""> 
    5353          <em py:when="multi" class="multi">(multiple changes)</em> 
    54           <py:otherwise>${wiki_to_html(comment)}</py:otherwise> 
     54          <py:otherwise>${wiki_to_html(comment, itemurl=href.wiki(page.name))}</py:otherwise> 
    5555        </dd> 
    5656      </dl> 
    5757      <div class="diff"> 
  • templates/wiki_history.html

     
    4848              </td> 
    4949              <td class="date">${format_datetime(item.date)}</td> 
    5050              <td class="author" title="IP-Address: $item.ipnr">$item.author</td> 
    51               <td class="comment">${wiki_to_oneliner(item.comment)}</td> 
     51              <td class="comment">${wiki_to_oneliner(item.comment, itemurl=href.wiki(page.name))}</td> 
    5252            </tr> 
    5353          </tbody> 
    5454        </table>