Your prescription for increased productivity and profitability
I often tell students that with power comes difficulty. True, the more power a program offers, the more difficult it becomes–the more there is to learn. So it is with using XML in InDesign. The previous blogs open the door; but to really cover the subject would require a fairly sizable book. Before we leave the subject of XML, however, there’s one more approach that needs some exposure: using auto tag. Our sample script creates a document with paragraph styles and XML tags which are then mapped. Dummy text is placed in a default text frame and styled. Because paragraph styles are mapped to XML tags, the document is ready for importing an XML text file that uses the same XML tagging.
To condense the script as much as possible, a default document is created and repeat loops are used to create styles and tags. The script assumes that the default document is a single page with the same margins for left and right. Also, no code has been added to check for user error. We will leave this up to the reader. You might want to spend some time figuring out how style pointers (in stylePtr list) are used to define the style to apply to each paragraph of dummy text.
(*Uses repeat structures to create paragraph and XML tags, style text and then apply style to tag mapping.*) --lists in list define style name, size, space before, and first line indent set styleList to {{"Heading1", 24, 0, 0}, {"Heading2", 14, 12, 0}, {"Para1", 12, 9, 0}, {"Body", 12, 0, 24}} set styleRef to {} set myText to "Headline 1" & return & "Paragraph 1 of my story" & return & ¬ "Paragraph 2 of my story" & return & "This is a subhead" & return & "This is text following subhead" ¬ & return & "This is the second paragraph following the subhead" set stylePtr to {1, 2, 4, 3, 4, 4} tell application "Adobe InDesign CC 2019" set measurement unit of script preferences to points --set x to applied paragraph style of text defaults of docRef set fontRef to font "Myriad Pro Regular" set basicStyle to paragraph style 2 set applied font of basicStyle to fontRef --creates a default document set docRef to make document tell docRef set rootElement to XML element 1 set basicStyle to make paragraph style with properties {name:"Basic", font:fontRef, size:10, leading:12} repeat with i from 1 to length of styleList copy item i of styleList to {myName, mySize, spBefore, myIndent} set end of styleRef to make paragraph style with properties ¬ {based on:basicStyle, name:myName, point size:mySize, space before:spBefore, first line indent:myIndent} end repeat end tell set myPage to page 1 of docRef --create text frame and add styled dummy text tell myPage tell margin preferences to copy {top, left, bottom, right} to marginPrefs set myBounds to my getmyBounds(bounds of myPage, marginPrefs) set myFrame to make text frame with properties {geometric bounds:myBounds} set myStory to parent story of myFrame set contents of myStory to myText set theCount to count of paragraphs of myStory repeat with i from 1 to theCount set ptr to item i of stylePtr set theStyle to item ptr of styleRef set applied paragraph style of paragraph i of myStory to theStyle end repeat end tell --create tags to match paragraph styles tell docRef repeat with eachItem in styleRef set theName to name of eachItem set tagRef to make XML tag with properties {name:theName} make XML import map with properties {mapped style:eachItem, markup tag:tagRef} end repeat end tell --apply tag to style mapping to theStory tell myStory to auto tag end tell (*Calculates bounds for live page text frame based on page bounds and margins*) on getmyBounds(pageBounds, marginPrefs) copy pageBounds to {y0, x0, y1, x1} copy marginPrefs to {t, l, b, r} set myBounds to {y0 + t, x0 + l, y1 - b, x1 - r} return myBounds end getmyBounds
With the document created when running the previous script (Make and Map Document for XML), you can now import an XML file and replace the current story (dummy text) with XML. Of course, the tags in the XML file will need to match the tags in the document.
set fileRef to choose file with prompt "Select XML file for import" tell application "Adobe InDesign CC 2019" set docRef to document 1 my xmlImportPrefs(docRef, false) tell docRef set frameRef to text frame 1 of page 1 set rootItem to XML element 1 end tell tell rootItem import XML from fileRef place XML using frameRef with autoflowing end tell end tell (*Sets up xml import preferences for merge import.*) on xmlImportPrefs(docRef, doRepeat) tell application "Adobe InDesign CC 2019" tell XML import preferences set create link to XML to false set allow transform to false set import style to merge import set repeat text elements to doRepeat set import to selected to false set ignore whitespace to false set ignore unmatched incoming to false set import CALS tables to false set import text into tables to false set remove unmatched existing to false end tell end tell end xmlImportPrefs
The Place XML command can also be written using a page item with the XML element.
tell docRef set frameRef to text frame 1 of page 1 set rootItem to XML element 1 import XML from fileRef tell frameRef to place XML using rootItem with autoflowing end tell
In addition to Place XML there are a number of place into methods. These are worth exploring.
Notice that we are careful to use XML naming for names of styles and tags (no spaces or special characters). If you don’t have that kind of control, you will need to remove spaces or special characters from paragraph style names before attempting to create a tag with the same style.
The XML structure for the above example is slightly different than used previously:
<root> <story> <heading1>Heading Here</heading1> <heading2>Subhead Here</heading2> <body>Body Text</body> <para1>First line of section</para1> <body>Body Text</body> <body>Body Text</body> </story> </root>
Think of all the ways that the Make and Map script could be modified and used to automate the creation of templates for documents such as a bulletin or newsletter where the document structure remains the same.