Jack, wie gewohnt saubere Qualität!!

Ich werde an meiner Version *trotzdem* weiter basteln

@EnTe: Ich würde BlackJacks Variante nehmen für euer vorhaben. Sieht sehr preformant und speicher schonend aus

lg
Das kann mein Lexer auch nicht, das wird im HTML-Writer mit dem Stack gemacht.sape hat geschrieben:Hmm, irgendwie verstehe ich nicht so ganz wie dein Lexer den Beginn- und End-Tag von Markups mit gleichen Token unterscheiden kannBei mir musste ich dafür ein par Zeilen schreiben.
Code: Alles auswählen
[...]
from ast.ast import MarkupClassNames as MCN
_NAME_OF_THIS_MODULE = os.path.basename(__file__).split('.')[0]
class BasisLexer(object):[...]
def __init__(self, source):
self.markup_identifier = (
# Markups die den gleichen Bezeichner für Begin und Ende verwenden.
{MCN.MARKUP_BOLD: (r'\*\*', None)}, # <- **
{MCN.MARKUP_ITALIC: (r'//', None)},
{MCN.MARKUP_UNDERLINE: (r'__', None)},
# Markups die unterschiedliche Bezeichner für Begin und Ende verwenden.
{MCN.MARKUP_CODE: (r'{{{', r'}}}')}
)
self.init(source)
def init(self, source):
mre = re.compile(self._merge_markups_to_restr())
self.source = [x for x in mre.split(source) if x != '']
self._lexer_stream = None
[...]
def _merge_markups_to_restr(self):
li = list()
for elem in self.markup_identifier:
identifier = elem.values()[0]
if identifier[1] is not None:
li.append("%s|%s|" % (identifier[0], identifier[1]))
else:
li.append("%s|" % identifier[0])
return r"(%s)" % "".join(li)[0:-1]
[...]
Das ist schon okay, erkennt aber weder Überschriften noch "Befehle mit Argumenten" wie ``#image[spam/eggs.png]``. Den ersten Teil habe ich genauso wie Du.sape hat geschrieben:BTW: Die regexp von dir verstehe ich noch nicht. Müssen die so Kompliziert sein?
Ich hab das so gelöst mit de regexp (Kleiner Ausschnitt):
[…]
Das ergibt (\*\*|//|__|{{{|}}}). Damit splite ich den text. Ist das eventuell nicht ok? Welchen vorteil habe ich mit deinen regexp code? -- Bisher habe ich damit alles richtig gesplitet gekriegt ohne Fehler.
Geschachtelte Tags ja, aber vom gleichen Typ? Wie soll das gehen und wozu soll das gut sein? Beispiel:cracki hat geschrieben:blackjack:
nur eine frage. erkennt dein code auch geschachtelte tags, auch vom gleichen typ? oder z.b. auch nocode-tags?
Das kommt noch. Sind ja nur 3 zusätzliche Einträge in der TabelleBlackJack hat geschrieben: Das ist schon okay, erkennt aber weder Überschriften noch "Befehle mit Argumenten" wie ``#image[spam/eggs.png]``. Den ersten Teil habe ich genauso wie Du.
Ganz simpel: ``foo`` und ``baz`` ist fett und bar nicht. Logisch! ->BlackJack hat geschrieben: **foo**bar**baz**
Sollen da jetzt `foo` und `baz` fett sein, oder alles fett und `bar` doppelt fett, oder nur einfach fett, oder…?
Code: Alles auswählen
test
Code: Alles auswählen
[b][code] test
Code: Alles auswählen
[b]test[/b]
Code: Alles auswählen
[b]test[*b][*code]
[i](*=/)[/i]
Das macht das, was auch EnTe vorgesehen hat.
lg
Code: Alles auswählen
#link
[ fobar]
Code: Alles auswählen
#link [
fobar
]
oder
#link
[
foobar
]
# (#link) = #link muss vorkommen
# ([ \t]*) = es dürfen nach #link beliebig viele Leerzeichen und tabs vorkommen
# (\[{1}) = es muss danach ein [ kommen und nur einmal!
# ([^\[\].]+) = es dürfen danach beliebige Zeichen kommen
# (]{1}) = es muss danach ein ] folgen. Danach sind weitere ] erlaubt!
# sie werden lediglich als laterale aufgefasst![]()
Code: Alles auswählen
source = """
#link [ fobar]
"""
TAGS_RE = re.compile(r'(#link)([ \t]*)(\[{1})([^\[\].]+)(]{1})')
tokens = [x for x in TAGS_RE.split(source) if x != '' and x != None]
print tokens
# ['\n ', '#link', ' ', '[', ' fobar', ']', '\n \n']
Code: Alles auswählen
#link [
fobar
]
oder
#link
[
foobar
]
Code: Alles auswählen
#link
[ fobar]
Code: Alles auswählen
mr_snede@pc-etch:~/div$ python2.5 ./dauparser_by_blacbird.py
Traceback (most recent call last):
File "./dauparser_by_blacbird.py", line 58, in <module>
from elementtree.SimpleXMLWriter import XMLWriter
ImportError: No module named elementtree.SimpleXMLWriter
Code: Alles auswählen
* 1. Eintrag in der erste Ebene
** 1. Unterprunkt in der zweiten Ebene
**** 1. Subunterpunkt in der vierter Ebene
**** 2. Subunterpunkt in der vierter Ebene
** 2. Unterprunkt in der zweiten Ebene
Nummerierte Liste:
# Nummer eins
# Nummer zweite
## und so...
## ...weiter...
Du machst zu viele unnötige Gruppierungen. Was Du hier am Ende einfach abfragen können möchtest, sind der "Befehl" (link), sofern es später verschiedene Befehle geben soll, und alles was zwischen den eckigen Klammern steht. Und den Gruppen würde ich dann auch Namen verpassen, das macht den Zugriff einfacher und das Programm verständlicher.sape hat geschrieben:Hi. Hab nun nach ein wenig rumprobieren und lesen des Atikels bei wikipedia folgende RegExp für Commands. Die fügt sich gut in meinen Lexer ein und ist ziemlich flexibel.
r'(#link)([ \t]*)(\[{1})([^\[\].]+)(]{1})'
Wenn man ihn nicht installiert, dann nicht.Mr_Snede hat geschrieben:Kann es sein, dass es unter Python2.5 (debian etch) den SimpleXMLWriter nicht gibt?