verstehe python code nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

hallo,
bin absoluter python newbie :oops:
also zu meinem problem:
ich benutze mediawiki 1.10 und habe dort eine extension (wikipdf: http://sourceforge.net/projects/wikipdf/) die scripts der extension sind in python geschrieben.
Mein problem is nun das die skripts fehler haben die ich beheben will...habe mir auch schon ein paar python bücher geholt und im internet gegooglet doch irgendwie check ich den ablauf des hauptprogramms nicht:

Code: http://paste.pocoo.org/show/32961/

ich weiß das war jetzt ne menge code :roll: die sache is das ich sowas wie ne if anweisung vor das translate schreiben wollte...so nach dem motto is ein str=<math> dann ersetzte es mit $ und speicher alle worte in einem strng bis </math> kommt und das ersetzte dann mit $ und dann geht's normal weiter im programm...
aber was ich nciht verstehe sind.
was ist der unterschied zwischen (.*?), (?s) und [A-Z]+? das wird im translate benutzt...ich wär so unendlich dankbar wenn mir jemand helfen könnte...bitte versteht das nciht falsch ich möchte nciht das mir jemand das schreibt oder so...schreiben will ich selber ABER mein Hauptproblem is das ich python noch nicht so richtig verstehe :?

liebe grüße mondschein

Edit (BlackJack): Code ausgelagert.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Hallo,

Kannst du den Code evtl. nach http://paste.pocoo.org/ einfügen. Hier sind jetzt alle Einrückungen weg und die sind in Python Teil der Syntax.

EDIT: Die "magischen Zeichen", die da verwendet werden sehen nach Regular Expressions aus.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

mkallas hat geschrieben:EDIT: Die "magischen Zeichen", die da verwendet werden sehen nach Regular Expressions aus.
Ja, da werden scheinbar Reguläre Ausdrücke verwendet, um das Markup zu zerlegen und in TeX-Direktiven zu verwandeln.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

Hallo,
vielen Dank für die schnelle Antwort.

Heißt das das ich am anfang mit import re, das modul mit integriere?
wie rufe ich das aktuelle wort auf!? weil irgendwie muss es ja so sein dass diser code bei jedem wort aufgerufen wird, oder!? das es ein übersetzungsskript ist...weil translate() ist ja keiner funktion zu geordnet, d.h. das diese methode beim code abarbeiten aufgerufen wird. (ich hab auch die anderen skripte nach translate () durchsucht, aber keinen aufruf gefunden. dann hatte ich überlegt, ob die datei wiki2latex.py in den anderen python datein mit dem jeweiligen wort auf gerufen wird, aber auch nciht :(

mit geht es halt darum das ich nach dem ausdruck <math> gucke und dann alles anderen worte bis zu </math> auch mit nehme und nicht bei jedem neuen wort neu nach den übersetzungsregeln geschaut wird....aber irgendwie fehlt mir noch das entscheidene puzzle teil um das prinzip zu verstehen wie dieser text durchgegangen wird :oops:

bin für jeden tipp dankbar
liebe grüße

p.s. sorry und danke wegen dem code
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

mondschein hat geschrieben:Heißt das das ich am anfang mit import re, das modul mit integriere?
Ja, genau.
mondschein hat geschrieben:wie rufe ich das aktuelle wort auf!? weil irgendwie muss es ja so sein dass diser code bei jedem wort aufgerufen wird, oder!? das es ein übersetzungsskript ist...weil translate() ist ja keiner funktion zu geordnet, d.h. das diese methode beim code abarbeiten aufgerufen wird. (ich hab auch die anderen skripte nach translate () durchsucht, aber keinen aufruf gefunden. dann hatte ich überlegt, ob die datei wiki2latex.py in den anderen python datein mit dem jeweiligen wort auf gerufen wird, aber auch nciht :(
Auf ``translate`` wird doch in ``doWiki`` zugegriffen. Der Teil ist eigentlich recht trivial, da wird der erste Wert, also der Reguläre Ausdruck durch den zweiten Wert ersetzt (``re.sub`` für substitute).
mondschein hat geschrieben:mit geht es halt darum das ich nach dem ausdruck <math> gucke und dann alles anderen worte bis zu </math> auch mit nehme und nicht bei jedem neuen wort neu nach den übersetzungsregeln geschaut wird....aber irgendwie fehlt mir noch das entscheidene puzzle teil um das prinzip zu verstehen wie dieser text durchgegangen wird :oops:
Dann brauchst du einfach einen Regulären Ausdruck der alles zwischen ``<math>`` und ``</math>`` matcht. Im Quelltext hast du schon stehen, wie das etwa für ``<small>`` geht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

also ich hab das mal mit small probiert...
im text steht:

<small>\sqrt{\sum_0^n a_n^2}</small>

übersetzt wird es aber:
{\small{\sqrt\{\sum\_0\^{}n a\_n\^{}2\}}
und dementsprechend auch nicht richtig angezeigt...weil das Problem das ich beheben will ist:
zwischen den <math></math> Tags steht Latex udn dementsprechend brauch alles was zwischen <math></math> ja nciht nochmal "translated" werden...
im moemnt habe ich nämlich das prblem das alles was in <math></math> steht nochmal übersetzt wird und dementsprechen in meinem pdf der latex code und nicht die schöne formel steht :shock: ...

habe versucht das irgendwie über:
( r'(?s)<math>(.*?)' , r'\\begin{equation}' ),
( r'(?s)</math>(.*?)' , r'\\end{equation}' ),

oder auch noch andere kombinationen die aber nur fehler hervorgherufen haben...
selbst wenn ich es wie bei small machen würde in tex gibt's ja soweit ich weiß keinen "nur anfangsbefehl" für die matheumgebung...sie hat doch jeweils ein start und end zeichen, oder!?
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

http://paste.pocoo.org/show/33078/ hier ist nochmal der abschnitt ab dowiki...
hier wird auch was wegen dem math unternommen in zeile 4

aber wie komme ich von hier (hier habe ich mein wort richtig!?) zu meiner translation tabelle da die ja nirgends aufgerufen wird oder so :cry:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

mondschein hat geschrieben:aber wie komme ich von hier (hier habe ich mein wort richtig!?) zu meiner translation tabelle da die ja nirgends aufgerufen wird oder so :cry:
Wird sie doch:

Code: Alles auswählen

	for trans_tuple in translate:
		# pat, debug
		print "replacing " + trans_tuple[0]
		text = re.sub(trans_tuple[0], trans_tuple[1], text)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

:oops: jetzt hab ich es auch endlich gesehen...

also angenommen ich möchte das allses was in math steht so bleibt wie es ist...
geht dann was wie

Code: Alles auswählen

if text = re.sub(r'(?s)\n:+ *<math>(.*?)</math>\s*?([\.,;]?)\n', doMath, text)
then...
else
        for trans_tuple in translate:
	        # pat, debug
		print "replacing " + trans_tuple[0]
		text = re.sub(trans_tuple[0], trans_tuple[1], text)

Code: Alles auswählen

def doMath(mathtext):
	mtext = mathtext.group(1).replace("&", "tableand")
	mtext = re.sub(r'\n[ \t]*', r'\n', mtext) #remove whitespace at beginning of line
	return "\n\\[" + mtext + mathtext.group(2) + "\\]\n"
mathtext.group(1) is <math>, oder!? und das wird mit und darin wird & mit tableand ersetzt?! ne macht doch kein sinn :( und wo verschwindet eigentlich das </math> hin? weil mathtext.group(2) is doch der rest ohne leerzeichen? :?: [/code]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Warum erweiterst du nicht einfach ``translate``?

Wenn du willst das genau gar nichts geändert wird, dann kannst du mal von diesem Code ausgehen.

Code: Alles auswählen

	( '(?s)<math>(.*?)</math>'	, r'<math>\1</math>' ),
Ich habs jetzt nicht getestet, weil ich keinen Interpreter zur Hand habe und das Skript ohne die Dependencies sowieso nicht läuft, aber es müsste sich durchaus so verhalten. Jetzt müsstest du den Code noch insofern anpassen, dass er in die Math-Umgebung schaltet.

Insgesamt ist dein Problem weniger ein Python-Problem sondern mehr ein Problem mit Regulären Ausdrücken.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

mhm ach so sollte ich wegen regulären ausdrücken woanders fragen?

also ich hatte das auch schon mal so wie du es vorgeschlagen hast...aber aus irgendeinem grund lässt er die backslashes weg :cry:
also das is was in meinem tex dokument nach der übersetztung steht

Code: Alles auswählen

${\sqrt\{\sum\_0\^{}n a\_n\^{}2\}}$
und so steht es im text

Code: Alles auswählen

 \sqrt{\sum_0^n a_n^2}
irgendwie werden backslashes verschlammt und vor der 2 z.B. klammern gesetzt die nciht dahin gehören...komisch?!
BlackJack

Ich würde sagen das Programm eignet sich einfach nicht für so etwas. Alle Ersetzungspaare in der `translate`-Liste werden nacheinander auf den gesamten Text angewendet. Dass heisst eben auch auf den Inhalt von Deinem `<math>` den Du gerne unverändert haben möchtest.

Texttransformation mittels Suchen und Ersetzen mit regulären Ausdrücken hat halt seine Grenzen. Ab einem gewissen Punkt braucht man einen ordentlichen Parser.
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

:cry: oje...das heißt ich müsste die extension selber nochmal neu schreiben!? so ein scheiß...
gibt's denn wirklich keine hoffnung mehr°? :?

danke aber trotzdem schonmal für die antworten und hilfestellungen :D
Antworten