Skriptujeme InDesign (12): Text poprvé - Grafika.cz - vše o počítačové grafice

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Polygrafie

Skriptujeme InDesign (12): Text poprvé

Adobe InDesign sazba

10. dubna 2006, 00.00 | Story neboli článek, odstavec, řádek, slovo, textový rámeček ... Vztahy mezi těmito i
dalšími pojmy spojenými s textem jsou při interaktivní sazbě v InDesignu poměrně jasné
na první pohled. Jak je to ovšem v případě skriptování? Na to se pokusíme odpovědět v
tomto článku.

V této části našeho seriálu zahájíme sérii článku věnovanou práci s textem. Dnes se takto budeme věnovat trochu teoretickému výkladu o jednotlivých textových objektech, který je nicméně pro následné, značně praktické ukázky zásadní.

Text v objektové hierarchii

Na text lze v objektové hierarchii odkazovat různorodým způsobem, což na jednu stranu může být matoucí, na druhou stranu to ale přináší značnou flexibilitu při řešení zpracování daného typu obsahu. V našem výkladu se každopádně můžeme z prostorových důvodů zaměřit pouze na přiblížení základních principů.

Základním objektem je textový tok - story (v českém InDesignu se o story hovoří jako o článku, z nejrůznějších důvodů ale raději zůstaneme u původního anglického termínu). Story dokumentu se ukládají do kolekce označené jako Stories. Má-li kolekce Stories daného dokumentu nulovou délku, znamená to, že dokument neobsahuje žádný text, což se dá použít k různým testům (mimo následujícího triviálního příkladu viz zejména mnohé ukázkové skripty dodávané s InDesignem).

if (app.activeDocument.stories.length != 0){
    alert("Dokument obsahuje celkem"+ app.activeDocument.stories.length+"story")
    }
    else{
    alert("Dokument neobsahuje žádný text");
    }

Zajímavou a užitečnou ukázkou práce se story dokumentu je skript ExportAllStories dodávaný s InDesignem. Jeho posláním je exportovat obsah jednotlivých story do souborů ve zvolených formátech (text, RTF, tagovaný text), přičemž pojmenování vytvořených souborů se odvíjí od indexů daných story.

Obsahem story je text (a také třeba tabulky, inline grafika aj. - to nás v tuto chvíli zajímat nemusí), který se skládá z kolekcí objektů chars (znaky), words (slova), lines (řádky), paragraphs (odstavce), textColumns (sloupce) a textStyleRanges (kontinuální posloupnosti znaků o stejných formátovacích atributech). Z označení se dá tušit příslušná hierarchie: story může obsahovat jeden či více odstavců, odstavec jeden či více řádků atd. Pro zpracování těchto objektů slouží zejména vlastnost texts (kolekce textů v daném objektu, to je ovšem trochu matoucí, neboť texts[0] adresuje kompletní text v objektu), jež vrací objekt typu text, a dále vlastnost contents, která poskytuje přístup k textovému obsahu (vrací odpovídající textový řetězec) daného textového objektu. Jednotlivé prvky v daných kolekcích se indexují od nuly, index -1 označuje poslední prvek v dané kolekci.

Více lze pochopit z jednoduchého příkladu (s kterým si může zvídavý čtenář pohrát dle libosti, tj. sám vyzkoušet například práci s objekty lines, textColumns, změnami návratových hodnot při změně rozměru rámečku aj.). Vytvořme nejprve manuálně dokument, obsahující pouze jediný textový rámeček s následujícím textem.

Toto je první odstavec. Jeho text se budeme snažit napsat tak dlouhý, aby nám přesahoval na několik řádků. Už máme řádek jeden, nyní lze přidat řádek další.
Druhý odstavec: je kratší, není potřeba psát mnoho.
A pro pořádek odstavec třetí.

a vyznačme slovo "první" v prvním odstavci kurzivou. Vyzkoušejme pak, co bude vracet následující skript, spuštěný ve chvíli, kdy je daný dokument aktivní v InDesignu:

var myDocument=app.activeDocument;
var myStory=myDocument.stories[0];

//Vrací kompletní obsah story
//zde text uvedený výše
alert(myStory.contents);

//Vrací textový objekt obsažený v dané story
//zde tedy vypíše "[object Text]"
alert(myStory.texts[0]);

//Vrací obsah textu dané story
//tedy totéž co v případě myStory.contents
alert(myStory.texts[0].contents);

//Vrací první úsek textu se stejnými atributy
//zde text "Toto je"
alert(myStory.textStyleRanges[0].contents);

//Vrací druhý úsek textu se stejnými atributy
//zde text "první"
alert(myStory.textStyleRanges[1].contents);

//Vrací obsah čtvrtého slova dané story
//zde text "odstavec."
alert(myStory.words[3].contents);

//Vrací obsah posledního odstavce v dané story
//zde text "A pro pořádek odstavec třetí."
alert(myStory.paragraphs[-1].texts[0].contents);

//Totéž co v předchozím případě
alert(myStory.paragraphs[-1].contents);

//Vrací obsah čtvrtého slova v druhém odstavci dané story
//zde tedy "kratší,"
alert(myStory.paragraphs[1].words[3].texts[0].contents);

Textové objekty lze přesouvat či odstraňovat s pomocí odpovídajících metod. Na tomto místě si uveďme jen několik ilustračních příkladů, podrobnou syntaxi příslušných příkazů lze nastudovat z referenční příručky. Pěkným příkladem praktického použití přesouvání je ukázkový skript SortParagraphs pro setřídění vybraných odstavců, dodávaný s InDesignem.

var myDocument=app.activeDocument;
var myStory=myDocument.stories[0];

//Přemístí první odstavec na konec dané story
myStory.paragraphs[0].move(LocationOptions.atEnd, myStory);

//Odstraní poslední odstavec ve story
myStory.paragraphs[-1].remove();

Dále je možno měnit atributy daných objektů, týkající se jejich formátování. Opět zde uveďme jen několik ilustračních ukázek, do podrobností se zde pustíme někdy příště.

var myDocument=app.activeDocument;
var myStory=myDocument.stories[0];

//Vycentruje první odstavec v dané story
myStory.paragraphs[0].justification=Justification.centerJustified;

//Nastaví mezeru za prvním odstavcem na 1 cm
myStory.paragraphs[0].spaceAfter="1cm";

//Nastaví řez prvního slova v prvním odstavci story na tučný
myStory.paragraphs[0].words[0].fontStyle="Bold";
//řez druhého slova se pak nastaví na kurzivu
myStory.paragraphs[0].words[1].fontStyle="Italic";

Výběr a insertion point

Velmi často se s textem pracuje s pomocí výběru (selection) či vkládacího bodu (insertion point). První objekt jsme již v našem seriálu přiblížili - jedná se zde o kolekci objektů vybraných aktuálně v InDesignu. Kontrolovat je zde přitom třeba, zda byl vybrán skutečně text: daná situace se ošetřuje testem tzv. konstruktoru objektu. Řadu příkladů na dané téma poskytují opět odpovídající úseky kódu v ukázkových skriptech dodávaných s InDesignem, zde si pouze ukážeme jeden modelový:

//Spouštějte daný skript opakovaně s různými způsoby výběru
//testujeme pouze první objekt výběru
switch(app.selection[0].constructor.name){
    case "Text": alert("Je vybrán objekt typu Text");break;
    case "InsertionPoint": alert("Je použit insertion point - textový kurzor"); break;
    case "Character": alert("Je vybrán znak");break;
    case "Word": alert("Je vybráno slovo");break;
    case "Line": alert("Je vybrán řádek");break;
    case "Paragraph": alert("Je vybrán odstavec");break;
    default: alert("Nezvolili jste textový objekt")
}

Máme-li opravdu vybrán textový objekt, zjišťujeme pro další zpracování obvykle jeho story. To lze nejsnáze provést s pomocí vlastnosti parentStory, tj. tzv. rodičovské story daného objektu (daný princip lze použít i pro insertion point a textové rámečky, viz dále).

//Zjištění story prvního prvku výběru
myStory=app.selection[0].parentStory;

Insertion point je chápán jako objekt před znakem (resp. mezi znaky), specifickým případem je zde textový kurzor. Svým způsobem je tedy insertion point vlastně specifický typ textového výběru. Použít jej lze například k vložení textu nebo třeba inline grafiky do story (ale je třeba si uvědomit, že objekty lze zpracovávat přímo, bez toho, že bychom třeba posouvali kurzorem jako je tomu při použití různých makro prostředků). Pokud potřebujeme adresovat začátek story, používáme pozici 0, pokud chceme něco vkládat na konec, používáme pozici -1.

//Na začátek story vloží odstavec s textem "Začátek"
myStory.insertionPoints[0].contents= "Začátek\r";
//Na konec story vloží odstavec s textem "Konec"
myStory.insertionPoints[-1].contents= "\r Konec";

Pokud chceme něco vložit na aktuální pozici textového kurzoru, použijeme například následující přiřazení:

//Vloží řetězec "Pokusný text" na aktuální pozici textového kurzoru
//(je-li textový kurzor aktivní, jinak se daným textem přepíše právě vybraný text)
app.selection[0].contents="Pokusný text";

Textové rámečky

Text story se umisťuje do textových rámečků, přičemž textový obsah těchto rámečků lze opět adresovat s pomocí vlastností contents a texts. Pro přístup k textovému obsahu zde tedy máme dvě rovnocenné možnosti: přes story nebo přes textový rámeček.

U rámečků řetězených odpovídá textu ve všech rámečcích jediná story. Jsou-li rámečky izolované, odpovídá každému z nich zvláštní story. K adresování či zjištění story, ke které náleží daný textový rámeček, se používá (stejně jako u výběru) vlastnost parentStory.

Všechny rámečky, které se nacházejí ve story, určuje kolekce textFrames (a story.texts[0].textFrames adresuje všechnu inline grafiku v dané story). Máme-li vybrán či jinak určen text, lze jeho textový rámeček zjistit s pomocí odkazu parentTextFrames[0]. Příklady:

//Vypíše obsah prvního odstavce ve story prvního textového rámečku dokumentu
alert(app.activeDocument.textFrames[0].parentStory.paragraphs[0].contents);

//Proměnné myTextFrame přiřadí textový rámeček, kterému patří daný výběr
//(musí být vybrán text)
var myTextFrame=app.selection[0].parentTextFrames[0];

Pro přístup k textu umístěnému na křivku se pak používá reference myTextFrame.textPaths[0]. Kapitolou samou o sobě jsou texty v tabulkách (poznamenejme zde, že tabulka je vlastně podřízeným objektem textového rámečku a zároveň spadá i do odpovídající story), zde si výklad schováme až do části věnované přímo danému typu objektů.

Na tomto místě si ještě povšimněme řetězení rámečků. Základní je zde použití vlastností previousTextFrame a nextTextFrame. Mimo jiné nám dovolí zjistit, zda je právě vybraný textový rámeček řetězen:

if(app.selection.length != 0){
    var mySel = app.selection[0];
    if (mySel.constructor.name=="TextFrame")
    {if ((mySel.previousTextFrame==null) && (mySel.nextTextFrame==null))
        {alert("Vybraný rámeček není řetězen")}
    }
    else{alert("Vyberte textový rámeček a spusťte skript znovu.")}
}
else{alert("Nic jste nevybrali. Vyberte textový rámeček a spusťte skript znovu.")}

Další příklady práce s textem v řetězených rámečcích poskytují ukázkové skripty dodávané s InDesignem BreakFrame (odstraní textový rámeček i jeho obsah ze zadané story) a SplitStory (odstraní vazby mezi rámečky). Podrobněji se pak budeme věnovat řetězení rámečků ještě příště, kdy se hodláme zabývat automatizovaným vkládáním a následným formátováním textu v dokumentu.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » VSE  

 » Rubriky  » Go verze  

 » Rubriky  » Sazba  

 » Rubriky  » Polygrafie  

 

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: