~ubuntu-branches/ubuntu/natty/moin/natty-updates

« back to all changes in this revision

Viewing changes to MoinMoin/parser/text_moin_wiki.py

  • Committer: Bazaar Package Importer
  • Author(s): Jonas Smedegaard
  • Date: 2008-06-22 21:17:13 UTC
  • mto: This revision was merged to the branch mainline in revision 18.
  • Revision ID: james.westby@ubuntu.com-20080622211713-inlv5k4eifxckelr
ImportĀ upstreamĀ versionĀ 1.7.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
 
16
16
from MoinMoin import config, wikiutil, macro
17
17
from MoinMoin.Page import Page
18
 
from MoinMoin.support.python_compatibility import set
 
18
from MoinMoin.support.python_compatibility import rsplit, set
19
19
 
20
20
Dependencies = ['user'] # {{{#!wiki comment ... }}} has different output depending on the user's profile settings
21
21
 
22
22
 
23
 
_ = lambda x: x
24
 
 
25
23
class Parser:
26
24
    """
27
25
        Parse wiki format markup (and call the formatter to generate output).
32
30
        Methods named like _*_repl() are responsible to handle the named regex patterns.
33
31
    """
34
32
 
35
 
    extensions = ['.moin']
36
33
    # allow caching
37
34
    caching = 1
38
35
    Dependencies = Dependencies
39
 
    quickhelp = _(u"""\
40
 
 Emphasis:: <<Verbatim('')>>''italics''<<Verbatim('')>>; <<Verbatim(''')>>'''bold'''<<Verbatim(''')>>; <<Verbatim(''''')>>'''''bold italics'''''<<Verbatim(''''')>>; <<Verbatim('')>>''mixed ''<<Verbatim(''')>>'''''bold'''<<Verbatim(''')>> and italics''<<Verbatim('')>>; <<Verbatim(----)>> horizontal rule.
41
 
 Headings:: = Title 1 =; == Title 2 ==; === Title 3 ===; ==== Title 4 ====; ===== Title 5 =====.
42
 
 Lists:: space and one of: * bullets; 1., a., A., i., I. numbered items; 1.#n start numbering at n; space alone indents.
43
 
 Links:: <<Verbatim(JoinCapitalizedWords)>>; <<Verbatim([[target|linktext]])>>.
44
 
 Tables:: || cell text |||| cell text spanning 2 columns ||;    no trailing white space allowed after tables or titles.
45
 
 
46
 
(!) For more help, see HelpOnEditing or HelpOnMoinWikiSyntax.
47
 
""")
48
36
 
49
37
    # some common strings
50
38
    CHILD_PREFIX = wikiutil.CHILD_PREFIX
601
589
            text = groups.get('interwiki')
602
590
            return self.formatter.text(text)
603
591
        else:
604
 
            page, anchor = wikiutil.split_anchor(page)
605
 
            return (self.formatter.interwikilink(1, wiki, page, anchor=anchor) +
 
592
            return (self.formatter.interwikilink(1, wiki, page) +
606
593
                    self.formatter.text(page) +
607
594
                    self.formatter.interwikilink(0, wiki, page))
608
595
    _interwiki_wiki_repl = _interwiki_repl
625
612
        if abs_name == current_page:
626
613
            return self.formatter.text(word)
627
614
        else:
628
 
            abs_name, anchor = wikiutil.split_anchor(abs_name)
 
615
            # handle anchors
 
616
            try:
 
617
                abs_name, anchor = rsplit(abs_name, "#", 1)
 
618
            except ValueError:
 
619
                anchor = ""
629
620
            return (bang +
630
621
                    self.formatter.pagelink(1, abs_name, anchor=anchor) +
631
622
                    self.formatter.text(word) +
693
684
    def _transclude_repl(self, word, groups):
694
685
        """Handles transcluding content, usually embedding images."""
695
686
        target = groups.get('transclude_target', '')
696
 
        target = wikiutil.url_unquote(target)
 
687
        target = wikiutil.url_unquote(target, want_unicode=True)
697
688
        desc = groups.get('transclude_desc', '') or ''
698
689
        params = groups.get('transclude_params', u'') or u''
699
690
        acceptable_attrs_img = ['class', 'title', 'longdesc', 'width', 'height', 'align', ] # no style because of JS
724
715
 
725
716
            elif m.group('attach_scheme'):
726
717
                scheme = m.group('attach_scheme')
727
 
                url = wikiutil.url_unquote(m.group('attach_addr'))
 
718
                url = wikiutil.url_unquote(m.group('attach_addr'), want_unicode=True)
728
719
                if scheme == 'attachment':
729
720
                    mt = wikiutil.MimeType(filename=url)
730
721
                    if mt.major == 'text':
740
731
                        return self.formatter.attachment_image(url, **tag_attrs)
741
732
                    else:
742
733
                        from MoinMoin.action import AttachFile
743
 
                        current_pagename = self.formatter.page.page_name
744
 
                        pagename, filename = AttachFile.absoluteName(url, current_pagename)
745
 
                        if AttachFile.exists(self.request, pagename, filename):
746
 
                            href = AttachFile.getAttachUrl(pagename, filename, self.request)
 
734
                        pagename = self.formatter.page.page_name
 
735
                        if AttachFile.exists(self.request, pagename, url):
 
736
                            href = AttachFile.getAttachUrl(pagename, url, self.request, escaped=0)
747
737
                            tag_attrs, query_args = self._get_params(params,
748
738
                                                                     tag_attrs={'title': desc, },
749
739
                                                                     acceptable_attrs=acceptable_attrs_object)
767
757
                            pagename = self.formatter.page.page_name
768
758
                            return m.execute('EmbedObject', u'target=%s' % url)
769
759
                elif scheme == 'drawing':
770
 
                    url = wikiutil.drawing2fname(url)
771
760
                    desc = self._transclude_description(desc, url)
772
 
                    if desc:
773
 
                        tag_attrs= {'alt': desc, 'title': desc, }
774
 
                    else:
775
 
                        tag_attrs = {}
776
 
                    tag_attrs, query_args = self._get_params(params,
777
 
                                                             tag_attrs=tag_attrs,
778
 
                                                             acceptable_attrs=acceptable_attrs_img)
779
 
                    return self.formatter.attachment_drawing(url, desc, **tag_attrs)
 
761
                    return self.formatter.attachment_drawing(url, desc)
780
762
 
781
763
            elif m.group('page_name'):
782
764
                # experimental client side transclusion
853
835
        target = groups.get('link_target', '')
854
836
        desc = groups.get('link_desc', '') or ''
855
837
        params = groups.get('link_params', u'') or u''
856
 
        acceptable_attrs = ['class', 'title', 'target', 'accesskey', 'rel', ] # no style because of JS
 
838
        acceptable_attrs = ['class', 'title', 'target', 'accesskey', ] # no style because of JS
857
839
        mt = self.link_target_re.match(target)
858
840
        if mt:
859
841
            if mt.group('page_name'):
864
846
                else:
865
847
                    err = True
866
848
                if err: # not a interwiki link / not in interwiki map
867
 
                    page_name, anchor = wikiutil.split_anchor(page_name_and_anchor)
 
849
                    # handle anchors
 
850
                    try:
 
851
                        page_name, anchor = rsplit(page_name_and_anchor, "#", 1)
 
852
                    except ValueError:
 
853
                        page_name, anchor = page_name_and_anchor, ""
868
854
                    current_page = self.formatter.page.page_name
869
855
                    if not page_name:
870
856
                        page_name = current_page
877
863
                            self._link_description(desc, target, page_name_and_anchor) +
878
864
                            self.formatter.pagelink(0, abs_page_name))
879
865
                else: # interwiki link
880
 
                    page_name, anchor = wikiutil.split_anchor(page_name)
881
866
                    tag_attrs, query_args = self._get_params(params,
882
867
                                                             tag_attrs={},
883
868
                                                             acceptable_attrs=acceptable_attrs)
884
 
                    return (self.formatter.interwikilink(1, wiki_name, page_name, anchor=anchor, querystr=query_args, **tag_attrs) +
 
869
                    return (self.formatter.interwikilink(1, wiki_name, page_name, querystr=query_args, **tag_attrs) +
885
870
                            self._link_description(desc, target, page_name) +
886
871
                            self.formatter.interwikilink(0, wiki_name, page_name))
887
872
 
897
882
 
898
883
            elif mt.group('attach_scheme'):
899
884
                scheme = mt.group('attach_scheme')
900
 
                url = wikiutil.url_unquote(mt.group('attach_addr'))
 
885
                url = wikiutil.url_unquote(mt.group('attach_addr'), want_unicode=True)
901
886
                tag_attrs, query_args = self._get_params(params,
902
887
                                                         tag_attrs={'title': desc, },
903
888
                                                         acceptable_attrs=acceptable_attrs)
904
 
                if scheme == 'attachment': # ZZZ
 
889
                if scheme == 'attachment':
905
890
                    return (self.formatter.attachment_link(1, url, querystr=query_args, **tag_attrs) +
906
891
                            self._link_description(desc, target, url) +
907
892
                            self.formatter.attachment_link(0))
908
893
                elif scheme == 'drawing':
909
 
                    url = wikiutil.drawing2fname(url)
910
894
                    return self.formatter.attachment_drawing(url, desc, alt=desc, **tag_attrs)
911
895
            else:
912
896
                if desc:
1260
1244
        #logging.debug("parser_content: %r" % line)
1261
1245
        if self.in_pre == 'search_parser' and line.strip():
1262
1246
            # try to find a parser specification
1263
 
            parser_name = ''
1264
1247
            if line.strip().startswith("#!"):
1265
 
                parser_name = line.strip()[2:]
1266
 
            if parser_name:
1267
 
                parser_name = parser_name.split()[0]
 
1248
                parser_name = line.strip()[2:].split()[0]
1268
1249
            else:
1269
1250
                parser_name = 'text'
1270
1251
            self.setParser(parser_name)
1369
1350
                    lastpos += 1 # proceed, we don't want to match this again
1370
1351
            else:
1371
1352
                if self.in_pre:
1372
 
                    # ilastpos is more then 0 and result of line slice is empty make useless line
1373
 
                    if not (lastpos > 0 and line[lastpos:] == ''):
1374
 
                        self._parser_content(line[lastpos:])
 
1353
                    self._parser_content(line[lastpos:])
1375
1354
                elif line[lastpos:]:
1376
1355
                    ###result.append('<span class="info">[no match, add rest: <tt>"%s"<tt>]</span>' % line[lastpos:])
1377
1356
                    if not (inhibit_p or self.inhibit_p or self.in_pre or self.formatter.in_p or
1436
1415
        rawtext = self.raw.expandtabs()
1437
1416
 
1438
1417
        # go through the lines
1439
 
 
1440
 
        for lineno in range(1, self.start_line + 1):
1441
 
            self.request.write(self.formatter.line_anchordef(lineno))
1442
 
 
1443
1418
        self.lineno = self.start_line
1444
1419
        self.lines = self.eol_re.split(rawtext)
1445
1420
        self.line_is_empty = 0
1575
1550
        except wikiutil.PluginMissingError:
1576
1551
            self.parser = None
1577
1552
 
1578
 
del _