Aus InDesign-Dokument automatisiert JavaScript/JSX generieren

Kann man in InDesign Objekte erstellen und daraus direkt den JavaScript Code generieren lassen?
Ja, das geht!

Mit einem Skript kann man in InDesign nicht nur Strukturen erstellen sondern auch auslesen.
Wir haben ein Script geschrieben, das in einem InDesign Dokument einige Beispiel-Objekte (alle wären zu viele) untersucht und daraus den JavaScript Code erstellt der diese Objekte generieren würde.

Script Download: gd_indd2jsx-1.3.jsxbin
Es erstellt eine neue JSX Datei direkt neben dem Script, mit dem Suffix _GENERATED.jsx

Die momentane Version erstellt bereits für folgende InDesign-Objekte den entsprechenden JavaScript Code:

  • Document, DocumentPreference
  • Colors,
  • Layers,
  • CharacterStyleGroups,
  • CharacterStyles,
  • Pages,
  • PageItems: Rectangles, Ovals, GraphicLines, Polygons, TextFrames

Das Script generiert korrekten JavaScript Code, bei Bedarf kann man auch die Dokumentation der Properties erzeugen lassen.

Einschränkungen:
- sammelt PageItems nur auf der obersten Ebene (also nicht verschachtelt)
- referenzierte Objekte, die wir noch nicht umgesetzt haben, werden auskommentiert, man sieht aber den Typ (z. Bsp: // strokeColor : [object Color])
- Code ist manchmal nicht direkt ausführbar, da InDesign eventuell nicht im erwarteten State ist. Das liegt an globalen Einstellungen.

Die Information, welche Objekte es gibt und welche Properties die Objekte haben, holt das Script aus dem "Adobe InDesign CS6 (8.0) Object Model" das im XML Format zur Verfügung steht. Bei älteren InDesign Versionen werden unbekannte Properties bei der Generierung auskommentiert.

Hinweis: Das Script ist wirklich nur zur Veranschaulichung gedacht, um zu sehen, wie JavaScript Objekte erstellt werden und wie ihre Properties gesetzt werden. Auch Arrays mit Enumerations werden korrekt generiert.


Beispiel: Folgendes InDesign-Dokument mit

  • 1 Rectangle
  • 2 Layers
  • 1 CharacterStyleGroup
  • 1 CharacterStyle (innerhalb der Group)

 gd_indd2jsx screenshot

 

erstellt folgenden JavaScript-JSX Code (Syntaxt Highlighting with http://tohtml.com/jScript/, Style: neo)

 

#target InDesign
/*
This code was generated by the gd_indd2jsx script.
Object and property information is taken from the
  Adobe InDesign CS6 (8.0) Object Model
This file contains valid JavaScript code but is only for learning purposes.
It is not meant to run out of the box, because of some "current state" problems.
Start with an empty document and run this script... to see what and how it is generated.
Then create some rectangles and run this script...
Then create some more components...
Further infos, new versions and contact at:
www.greifdesign.net (Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!)
*/

// ###########################################################
// ##  create new/empty document
// ###########################################################

app.documents.add()

// ###########################################################
// ##  helpers
// ###########################################################

function renameOldLayers() {
    for (var i=0; i<doc.layers.length; i++) {
        doc.layers[i].name += "_old"
    }
}
doc = app.activeDocument

// ###########################################################
// ##  rename existing layers
// ###########################################################

renameOldLayers()
layers = {}

// ###########################################################
// ##  create layer
// ###########################################################

layer = doc.layers.add({
    name : "MyLayer",
    visible : true,
    locked : true,
    layerColor : UIColors.LIGHT_BLUE,
    ignoreWrap : false,
    showGuides : true,
    lockGuides : false,
    printable : true,
    label : "",
    // properties : [object Object],
})
layers["MyLayer"] = layer

// ###########################################################
// ##  create layer
// ###########################################################

layer = doc.layers.add({
    name : "Layer 1",
    visible : true,
    locked : false,
    layerColor : UIColors.BROWN,
    ignoreWrap : false,
    showGuides : true,
    lockGuides : false,
    printable : true,
    label : "",
    // properties : [object Object],
})
layers["Layer 1"] = layer

// ###########################################################
// ##  create character style groups
// ###########################################################

characterStyleGroups = {}

// ###########################################################
// ##  create character style group
// ###########################################################

characterStyleGroup0 = doc.characterStyleGroups.add({
    name : "sample-group",
    label : "",
    // properties : [object Object],
})
characterStyleGroups["sample-group"] = characterStyleGroup0

// ###########################################################
// ##  create character styles
// ###########################################################

characterStyles = {}
characterStyles["[None]"] = doc.characterStyles.itemByName("[None]")

// ###########################################################
// ##  create character style
// ###########################################################

characterStyle = characterStyleGroups["sample-group"].characterStyles.add({
    basedOn : "None",
    appliedFont : "",
    fontStyle : NothingEnum.NOTHING,
    pointSize : NothingEnum.NOTHING,
    leading : NothingEnum.NOTHING,
    kerningMethod : NothingEnum.NOTHING,
    tracking : NothingEnum.NOTHING,
    capitalization : NothingEnum.NOTHING,
    position : NothingEnum.NOTHING,
    underline : NothingEnum.NOTHING,
    strikeThru : NothingEnum.NOTHING,
    ligatures : NothingEnum.NOTHING,
    noBreak : NothingEnum.NOTHING,
    horizontalScale : NothingEnum.NOTHING,
    verticalScale : NothingEnum.NOTHING,
    baselineShift : NothingEnum.NOTHING,
    skew : NothingEnum.NOTHING,
    fillTint : NothingEnum.NOTHING,
    strokeTint : NothingEnum.NOTHING,
    strokeWeight : NothingEnum.NOTHING,
    overprintStroke : NothingEnum.NOTHING,
    overprintFill : NothingEnum.NOTHING,
    otfFigureStyle : NothingEnum.NOTHING,
    otfOrdinal : NothingEnum.NOTHING,
    otfFraction : NothingEnum.NOTHING,
    otfDiscretionaryLigature : NothingEnum.NOTHING,
    otfTitling : NothingEnum.NOTHING,
    otfContextualAlternate : NothingEnum.NOTHING,
    otfSwash : NothingEnum.NOTHING,
    underlineColor : null,
    underlineGapColor : null,
    underlineTint : NothingEnum.NOTHING,
    underlineGapTint : NothingEnum.NOTHING,
    underlineOverprint : NothingEnum.NOTHING,
    underlineGapOverprint : NothingEnum.NOTHING,
    underlineType : null,
    underlineOffset : NothingEnum.NOTHING,
    underlineWeight : NothingEnum.NOTHING,
    strikeThroughColor : null,
    strikeThroughGapColor : null,
    strikeThroughTint : NothingEnum.NOTHING,
    strikeThroughGapTint : NothingEnum.NOTHING,
    strikeThroughOverprint : NothingEnum.NOTHING,
    strikeThroughGapOverprint : NothingEnum.NOTHING,
    strikeThroughType : null,
    strikeThroughOffset : NothingEnum.NOTHING,
    strikeThroughWeight : NothingEnum.NOTHING,
    fillColor : null,
    strokeColor : null,
    appliedLanguage : null,
    otfSlashedZero : NothingEnum.NOTHING,
    otfHistorical : NothingEnum.NOTHING,
    otfStylisticSets : NothingEnum.NOTHING,
    gradientFillLength : NothingEnum.NOTHING,
    gradientFillAngle : NothingEnum.NOTHING,
    gradientStrokeLength : NothingEnum.NOTHING,
    gradientStrokeAngle : NothingEnum.NOTHING,
    gradientFillStart : NothingEnum.NOTHING,
    gradientStrokeStart : NothingEnum.NOTHING,
    otfMark : NothingEnum.NOTHING,
    otfLocale : NothingEnum.NOTHING,
    positionalForm : NothingEnum.NOTHING,
    name : "sample-character-style",
    previewColor : NothingEnum.NOTHING,
    miterLimit : NothingEnum.NOTHING,
    strokeAlignment : NothingEnum.NOTHING,
    endJoin : NothingEnum.NOTHING,
    otfOverlapSwash : NothingEnum.NOTHING,
    otfStylisticAlternate : NothingEnum.NOTHING,
    otfJustificationAlternate : NothingEnum.NOTHING,
    otfStretchedAlternate : NothingEnum.NOTHING,
    characterDirection : NothingEnum.NOTHING,
    keyboardDirection : NothingEnum.NOTHING,
    digitsType : NothingEnum.NOTHING,
    kashidas : NothingEnum.NOTHING,
    diacriticPosition : NothingEnum.NOTHING,
    xOffsetDiacritic : NothingEnum.NOTHING,
    yOffsetDiacritic : NothingEnum.NOTHING,
    characterAlignment : NothingEnum.NOTHING,
    tsume : NothingEnum.NOTHING,
    leadingAki : NothingEnum.NOTHING,
    trailingAki : NothingEnum.NOTHING,
    characterRotation : NothingEnum.NOTHING,
    jidori : NothingEnum.NOTHING,
    shataiMagnification : NothingEnum.NOTHING,
    shataiDegreeAngle : NothingEnum.NOTHING,
    shataiAdjustRotation : NothingEnum.NOTHING,
    shataiAdjustTsume : NothingEnum.NOTHING,
    tatechuyoko : NothingEnum.NOTHING,
    tatechuyokoXOffset : NothingEnum.NOTHING,
    tatechuyokoYOffset : NothingEnum.NOTHING,
    kentenFillColor : null,
    kentenStrokeColor : null,
    kentenTint : NothingEnum.NOTHING,
    kentenStrokeTint : NothingEnum.NOTHING,
    kentenWeight : NothingEnum.NOTHING,
    kentenOverprintFill : NothingEnum.NOTHING,
    kentenOverprintStroke : NothingEnum.NOTHING,
    kentenKind : NothingEnum.NOTHING,
    kentenPlacement : NothingEnum.NOTHING,
    kentenAlignment : NothingEnum.NOTHING,
    kentenPosition : NothingEnum.NOTHING,
    kentenFont : null,
    kentenFontStyle : NothingEnum.NOTHING,
    kentenFontSize : NothingEnum.NOTHING,
    kentenXScale : NothingEnum.NOTHING,
    kentenYScale : NothingEnum.NOTHING,
    kentenCustomCharacter : NothingEnum.NOTHING,
    kentenCharacterSet : NothingEnum.NOTHING,
    rubyFill : null,
    rubyStroke : null,
    rubyTint : NothingEnum.NOTHING,
    rubyWeight : NothingEnum.NOTHING,
    rubyOverprintFill : NothingEnum.NOTHING,
    rubyOverprintStroke : NothingEnum.NOTHING,
    rubyStrokeTint : NothingEnum.NOTHING,
    rubyFont : null,
    rubyFontStyle : NothingEnum.NOTHING,
    rubyFontSize : NothingEnum.NOTHING,
    rubyOpenTypePro : NothingEnum.NOTHING,
    rubyXScale : NothingEnum.NOTHING,
    rubyYScale : NothingEnum.NOTHING,
    rubyType : NothingEnum.NOTHING,
    rubyAlignment : NothingEnum.NOTHING,
    rubyPosition : NothingEnum.NOTHING,
    rubyXOffset : NothingEnum.NOTHING,
    rubyYOffset : NothingEnum.NOTHING,
    rubyParentSpacing : NothingEnum.NOTHING,
    rubyAutoAlign : NothingEnum.NOTHING,
    rubyOverhang : NothingEnum.NOTHING,
    rubyAutoScaling : NothingEnum.NOTHING,
    rubyParentScalingPercent : NothingEnum.NOTHING,
    rubyParentOverhangAmount : NothingEnum.NOTHING,
    warichu : NothingEnum.NOTHING,
    warichuSize : NothingEnum.NOTHING,
    warichuLines : NothingEnum.NOTHING,
    warichuLineSpacing : NothingEnum.NOTHING,
    warichuAlignment : NothingEnum.NOTHING,
    warichuCharsAfterBreak : NothingEnum.NOTHING,
    warichuCharsBeforeBreak : NothingEnum.NOTHING,
    otfProportionalMetrics : NothingEnum.NOTHING,
    otfHVKana : NothingEnum.NOTHING,
    otfRomanItalics : NothingEnum.NOTHING,
    scaleAffectsLineHeight : NothingEnum.NOTHING,
    cjkGridTracking : NothingEnum.NOTHING,
    glyphForm : NothingEnum.NOTHING,
    rubyAutoTcyDigits : NothingEnum.NOTHING,
    rubyAutoTcyIncludeRoman : NothingEnum.NOTHING,
    rubyAutoTcyAutoScale : NothingEnum.NOTHING,
    label : "",
    // properties : [object Object],
})
characterStyles["sample-character-style"] = characterStyle

// ###########################################################
// ##  set character style based on properties
// ###########################################################


// ###########################################################
// ##  document properties
// ###########################################################

doc.zeroPoint = [0, 0]
doc.label = ""
doc.activeLayer = layers["MyLayer"]
doc.cmykProfile = ""
doc.rgbProfile = ""
doc.solidColorIntent = RenderingIntent.USE_COLOR_SETTINGS
doc.afterBlendingIntent = RenderingIntent.USE_COLOR_SETTINGS
doc.defaultImageIntent = RenderingIntent.USE_COLOR_SETTINGS
doc.rgbPolicy = ColorSettingsPolicy.COLOR_POLICY_OFF
doc.cmykPolicy = ColorSettingsPolicy.COLOR_POLICY_OFF
doc.accurateLABSpots = false
doc.selection = []
doc.selectionKeyObject = null
// doc.properties = [object Object]

// ###########################################################
// ##  page 1
// ###########################################################

page = doc.pages[0]
page.layoutRule = LayoutRuleOptions.USE_MASTER
page.snapshotBlendingMode = SnapshotBlendingModes.IGNORE_LAYOUT_SNAPSHOTS
page.optionalPage = false
// page.appliedTrapPreset = [object TrapPreset]
page.pageColor = PageColorOptions.USE_MASTER_COLOR
// page.appliedMaster = [object MasterSpread]
// page.masterPageTransform = [object TransformationMatrix]
page.tabOrder = []
page.label = ""
// page.properties = [object Object]

// ###########################################################
// ##  create rectangles
// ###########################################################

rectangle = page.rectangles.add({
    storyTitle : "",
    contentType : ContentType.GRAPHIC_TYPE,
//    allowOverrides // The property is not applicable in the current state.
    horizontalLayoutConstraints : [DimensionsConstraints.FLEXIBLE_DIMENSION, DimensionsConstraints.FIXED_DIMENSION, DimensionsConstraints.FLEXIBLE_DIMENSION],
    verticalLayoutConstraints : [DimensionsConstraints.FLEXIBLE_DIMENSION, DimensionsConstraints.FIXED_DIMENSION, DimensionsConstraints.FLEXIBLE_DIMENSION],
    geometricBounds : [39.1666666663972, 29.9999999999681, 78.1666666663972, 103],
    visibleBounds : [38.9902777775083, 29.8236111110792, 78.3430555552861, 103.176388888889],
    // fillColor : [object Swatch],
    fillTint : -1,
//    overprintFill // The property is not applicable in the current state.
    strokeWeight : 1,
    miterLimit : 4,
    endCap : EndCap.BUTT_END_CAP,
    endJoin : EndJoin.MITER_END_JOIN,
    // strokeType : [object StrokeStyle],
//    strokeCornerAdjustment // The property is not applicable in the current state.
//    strokeDashAndGap // The property is not applicable in the current state.
    leftLineEnd : ArrowHead.NONE,
    rightLineEnd : ArrowHead.NONE,
    // strokeColor : [object Color],
    strokeTint : -1,
    gradientFillStart : [104.999999999968, 148.499999999731],
    gradientFillLength : 0,
    gradientFillAngle : 0,
    gradientStrokeStart : [104.999999999968, 148.499999999731],
    gradientStrokeLength : 0,
    gradientStrokeAngle : 0,
    overprintStroke : false,
    // gapColor : [object Swatch],
    gapTint : -1,
//    overprintGap // The property is not applicable in the current state.
    strokeAlignment : StrokeAlignment.CENTER_ALIGNMENT,
    nonprinting : false,
    itemLayer : layers["Layer 1"],
    locked : false,
    localDisplaySetting : DisplaySettingOptions.DEFAULT_VALUE,
    rotationAngle : 0,
    shearAngle : 0,
    horizontalScale : 100,
    verticalScale : 100,
    absoluteRotationAngle : 0,
    absoluteShearAngle : 0,
    absoluteHorizontalScale : 100,
    absoluteVerticalScale : 100,
    // appliedObjectStyle : [object ObjectStyle],
    flip : Flip.NONE,
    absoluteFlip : Flip.NONE,
    visible : true,
    name : "",
    topLeftCornerOption : CornerOptions.NONE,
    topRightCornerOption : CornerOptions.NONE,
    bottomLeftCornerOption : CornerOptions.NONE,
    bottomRightCornerOption : CornerOptions.NONE,
    topLeftCornerRadius : 4.23333333333333,
    topRightCornerRadius : 4.23333333333333,
    bottomLeftCornerRadius : 4.23333333333333,
    bottomRightCornerRadius : 4.23333333333333,
    label : "",
    // properties : [object Object],
})

// ###########################################################
// ##  create ovals
// ###########################################################


// ###########################################################
// ##  create graphic lines
// ###########################################################


// ###########################################################
// ##  create polygons
// ###########################################################


// ###########################################################
// ##  create text frames
// ###########################################################


// ###########################################################
// ##  page 1
// ###########################################################


// create page

page = doc.pages.add({
    layoutRule : LayoutRuleOptions.USE_MASTER,
    snapshotBlendingMode : SnapshotBlendingModes.IGNORE_LAYOUT_SNAPSHOTS,
    optionalPage : false,
    // appliedTrapPreset : [object TrapPreset],
    pageColor : PageColorOptions.USE_MASTER_COLOR,
    // appliedMaster : [object MasterSpread],
    // masterPageTransform : [object TransformationMatrix],
    tabOrder : [],
    label : "",
    // properties : [object Object],
})

// ###########################################################
// ##  create rectangles
// ###########################################################


// ###########################################################
// ##  create ovals
// ###########################################################

oval = page.ovals.add({
    storyTitle : "",
    contentType : ContentType.UNASSIGNED,
//    allowOverrides // The property is not applicable in the current state.
    horizontalLayoutConstraints : [DimensionsConstraints.FLEXIBLE_DIMENSION, DimensionsConstraints.FIXED_DIMENSION, DimensionsConstraints.FLEXIBLE_DIMENSION],
    verticalLayoutConstraints : [DimensionsConstraints.FLEXIBLE_DIMENSION, DimensionsConstraints.FIXED_DIMENSION, DimensionsConstraints.FLEXIBLE_DIMENSION],
    geometricBounds : [47.666666666936, 51, 108.000000000269, 120.666666666635],
    visibleBounds : [47.4902777780472, 50.8236111111111, 108.176388889158, 120.843055555524],
    // fillColor : [object Swatch],
    fillTint : -1,
//    overprintFill // The property is not applicable in the current state.
    strokeWeight : 1,
    miterLimit : 4,
    endCap : EndCap.BUTT_END_CAP,
    endJoin : EndJoin.MITER_END_JOIN,
    // strokeType : [object StrokeStyle],
//    strokeCornerAdjustment // The property is not applicable in the current state.
//    strokeDashAndGap // The property is not applicable in the current state.
    leftLineEnd : ArrowHead.NONE,
    rightLineEnd : ArrowHead.NONE,
    // strokeColor : [object Color],
    strokeTint : -1,
    gradientFillStart : [104.999999999968, -211.999999999731],
    gradientFillLength : 0,
    gradientFillAngle : 0,
    gradientStrokeStart : [104.999999999968, -211.999999999731],
    gradientStrokeLength : 0,
    gradientStrokeAngle : 0,
    overprintStroke : false,
    // gapColor : [object Swatch],
    gapTint : -1,
//    overprintGap // The property is not applicable in the current state.
    strokeAlignment : StrokeAlignment.CENTER_ALIGNMENT,
    nonprinting : false,
    itemLayer : layers["Layer 1"],
    locked : false,
    localDisplaySetting : DisplaySettingOptions.DEFAULT_VALUE,
    rotationAngle : 0,
    shearAngle : 0,
    horizontalScale : 100,
    verticalScale : 100,
    absoluteRotationAngle : 0,
    absoluteShearAngle : 0,
    absoluteHorizontalScale : 100,
    absoluteVerticalScale : 100,
    // appliedObjectStyle : [object ObjectStyle],
    flip : Flip.NONE,
    absoluteFlip : Flip.NONE,
    visible : true,
    name : "",
    topLeftCornerOption : CornerOptions.NONE,
    topRightCornerOption : CornerOptions.NONE,
    bottomLeftCornerOption : CornerOptions.NONE,
    bottomRightCornerOption : CornerOptions.NONE,
    topLeftCornerRadius : 4.23333333333333,
    topRightCornerRadius : 4.23333333333333,
    bottomLeftCornerRadius : 4.23333333333333,
    bottomRightCornerRadius : 4.23333333333333,
    label : "",
    // properties : [object Object],
})

// ###########################################################
// ##  create graphic lines
// ###########################################################

graphicLine = page.graphicLines.add({
    contentType : ContentType.UNASSIGNED,
//    allowOverrides // The property is not applicable in the current state.
    horizontalLayoutConstraints : [DimensionsConstraints.FLEXIBLE_DIMENSION, DimensionsConstraints.FIXED_DIMENSION, DimensionsConstraints.FLEXIBLE_DIMENSION],
    verticalLayoutConstraints : [DimensionsConstraints.FLEXIBLE_DIMENSION, DimensionsConstraints.FIXED_DIMENSION, DimensionsConstraints.FLEXIBLE_DIMENSION],
    geometricBounds : [133.000000000269, 43.6666666666347, 203, 130.333333333301],
    visibleBounds : [132.862779819872, 43.5558349824681, 203.137220180397, 130.444165017468],
    // fillColor : [object Swatch],
    fillTint : -1,
//    overprintFill // The property is not applicable in the current state.
    strokeWeight : 1,
    miterLimit : 4,
    endCap : EndCap.BUTT_END_CAP,
    endJoin : EndJoin.MITER_END_JOIN,
    // strokeType : [object StrokeStyle],
//    strokeCornerAdjustment // The property is not applicable in the current state.
//    strokeDashAndGap // The property is not applicable in the current state.
    leftLineEnd : ArrowHead.NONE,
    rightLineEnd : ArrowHead.NONE,
    // strokeColor : [object Color],
    strokeTint : -1,
    gradientFillStart : [104.999999999968, -211.999999999731],
    gradientFillLength : 0,
    gradientFillAngle : 0,
    gradientStrokeStart : [104.999999999968, -211.999999999731],
    gradientStrokeLength : 0,
    gradientStrokeAngle : 0,
    overprintStroke : false,
    // gapColor : [object Swatch],
    gapTint : -1,
//    overprintGap // The property is not applicable in the current state.
    strokeAlignment : StrokeAlignment.CENTER_ALIGNMENT,
    nonprinting : false,
    itemLayer : layers["Layer 1"],
    locked : false,
    localDisplaySetting : DisplaySettingOptions.DEFAULT_VALUE,
    rotationAngle : 0,
    shearAngle : 0,
    horizontalScale : 100,
    verticalScale : 100,
    absoluteRotationAngle : 0,
    absoluteShearAngle : 0,
    absoluteHorizontalScale : 100,
    absoluteVerticalScale : 100,
    // appliedObjectStyle : [object ObjectStyle],
    flip : Flip.NONE,
    absoluteFlip : Flip.NONE,
    visible : true,
    name : "",
    topLeftCornerOption : CornerOptions.NONE,
    topRightCornerOption : CornerOptions.NONE,
    bottomLeftCornerOption : CornerOptions.NONE,
    bottomRightCornerOption : CornerOptions.NONE,
    topLeftCornerRadius : 4.23333333333333,
    topRightCornerRadius : 4.23333333333333,
    bottomLeftCornerRadius : 4.23333333333333,
    bottomRightCornerRadius : 4.23333333333333,
    label : "",
    // properties : [object Object],
})

// ###########################################################
// ##  create polygons
// ###########################################################


// ###########################################################
// ##  create text frames
// ###########################################################