Einstellungen des EPUB-Exports sichern + wiederherstellen

Wer regelmäßig E-Books aus InDesign exportiert findet früher oder später die für seine Arbeitsweise und Dokumentenstruktur passenden Einstellungen für den EPUB-Export. Das Problem ist, diese Optionen werden nur pro Dokument gespeichert und müssen bei neuen Dokumenten erneut vorgenommen werden. Praktisch wäre die Möglichkeit diese Einstellungen in einem Preset zu sichern und dann bei Bedarf vor dem Export zu laden – ganz ähnlich den PDF-Exportvorgaben.

Dazu habe ich zwei kleine Skripte geschrieben, die ich auf meiner Firmenseite zum Download anbiete.

savePreset

Dialog des Skript saveEpubPreset.jsx

Das Skript saveEpubPreset.jsx speichert die aktuellen Exportoptionen unter einem vom Benutzer vorgegebenen Namen.

loadPreset

Dialog des Skripts loadEpubPreset.jsx

Mit dem Skript loadEpubPreset.jsx kann eine gespeicherte Exportvorgabe geladen werden. Bei jedem Export wird eine Datei mit den Optionen für das umfließende Layout (reflow) und das feste Layout (fixed) gespeichert.

scriptFolderDie Einstellungen werden als JSON-Objekt in einer Textdatei im Ordner epubPreset, der neben dem Skript erstellt wird, gespeichert. Diese Presets sind innerhalb einer InDesign-Version kompatibel. Bei den Versionsupdates gab es jeweils nur kleine Anpassungen, so dass man auch alte Presets laden kann, aber die Einstellungen kontrollieren sollte. Danach einfach neu abspeichern und fertig ist das Update.
Die Dateien mit der Endung .epuboptions enthalten die Presets und können natürlich auch weitergegeben bzw. veröffentlicht werden.

Für die Programmierer noch ein Blick auf die Umsetzung: Das Skript wertet die Objekte epubExportPreferences bzw. epubFixedLayoutExportPreferences aus und wandelt dieses mit Hilfe der Funktion toSource() in ein JSON-String um.

Interessant ist hier noch die Funktion createObject() die auch Eigenschaften die Objekte enthalten rekursiv in ein großes JSON-Objekt konvertiert und Aufzählungen (Enumerator) mit valueOf() in die tatsächlichen Werte konvertiert. Außerdem werden schreibgeschütze Eigenschaften wie z.B. id oder parent mit delete aus dem Objekt entfernt. Diese Funktion kann auch in anderen Zusammenhängen zum Speichern oder Vergleichen von Objekten verwendet werden.

Beim Einlesen verwende ich die Funktion eval() um den JSON-String aus der Textdatei zu einem Objekt zu konvertieren und mache mir dann die Eigenschaft properties zu Nutze. Mit ihr kann man mehrere Eigenschaften des Objekts gleichzeitig setzen – ich weise also einfach das gesamte Objekt zu und habe somit alle Eigenschaften des Exports gesetzt.

3 Kommentare

  1. Martin Fischer 18. Juni 2016 um 13:18

    Sehr schön!
    Die createObject ()-Funktion gefällt mir.
    Will mal sehn, ob und wie ich diese für ein RecordFindChange_Settings-Skript verwenden kann.

    Vielen Dank für’s Teilen.

  2. Martin Fischer 18. Juni 2016 um 13:34

    Zur Verwendung von createObject() beim Aufzeichnen von RecordFindChange-Settings:

    Sieht vielversprechend aus.
    Aber einzelne Properties (z.B. Formate in Gruppen) müssen nachberarbeitet werden.

    Code:
    var find_change = new Object();
    find_change.findGrep = createObject(app.findGrepPreferences);
    find_change.changeGrep = createObject(app.changeGrepPreferences);

    $.writeln( find_change.findGrep.toSource());
    $.writeln( find_change.changeGrep.toSource());

    function createObject (object) {
    if (object == null) return null;
    if (object == undefined) return undefined;
    if( object.hasOwnProperty(„properties“) ) {
    object = object.properties;
    delete object.index;
    delete object.id;
    delete object.parent;
    delete object.events;
    delete object.eventListeners;
    delete object.isValid;
    delete object.level;
    // delete strange things
    delete object.numberingRestartPolicies;
    delete object.bulletChar;
    for (var i in object)
    {
    if (object[i] == 1851876449 || object[i] == „“ || object[i] == null )
    delete object[i];
    }

    for ( var property in object ) {
    object[property] = createObject(object[property]);
    }
    } else if ( object.constructor.name == „Enumerator“ ) {
    object = object.valueOf();
    }
    return object;
    }

  3. Hallo Martin,

    die createObject() Funktion ist leider (noch) nicht generisch, sondern muss jedesmal noch angepasst werden. Danke für deine Inputs.

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.