wiki:workflow-notes

XML Workflow: Notes

Auf dieser Seite sind zusätzliche Notizen zum XML-Workflow.

Die Arbeitsschritte

Textfilter

  • Die Namen der Arbeitschritte sind nur guidelines. Beispielsweise sind die Teilschritte 3.03 (ersetze escape sequences) und 3.04 (ersetze italics) technisch gesehen nicht nötig für einen wohlgeformten Text und 4.07 (füge <div> ein) nicht nötig für einen schemakonformen Text, aber sie sind an den jeweiligen Stellen sinnvoll.
  • Bei Skripten mit Parametern werden die Parameterwerte in den raw text eingetragen, und anpassbare Listen wie Wortabkürzungen werden aus Hilfsdateien eingelesen. Die Skripte selbst müssen daher nur selten angepasst werden.
  • Für einige Skripte wäre eine interaktive GUI sinnvoll. Wir prüfen zurzeit, ob es bereits geeignete tools gibt, die wir dafür verwenden können.
  • Im Gegensatz zu den früheren Skripten dürfen die hier beschriebenen Bearbeitungsschritte die Zeilenstruktur verändern, zum Beispiel eine Zeile hinzufügen.
  • Beachte, dass Work Orders 1 bis 5 mit den DESpecs 1.1.2 und Work Orders 6 bis 9 mit den DESpecs 2.0 geschickt wurden. Unterschiede sind zum Beispiel das Format von Figures und von Tabellen.

1. Vorbereitungen

  • Wenn wir einen transkribierten Text aus China erhalten, muss zuerst geprüft werden, ob die Datei tatsächlich, wie in den DESpecs verlangt, reiner Text in UTF-8 ist. Insbesondere akzeptieren wir keine doc-Dateien.
  • Es ist noch nicht ganz klar, wo neue Dateien in Zukunft abgelegt werden: Kommen sie wie bisher zuerst nach Pythia oder gleich in das wiki-repository? Ich gehe vorläufig davon aus, dass Texte weiterhin zuerst nach Pythia kommen. Die Namenskonvention auf Pythia ist bisher workorder_autor_jahr.

1.01 Von Pythia ins svn-repository

Shell-Skript, attachment, sieh unten.

Die Unterscheidung in die Verzeichnisse raw und xml nervt allerdings in der Praxis.

1.02 Kommunikation mit Foxridge

Das Skript funktioniert nur innerhalb des Instituts.

Das Skript meldet sich nicht bei Foxridge an. Die Änderungen in index.meta werden daher nur in der lokalen Kopie gemacht. Es fehlt also:

  • Sicherheitskopie von index.meta anlegen (auch lokal?): Umbenennen von index.meta in index.meta.old, eine ältere Sicherheitskopie mit demselben Namen wird ohne Nachfrage überschrieben.
  • Schreibe die neue index.meta

(Die Trennung der Schritte „Vorbereitung“ und „raw text bearbeiten“ wird nicht vollkommen eingehalten, denn dieses Skript schreibt bereits Daten in den raw text. Man könnte die Metadaten und JPG-Dateinamen auch erst in getrennte Dateien schreiben, aber ich wüsste nicht, was dadurch gewonnen wäre. Die Idee ist, dass alle textspezifischen Informationen in den Text geschrieben werden und alle allgemeinen Informationen wie die GND-Liste in Schritt 2.01 in getrennte Dateien.)

2. raw text bearbeiten

Wird der ganze tag ignoriert, wenn er ein wohlgeformtes Attribut enthält? Beispiel <p it> für eine Absatz in kursiv, der sich zusätzlich als italienisch herausstellt: <p it xml:lang="it"> würde bewirken, dass it nicht aufgelöst wird, man müsste also <p it> zu <p style="it" xml:lang="it"> machen. Das ist vielleicht keine gute Idee. Also doch besser: Nur wohlgeformte Attribute werden ignoriert? (Der Fall wird zwar nicht oft eintreten, aber es sollte trotzdem dafür eine klare Anweisung geben.)

2.01 Metadaten

Vielleicht ersetze ich diese Kurzschreibweise aber auch wieder durch korrektes XML, sodass die Metadaten in Schritt 3.05 nur noch an die richtige Stelle kopiert werden müssen. Das XML aus index.meta muss allerdings auf alle Fälle an das Schema angepasst werden.

2.02 pb's synchronisieren

Warum ist zzzz.jpg nicht erlaubt? Es ist offensichtlich eine Seite, die nicht zum Buch gehört. Aber wenn man sagt, die <pb> im XML-Text sollen genau den JPG im pageimg-Ordner entsprechen, dann muss es erlaubt sein. Hat der Benutzer denn ein Interesse daran, diese Seite zu sehen?

2.03 ersetze verbotene Zeichen im Text

Eventuell wird das Skript noch von einer Blacklist der verbotenenen Unicode-Blöcke auf eine Whitelist der erlaubten Unicode-Blöcke umgestellt. Vielleicht sollte man auch in den DESpecs eine Whitelist oder Blacklist vorgeben, um das zufällige Herauspicken von Unicode-Zeichen zu verhindern. Andererseits sind falsche Unicode-Zeichen leicht korrigierbar, solange sie konsistent verwendet werden.

2.04 prüfe unknown characters

Eventuell sollte das Skript die codes auch schon in die Datei schreiben, damit man sie nicht rüberkopieren muss. Allerdings würde das Skript dann sowohl Textänderungen machen als auch eine Liste von Problemen anzeigen.

2.05 prüfe escape sequences

Zeichen, die wie { aussehen, gibt es dagegen. Wenn ein solches { legitimerweise im Text steht, sollte es so markiert werden können, dass das Skript nicht mehr darüber stolpert, dass es aber andererseits vom Skript 3.03 (ersetze escape sequences) entfernt werden kann.

Ich gehe davon aus, dass es keine echten \ im Text gibt, d.h. alle \ im Text gehören zu irgendwelchen bei der Transkription eingefügten escape sequences. Und zumindest wird es die Zeichenfolge \{ nicht geben. Vorschlag also: ein legitimes { wird mit \{ markiert. Hat das irgendwelche Nebenwirkungen?

2.06 prüfe italics

Die Korrekturen in diesem Schritt werden wohl immer im Text selbst und nicht in den Blöcken vor dem Text gemacht.

2.07 prüfe tags

Das Skript könnte allerdings zumindest regexes vorschlagen, die der User verwenden kann. Langfristig sollte es eine interaktive Version dieses Schrittes geben.

2.08 prüfe <s>

(Kann man hier das s-Skript aufrufen, oder kommt man dann durcheinander, weil so viele Skripte dazwischen den Text verändern? Eventuell kann man hier diese Skripte gleich mit aufrufen. Ausgangspunkt ist jedenfalls das alte Skript Filter_4_04a_test_s.pl.)

2.09 prüfe tables

2.10 Special Instructions

(Schöner wäre es, wenn die entsprechende Zeichen durch Unicode-Mathematik-Zeichen angenähert werden könnten und die modernen Zeichen erst in der MathML-Formel verwendet werden. Leider gibt es diese Zeichen so nicht in Unicode. Der Umgang mit veralteter mathematischer Notation ist noch nicht vollständig geklärt. Alternative wäre wie bei Alchemie-Symbolen ein Bild; ist das bei Büchern mit vielen Formeln realistisch?)

3. Schritte bis zu wohlgeformtem xml

Dieser Schritt zerfällt eigentlich in zwei Teilschritte:

  1. erzeuge die intendierte Textgestalt, indem die Regeln der DESpecs quasi rückgängig gemacht werden
  2. verwandle diese Textgestalt in wohlgeformtes XML

Sollte man diese Teilschritte in zwei getrennte Schritte umbenennen? Inhaltlich würde sich dadurch nichts ändern.

Das Skript Filter_3_test_wellformedness ist zurzeit ein Wrapper für xmllint. Ich werde es wahrscheinlich noch auf ein Perl-Modul statt xmllint umstellen. Insbesondere weil xmllint offenbar nicht UTF-8 verwendet. (Oder kann man das einstellen? --encode UTF-8 scheint jedenfalls keinen Unterschied zu machen.)

Beispiel: verwandle Archimedes 1615 aus WO 3 in XML mit Filter_3_make_wellformed, wende dann Filter_3_test_wellformedness an: ein Wort wie "quæris" legt nahe, dass der output UTF-8 ist, aber als "Mac OS Roman" interpretiert wird. Dann ist xmllint doch unschuldig, und das Problem ist irgendwo danach? --> Ja, im Terminal wird es korrekt angezeigt.

3.01 ersetze unknown characters

Siehe auch hier.

3.02 ersetze replacements

replace replacements: unglücklicher Name?

Dieser Schritt könnte mit Schritt 3.01 fusioniert werden. Ich sehe allerdings keine unmittelbare Notwendigkeit dafür.

Erlaube regexes? Beispiel s/\n<pb/<pb/, eventuell geschrieben als [\n<pb] = [<pb]

Going though all keys of %replacements for all text lines is computationally expensive, but I see no alternative here, unlike e.g. in step 2.07. Still good enough? Or does it make sense to group e.g.

{us} = us
{nu} = nu
{ni} = ni

as

{(us|nu|ni)} = $1

If yes: in the text or in the script?

Mit der Schreibweise von oben wäre das [{(us|nu|ni)}] = [$1]

3.03 ersetze escape sequences

Beachte außerdem:

  • \' (U+0027) kann im Text auch als \’ (U+2019) geschrieben sein (\' wurde in den DESpecs leider als \’ geschrieben; Problem von shortvrb, mit dem beispielsweise §\'§ im XeLaTeX-Quellcode der DESPecs im fertigen PDF zu \’ wird, usw.)

3.04 ersetze italics

Das Skript enthält einen einfachen hack, damit <_> nicht zu <<it>> wird. Die Alternative wäre, das Skript erst nach Schritt 3.06 auszuführen, aber dann würde die konzeptionelle Zweiteilung von Schritt 3 verlorengehen.

3.05 Metadaten, root element

<log> und <parameters> haben als namespace den default-namespace echo.

Es scheint mir sinnvoller, ein neues Metadatum <log> einzuführen, als den Inhalt in <dcterms:description> zu pressen.

Das Skript fügt auch ein DTD-Fragment ein, das den Text schemakonform macht, ohne dass man xml:space="preserve" in alle <s> schreiben muss. Auf die Skripte hat dies keinen Einfluss, aber es erleichtert das Bearbeiten des Textes in einem XML-Editor. Das Skript in Schritt 6.01, und allgemein jedes beliebige XSLT-Skript, löst als Nebeneffekt das DTD-Fragment wieder auf. Ein weiteres Skript wird das DTD-Fragment wieder einfügen können.

3.06 wohlgeformtes xml

4. schema-konform machen

Eine Ausnahme für das problemlose Durchlaufen kann das Skript für <s> sein.

Solange Tabellen noch nicht richtig verarbeitet werden (siehe Schritte 2.09 und 4.06), werden außerdem in Filter_4_00_Schummelskript Tabellen in <mgr> verwandelt, sodass sie korrekt aus dem Absatz herausgezogen werden.

4.01 <pb>

4.02 floats herausziehen

  • Vorsicht bei anchored marginal notes.
  • Prüfe bei anchors im Text, ob es eine zugehörige note auf der gleichen Seite gibt. Akzeptiere dabei kleine Abweichungen der Symbole voneinander, zum Beispiel 3) im Text und 3 in der Fußnote. Gib ansonsten eine Warnung aus.
  • Was passiert bei Floats in <h>, wenn sie nicht stillschweigend herausgeschoben werden können? Oder ist es besser, einen Fehler zu provozieren, weil solche <h> manchmal in Wirklichkeit <p type="title"> sind?
  • Beachte Fußnoten auf zwei Seiten.

4.03 <lb>

Das ist normalerweise geradlinig. Beachte Ausnahmen bei <pb> und <anchor>.

4.04 <s>

Details und die Syntax dafür habe ich mir noch nicht überlegt.

Beachte Fälle wie:

  • et.a.b.hoc est (hier normalisieren wir bisher die spaces, also „et .a.b. hoc est“)
  • .a.b:c.d:e.f.
  • .<lb/>a.b.
  • Wort-Abkürzungen
  • &c. etc.

Das Skript kann sich darauf verlassen, dass die Floats bereits aus dem Absatz herausgezogen sind. Dadurch wird das Markieren von <s> in Floats erleichtert. Das Skript kann sich aber nicht darauf verlassen, dass Wortabkürzungen bereits in <reg> sind. Der Punkt am Ende von <reg> zum Beispiel in ex .7. quinti <reg>Eucl.</reg> wird außerdem oft noch als Satzendepunkt gebraucht.

4.05 <emph>

Beachte:

  • <_> und <^> wurden in Schritt 3.06 in <sub> und <super> umbenannt.
  • <it> in einem Absatz in italics ergibt wieder upright.
  • Kombinationen wie it bf

4.06 tables

Beachte die unterschiedlichen Anweisungen in den DESpecs 1.1.2 und 2.0.

4.07 <div>

  • Automatisch erstellte <div> sind alle auf demselben level. Für eine hierarchische <div>-Struktur (z.B. mit front, body, back) muss die automatische <div>-Struktur per Hand nachbearbeitet werden.
  • n und level werden mit n="0" und level="0" gefüllt und erst im Schritt 6.01 korrekt durchnumeriert. Das Skript sollte die Skripte 6.01 und 6.02 intern aufrufen. (Problem, dass 4.07 bereits vom Schritt-4-Metafilter augerufen wird?)
  • Korrigiere <div> (automatisch?) bei den <head>, die eigentlich Footer sind.

Man kann bereits im raw text zum Beispiel <div type="body"> einzufügen (beachte: dann sollte auch der type in <text> geändert werden). Braucht man dazu ein tool, oder geht das so? Was ist die Verbindung zum <div>-Skript? Braucht man ein tool zur manuellen Nachbearbeitung der automatisch erstellten <div>?

4.08 Formatieren

5. Textanalyse

Die Hierarchie der inline-Elemente (z.B. <var> in plaintext, <ref> im inline model) legt vermutlich noch keine Verarbeitungsreihenfolge nahe.

5.01 <reg>

Beachte:

  • der modifier letter us ꝰ wird manchmal für ' gehalten
  • Problem der Wort-Abkürzungen mit Kasus, zum Beispiel ex .7. quinti Eucl.. Verwende dort <ref>, falls möglich.

Das Skript erwartet und hinterlässt den Text in NRC-Normalform. Escape sequences wie &apos;, die manche Text-Editoren für ' substituieren, werden aufgelöst.

Zum Problem veralteter Perl-Versionen in Mac OS X siehe hier.

5.02 <var>

5.03 <num>

(Verwende das Skript Filter_roman_numbers.pl: <num value="..."> für römische Zahlen.)

5.04 Formeln

Das Skript Filter_5_04_formulae soll korrektes MathML erzeugen (oder zumindest korrektes TeX, das dann umgewandelt werden kann). Inwieweit das realistisch ist, weiß ich noch nicht. Zumindest bei einfachen Brüchen wie {5/8} sollte das jedoch möglich sein.

5.05 <foreign>

5.06 GIS

5.07 Abgleich mit Donatus

5.08 allgemeines Test-Skript

6. weitere Skripte

6.01 div-Attribute

(Nummer anpassen)

Note that Oxygen 11.2 uses Saxon-PE 9.2.0.6 (i.e. "saxon-ee.jar Oxygen build"), whereas this Filter uses Saxon-HE 9.2.1.1 (see Oxygen forum).

Download von Saxon-HE hier. Auf dem Mac kann man es dann in das Verzeichnis /Applications/oxygen/lib/ kopieren, wo schon Saxon-EE ist.

6.02 Nebenwirkungen von XSLT ausgleichen

Ein Skript, das nach Anwenden eines XSLT-Skripts das DTD-Fragment wieder einfügt und weitere Nebeneffekte von XSLT-Skripten rückgängig macht, insbesondere die Formatierung der Präambel.

7. scholarly workflow

Anmerkungen

  • Figures nachbearbeiten und ausschneiden: Sollte das ans Ende von Schritt 2? (und beachte DESpecs 1.1.2 versus 2.0)

  • Wo werden sich überschneidende Hierarchien aufgelöst? Zum Beispiel Fußnoten, die auf der nächsten Seite weitergehen; Text flows mit getrennten Seitennumerierungen wie im Eipo-Text und den Conimbricenses; Absätze, die in einer column anfangen und in der nächsten column aufhören
  • Das Skript zur Normalisierung der Interpunktion (Filter_punctuation.pl) habe ich vorläufig weggelassen, weil es vermutlich merkwürdige Nebenwirkungen hat. Zum Beispiel spaces vor „:“ weg. (Hier ist die Frage, ob wir Information verlieren, die wir gerne konservieren würden. Beispiel „EPISTOL AE“). Ziel ist wieder, dass sich die folgenden Skripte auf ein einheitliches Format verlassen können. Beispielsweise müsste das reg-Skript, das unter anderem q; durch que ersetzt, nicht noch prüfen, ob es q ; gibt.
  • Filter_Archimedes_to_ECHO.pl: Dieses Skript habe ich für die Umwandlung von Song Yingxing verwendet. Für europäische Texte müsste es überarbeitet werden.

Besonderheiten bei chinesischen Texten

Zeichenvarianten

Andere Workflows

Wenn Zwischenformat: Nützt es etwas, die doc-Datei als "Office Open XML"-Text abspeichern, oder ist es einfacher, ihn anders zu bearbeiten?

Last modified 13 years ago Last modified on Feb 22, 2011, 3:21:37 PM

Attachments (1)

Download all attachments as: .zip