Migrieren beliebiger Webinhalte nach Plone

Mit collective.transmogrifier lassen sich sog. Pipelines für den Ex- und Import von Webinhalten konfigurieren. Und zum Crawlen und Parsen einer statischen Website wird funnelweb verwendet.

Am Beispiel der auf dem Documentation-Server Sphinx basierenden Website des Plone-Nutzerhandbuch zeige ich exemplarisch, wie eine solche Migration aussehen kann: https://dev.veit-schiele.de/svn/plone-nutzerhandbuch/trunk/

Voraussetzungen

  • Git

    Linux:

    $ sudo apt-get install git-core
    

    Mac:

    $ sudo port install git-core
    

Installation

Erstellen des migration-Skripts:

$ ./bin/buildout -c migration.cfg

Aufrufen des Skripts mit:

$ ./bin/migration --ploneupload:target=http://admin:secret@localhost:8080/Plone/documentation/manual/plone-nutzerhandbuch

Anmerkung 1: In userem Fall wird das Plone-Nutzerhandbuch in eine lokale Plone-Site mit der ID Plone importiert wobei das Plone Help Center die ID documentation und das reference Manual die ID plone-nutzerhandbuch hat. Falls Sie die Dokumentation in eine andere Plone-Site mit anderen HTTP Basic Auth-Credentials importieren möchten, können Sie diese Zeile selbstverständlich entsprechend abändern.

Folgende Schritte werden während der Migration ausgeführt:

  1. Aus der Sphinx-Dokumentation werden Titel, Beschreibung und Haupttext von jeder Seite extrahiert.
  2. Anschließend werden die Inhalte für das Plone Help Center mit XML-RPC erzeugt.
  3. Veröffentlichen der Artikel sofern notwendig und Verstecken des Ordners, der die Bilder enthält in der Navigation.

Anmerkung 2: Das Skript zum Hochladen der Dateien überschreibt momentan noch nicht bereits vorhandene Artikel. Falls Seiten umbenannt oder verschoben wurden, sollte zunächst die gesamte Dokumentation gelöscht werden bevor die Dateien erneut hochgeladen werden.

Konfiguration

migration.cfg

Das Skript bin/migration wird erstellt mit der in der migration.cfg angegebenen Konfiguration:

[buildout]
…
migration

[migration]
recipe = funnelweb
crawler-url=file://${buildout:directory}/docs/html
crawler-ignore=
    cgi-bin
    javascript:
    _static
    _sources
    genindex\.html
    search\.html
    saesrchindex\.js
cache-output =
template1-title = text //div[@class='body']//h1[1]
template1-_permalink = text //div[@class='body']//a[@class='headerlink']
template1-text = html //div[@class='body']
template1-_label = optional //p[contains(@class,'admonition-title')]
template1-description = optional //div[contains(@class,'admonition-description')]/p[@class='last']/text()
template1-_remove_useless_links = optional //div[@id = 'indices-and-tables']
templateauto-condition = python:False
titleguess-condition = python:True
indexguess-condition = python:True
hideguess-condition =  python:item.get("_path","").startswith('_images') and item.get('_type')=='Folder'
changetype-value=python:{'Folder':'HelpCenterReferenceManualSection','Document':'HelpCenterLeafPage'}.get(item['_type'],item['_type'])
ploneprune-condition=python:item.get('_type') in ['HelpCenterReferenceManualSection','HelpCenterReferenceManual'] or item['_path'] == ''
recipe
Verwendet wird funnelweb. Weitere Informationen zu diesem Abschnitt erhalten Sie auf der Homepage.
crawler-url
legt die zu migrierende Website fest, in unserem Fall file://${buildout:directory}/docs/html. Es könnte jedoch auch eine URL wie z.B. http://www.plone-nutzerhandbuch.de angegeben werden.
crawler-ignore

Links, denen nicht gefolgt werden soll, können mit regulären Ausdrücken angegeben werden.

In Falle des Documentation Servers Sphinx werden u.a. die Verzeichnisse _static und _sources ignoriert.

cache-output
Da unsere Inhalte aus dem Dateisystem kommen, ist hier kein lokaler Cache nötig.
titleguess-condition, indexguess-condition
Bilder erhalten ihren Titel aus dem Backlink-Text
hideguess-condition
Bilder werden nicht in der Navigation angezeigt
changetype-value
Statt Ordnern werden HelpCenterLeafPage- und statt Seiten HelpCenterLeafPage-Artikeltypen angelegt
ploneprune-condition
Die Inhalt aller ordnerähnlichen Artikel wird daraufhin überprüft, ob sie Inhalte enthalten, die noch nicht lokal gespeichert sind.

pipeline.cfg

Die pipeline.cfg definiert dann die Reihenfolge, in der die Anweisungen abgearbeitet werden. Ein Beispiel finden Sie wieder für das Plone-Nutzerhandbuch: pipeline.cfg

drop-resources
filtert Ressourcen wie css-, Javascript- und Anwendungen aus
drop-unneeded-html
filtert nicht benötigten HTML-Code aus
treeserializer
muss vor dem localconstructor ausgeführt werden
templatefinder

extrahiert Titel, Beschreibung und Haupttext aus den von Sphinx generierten Seiten.

Beachten Sie bitte, dass Note-Leerzeichen in XPaths als   angegeben werden müssen.

Weitere Infos zu XPath erhalten Sie unter

mark-container-remote-content-type
erstellt einen Hinweis, sodass Verzeichnisse beim Hochladen als HelpCenterReferenceManualSection angelegt werden
mark-page-remote-content-type
erstellt einen Hinweis, sodass HTML-Dateien beim Hochladen als HelpCenterLeafPage-Artikel angelegt werden
mark-image-folders-to-navigation-exclusion
versteckt den images-Ordner in der Navigation.
mark-remote-folder-to-be-cleaned
überprüft, ob ein Ordner Objekte enthält, die noch nicht lokal gespeichert wurden.
mark-remote-root-to-be-cleaned
löscht alle Inhalte aus dem ausgewählten Reference Manual
topublish

erstellt einen Hinweis, damit nach dem Hochladen der Workflow-Status auf veröffentlicht gesetzt wird.

Dabei wird berücksichtigt, dass Bilder keinen Workflow unterliegen.

ploneuploader
erstellt die Artikel in der Plone-Site
schemaupdater
aktualisiert die Inhalte der Plone-Site mit den extrahierten Inhalten aus der Sphinx-Dokumentation
set-folder-default-page
setzt index.html als Standardseite eines Ordners
publish
veröffentlicht die hochgeladene Dokumentation sofern sie noch nicht veröffentlicht ist
excludefromnavigation
versteckt Artikel in der Navigation
cleanremotefolder
löscht Objekte, die auf der Plone-Site sind, jedoch nicht in der lokalen Kopie