~ubuntu-branches/ubuntu/intrepid/moin/intrepid-updates

« back to all changes in this revision

Viewing changes to MoinMoin/converter/text_html_text_x_moin.py

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2006-02-14 16:09:24 UTC
  • mfrom: (0.2.13 upstream)
  • Revision ID: james.westby@ubuntu.com-20060214160924-fyrx3gvknzqvt4vj
Tags: 1.5.2-1ubuntu1
Drop python2.3 package.

Show diffs side-by-side

added added

removed removed

Lines of Context:
461
461
    def do(self, tree):
462
462
        self.depth = 0
463
463
        self.text = []
464
 
        self.process_page(tree.documentElement)
 
464
        self.visit(tree.documentElement)
465
465
        self.check_whitespace()
466
466
        return ''.join(self.text)
467
467
 
501
501
            else:
502
502
                i += 1
503
503
 
 
504
    def visit_text(self, node):
 
505
        self.text.append(node.data)
 
506
 
504
507
    def visit_element(self, node):
505
508
        name = node.localName
506
509
        if name is None: # not sure this can happen here (DOM comment node), but just for the case
507
510
            return
508
 
        name = name.lower()
509
 
        func = getattr(self, "process_" + name,  None)
 
511
        func = getattr(self, "process_%s" % name,  None)
510
512
        if func:
511
513
            func(node)
512
 
        elif name in ('h1', 'h2', 'h3', 'h4', 'h5', 'h6',):
513
 
            self.process_heading(node)
514
 
        elif name in ('ol', 'ul',):
515
 
            self.process_list(node)
516
514
        else:
517
515
            self.process_inline(node)
518
516
 
519
 
    def process_br(self, node):
520
 
            self.text.append('\n') # without this, std multi-line text below some heading misses a whitespace
521
 
                                   # when it gets merged to float text, like word word wordword word word
522
 
        
523
517
    def visit_node_list_element_only(self, nodelist):
524
518
        for node in nodelist:
525
519
            if node.nodeType == Node.ELEMENT_NODE:
534
528
                result.extend(self.node_list_text_only(node.childNodes))
535
529
        return "".join(result)
536
530
 
537
 
    def visit_text(self, node):
538
 
        self.text.append(node.data)
539
 
 
540
 
    def process_dl(self, node):
541
 
        self.depth += 1
542
 
        indent = " " * self.depth
 
531
    def process_page(self, node):
543
532
        for i in node.childNodes:
544
533
            if i.nodeType == Node.ELEMENT_NODE:
545
 
                if i.localName == 'dt':
546
 
                    self.text.append(indent)
547
 
                    text = self.node_list_text_only(i.childNodes)
548
 
                    self.text.append(text.replace("\n", " "))
549
 
                elif i.localName == 'dd':
550
 
                    self.text.append(":: ")
551
 
                    self.process_list_item(i)
552
 
                else:
553
 
                    raise ConvertError("Illegal list element %s" % i.localName)
554
 
        if self.depth == 1:
555
 
            self.text.append("\n")
556
 
        self.depth -= 1
 
534
                self.visit_element(i)
 
535
            elif i.nodeType == Node.TEXT_NODE: # if this is missing, all std text under a headline is dropped!
 
536
                txt = i.data.strip() # IMPORTANT: don't leave this unstripped or there will be wrong blanks
 
537
                if txt:
 
538
                    self.text.append(txt)
 
539
            #we use <pre class="comment"> now, so this is currently unused:
 
540
            #elif i.nodeType == Node.COMMENT_NODE:
 
541
            #    self.text.append(i.data)
 
542
            #    self.text.append("\n")
557
543
 
 
544
    def process_br(self, node):
 
545
            self.text.append('\n') # without this, std multi-line text below some heading misses a whitespace
 
546
                                   # when it gets merged to float text, like word word wordword word word
 
547
        
558
548
    def process_heading(self, node):
559
549
        text = self.node_list_text_only(node.childNodes).strip()
560
550
        if text:
563
553
            self.text.append(self.new_line)
564
554
            self.text.append("%s %s %s" % (hstr, text.replace("\n", " "), hstr))
565
555
            self.text.append(self.new_line)
 
556
    
 
557
    process_h1 = process_heading
 
558
    process_h2 = process_heading
 
559
    process_h3 = process_heading
 
560
    process_h4 = process_heading
 
561
    process_h5 = process_heading
 
562
    process_h6 = process_heading
566
563
 
567
564
    def _get_list_item_markup(self, list, listitem):
568
 
        markup = " " * self.depth
569
 
        type = None
570
 
        if list.localName == 'ol':
 
565
        before = ""
 
566
        #indent = str(self.depth) * self.depth # nice for debugging :)
 
567
        indent = " " * self.depth
 
568
        markup = ""
 
569
        name = list.localName
 
570
        if name == 'ol':
 
571
            class_ = listitem.getAttribute("class")
 
572
            if class_ == "gap":
 
573
                before = "\n"
571
574
            if list.hasAttribute("type"):
572
575
                type = list.getAttribute("type")
573
576
            else:
574
577
                type = "1"
575
 
            markup = "%s%s. " % (markup, type)
576
 
        else:
 
578
            markup = "%s. " % type
 
579
        elif name == 'ul':
577
580
            class_ = listitem.getAttribute("class")
578
581
            if class_ == "gap":
579
 
                markup = "\n" + markup
 
582
                before = "\n"
580
583
            style = listitem.getAttribute("style")
581
 
            if not re.match(u"list-style-type:\s*none", style, re.I):
582
 
                markup += "* "
583
 
        return markup
 
584
            if re.match(u"list-style-type:\s*none", style, re.I):
 
585
                markup = ". "
 
586
            else:
 
587
                markup = "* "
 
588
        elif name == 'dl':
 
589
            markup = ":: "
 
590
        else:
 
591
            raise ConvertError("Illegal list type %s" % name)
 
592
        return before, indent, markup
 
593
 
 
594
    def process_dl(self, node):
 
595
        self.depth += 1
 
596
        markup = ":: " # can there be a dl dd without dt?
 
597
        for i in node.childNodes:
 
598
            if i.nodeType == Node.ELEMENT_NODE:
 
599
                name = i.localName
 
600
                if name == 'dt':
 
601
                    before, indent, markup = self._get_list_item_markup(node, i)
 
602
                    self.text.append(before+indent)
 
603
                    text = self.node_list_text_only(i.childNodes)
 
604
                    self.text.append(text.replace("\n", " "))
 
605
                elif name == 'dd':
 
606
                    self.text.append(markup)
 
607
                    self.process_list_item(i, indent)
 
608
                else:
 
609
                    raise ConvertError("Illegal list element %s" % i.localName)
 
610
        self.depth -= 1
 
611
        if self.depth == 0:
 
612
            self.text.append("\n")
584
613
 
585
614
    def process_list(self, node):
586
615
        self.depth += 1
588
617
            if i.nodeType == Node.ELEMENT_NODE:
589
618
                name = i.localName
590
619
                if name == 'li':
591
 
                    self.text.append(self._get_list_item_markup(node, i))
592
 
                    self.process_list_item(i)
 
620
                    before, indent, markup = self._get_list_item_markup(node, i)
 
621
                    self.text.append(before+indent+markup)
 
622
                    self.process_list_item(i, indent)
593
623
                elif name in ('ol', 'ul',):
594
624
                    self.process_list(i)
595
625
                elif name == 'dl':
596
626
                    self.process_dl(i)
597
627
                else:
598
628
                    raise ConvertError("Illegal list element %s" % i.localName)
599
 
        if self.depth == 1:
 
629
        self.depth -= 1
 
630
        if self.depth == 0:
600
631
            self.text.append("\n")
601
 
        self.depth -= 1
602
 
 
603
 
    def process_list_item(self, node):
 
632
 
 
633
    process_ul = process_list
 
634
    process_ol = process_list
 
635
 
 
636
    def process_list_item(self, node, indent):
604
637
        found = False
 
638
        first_child = True
605
639
        for i in node.childNodes:
606
640
            name = i.localName
607
641
            if name == 'p':
 
642
                if not first_child:
 
643
                    self.text.append(indent)
608
644
                self.process_paragraph_item(i)
609
645
                self.text.append("\n")
610
646
                found = True
611
647
            elif name == 'pre':
 
648
                if not first_child:
 
649
                    self.text.append(indent)
612
650
                self.process_preformatted_item(i)
613
651
                found = True
614
652
            elif name in ('ol', 'ul',):
618
656
                self.process_dl(i)
619
657
                found = True
620
658
            elif name == 'table':
 
659
                if not first_child:
 
660
                    self.text.append(indent)
621
661
                self.process_table(i)
622
662
                found = True
623
663
            #else:
624
664
            #    self.process_inline(i)
 
665
            first_child = False
625
666
                
626
667
        if not found:
627
668
            self.process_paragraph_item(node)
628
669
            self.text.append("\n")
629
670
 
630
671
    def process_blockquote(self, node):
 
672
        # XXX this does not really work. e.g.:
 
673
        # <bq>aaaaaa
 
674
        # <hr---------->
 
675
        # <bq>bbbbbb
631
676
        self.depth += 1
632
677
        for i in node.childNodes:
633
678
            if i.nodeType == Node.ELEMENT_NODE:
652
697
                    self.visit_node_list_element_only(i.childNodes)
653
698
                elif name == 'blockquote':
654
699
                    self.process_blockquote(i)
655
 
                elif name in ('br',):
 
700
                elif name == 'hr':
 
701
                    self.process_hr(i)
 
702
                elif name == 'br':
656
703
                    self.process_br(i)
657
704
                else:
658
705
                    raise ConvertError("process_blockquote: Don't support %s element" % name)
659
706
        self.depth -= 1
660
707
 
661
 
    def process_page(self, node):
662
 
        for i in node.childNodes:
663
 
            if i.nodeType == Node.ELEMENT_NODE:
664
 
                self.visit_element(i)
665
 
            elif i.nodeType == Node.TEXT_NODE: # if this is missing, all std text under a headline is dropped!
666
 
                txt = i.data.strip()
667
 
                if txt:
668
 
                    self.text.append(txt)
669
 
            #we use <pre class="comment"> now, so this is currently unused:
670
 
            #elif i.nodeType == Node.COMMENT_NODE:
671
 
            #    self.text.append(i.data)
672
 
            #    self.text.append("\n")
673
 
 
674
708
    def process_inline(self, node):
675
709
        if node.nodeType == Node.TEXT_NODE:
676
710
            self.text.append(node.data.strip('\n'))
679
713
        name = node.localName # can be None for DOM Comment nodes
680
714
        if name is None:
681
715
            return
682
 
        func = getattr(self, "process_" + name,  None)
 
716
 
 
717
        if name in ('h1', 'h2', 'h3', 'h4', 'h5', 'h6',): # headers are not allowed here (e.g. inside a ul li),
 
718
            text = self.node_list_text_only(node.childNodes).strip() # but can be inserted via the editor
 
719
            self.text.append(text)                          # so we just drop the header markup and keep the text
 
720
            return
 
721
        
 
722
        func = getattr(self, "process_%s" % name,  None)
683
723
        if func:
684
724
            func(node)
685
725
            return
706
746
            command = "^"
707
747
        elif name == 'font':
708
748
            command = "" # just throw away font settings
709
 
        elif name in ('h1', 'h2', 'h3', 'h4', 'h5', 'h6',): # headers are not allowed here (e.g. inside a ul li),
710
 
            text = self.node_list_text_only(node.childNodes).strip() # but can be inserted via the editor
711
 
            self.text.append(text)                          # so we just drop the header markup and keep the text
712
 
            return
713
749
        else:
714
750
            raise ConvertError("process_inline: Don't support %s element" % name)
715
751
        
731
767
    def process_div(self, node):
732
768
        # ignore div tags - just descend
733
769
        for i in node.childNodes:
734
 
            self.process_inline(i)
 
770
            self.visit_element(i)
735
771
 
736
772
    def process_tt(self, node):
737
773
        text = self.node_list_text_only(node.childNodes).replace("\n", " ")
1130
1166
                    pass #print name, data, filename, alt
1131
1167
            raise ConvertError("Unknown smiley icon '%s'" % filename)
1132
1168
        # Image URL
1133
 
        elif src and src.startswith("http://") and wikiutil.isPicture(src):
 
1169
        elif src and src.startswith("http:") and wikiutil.isPicture(src):
1134
1170
            self.text.extend([self.white_space, src, self.white_space])
1135
1171
        else:
1136
1172
            raise ConvertError("Strange image src: '%s'" % src)