Skriptujeme InDesign (30): Návěští - 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:

Nabídka práce
Soutěž

Sponzorem soutěže je:

IDIF

 

Kde se koná výstava fotografií Luďka Vojtěchovského?

V dnešní soutěži hrajeme o:



Software

Skriptujeme InDesign (30): Návěští

Adobe InDesign sazba

20. listopadu 2006, 00.00 | Další část našeho výkladu bude patřit technologii tzv. labels neboli návěští. Ta
dovoluje s objekty ukládat různé informace, umožňující jednoznačnou identifikaci objektů
při automatizované sazbě nebo také třeba zapamatování aktuálního stavu pro
pozdější použití. Více již v našem výkladu se sadou praktických ukázek.

Návěští neboli label je velmi silným prostředkem, dovolujícím s objekty zpracovávanými InDesignem spojit (resp. se dá říci, že do nich vložit) textové informace. Návěští může být takto vícero, každé může mít objem až 32 kb. Mimo využití pro různé popisky, dovolující snazší identifikaci objektu, či k zachycení stavových informací mohou přitom návěští posloužit i jako kontejner na skripty, které takto s daným objektem spojíme.

Interaktivní zadávání návěští objektů

K manipulaci s návěštími lze mimo skriptovacích prostředků, které si podrobněji popíšeme dále, použít i odpovídající paletu InDesignu Script Label (Popis skriptu). Poté, co označíme (nástrojem pro výběr či přímý výběr) objekt (případně více objektů), můžeme pro něj na dané paletě vložit odpovídající label (u více objektů se zadaný label přiřadí všem shodně).

Využití Script Label je ovšem značně omezené, zejména proto, že dovoluje popisovat jen některé typy objektů, konkrétně rámečky či obrázky do nich vložené a dále cesty či jiné vektorové objekty, k mnoha jiným (stránky, vrstvy, tabulky, samotný dokument aj.) přístup nenabízí. Navíc poskytuje přístup pouze k návěštím určeným vlastností label, nikoli návěštím vkládaným medou insertLabel (viz další výklad), což opět omezuje funkcionalitu. Zvláště delší text se pak s její pomocí vkládá obtížně (ale lze využít přenos přes schránku).

skriptid30-1f.jpg

Paletka Script Label v akci

Každopádně je použití této palety vhodné tam, kde potřebujeme, aby se přiřazení návěstí provedlo interaktivně: typicky pokud třeba chceme, aby designér neznalý skriptování přiřadil identifikátory objektů, jež pak budou při skriptování použity, například při automatizované sazbě. Zajímavé je nasazení tam, kde na dokumentu spolupracuje více osob, label jim pomáhá určit status daného prvku, na základě toho pak jiná osoba či skript provede další zpracování.

Vlastnost label a její použití

Návěštím vloženým výše popsaným způsobem odpovídá v rámci skriptovacího enginu vlastnost objektu label (ale znovu opakujeme, label lze takto použít s podstatně více typy objektů než dovoluje daná paleta). U aktuálně vybraného objektu si lze vypsat jeho návěští následovně:

//Vypíše návěští vybraného objektu
//Předpokládá, že jste vybrali nějaký objekt
var mySel=app.selection[0];
if(mySel.label==""){alert("Vybraný objekt nemá návěští")}else{alert("Návěští daného objektu je:\n"+mySel.label)}

Interaktivní přiřazení návěští právě vybranému objektu přes skript, nikoli výše popsanou paletu, lze zajistit třeba takto:

//Vybranému objektu přiřadí návěští
var mySel=app.selection[0];

//V případě že není vybrán objekt, skript ukončí
if(!mySel){alert("Vyberte nějaký objekt a spusťte tento skript znovu");exit()}

//Zobrazí stávající návěští a dovolí jeho přepsání
if(myText=prompt("Vložte text návěští",mySel.label)){mySel.label=myText};

Následující skript prochází dokument a upozorňuje na objekty, kterým chybí návěští, přičemž dovoluje jejich interaktivní doplnění:

//Skript který zobrazí v dokumentu všechny objekty, kterým chybí návěští
//a dovolí toto návěští doplnit

var myDoc=app.activeDocument;

//Projdeme všechny stránkové objekty v dokumentu
for(i=0;i<myDoc.allPageItems.length;i++){
    var myObj=myDoc.allPageItems[i];
    if(myObj.label==""){                        //Pokud objekt nemá label, pak
    app.select(myObj);                          //vybereme daný objekt
    app.activeWindow.activePage=myObj.parent;   //přesuneme se na jeho stránku
    app.activeWindow.zoom(ZoomOptions.fitPage); //zvětšíme zobrazení v okně na velikost stránky
    //a umožníme doplnění labelu
    if(myLabel=prompt("Vybranému objektu chybí návěští, zde jej můžete přiřadit:","")){myObj.label=myLabel}}
}

Návěští lze přiřadit objektu rovněž při jeho vytváření:

//Do aktuálního dokumentu vloží na první stránku textový rámeček s labelem "Textový rámeček"
var myDoc=app.activeDocument;

myDoc.pages[0].textFrames.add({geometricBounds: ["2cm","2cm","4cm","4cm"], label: "Textový rámeček"});

Zajímavá je možnost přiřadit hromadně návěští objektům, které vyhovují určité podmínce. Například:

//V aktuálním dokumentu přiřadí dokumentům návěští na základě jejich typu

var myDoc=app.activeDocument;

for(i=0;i<myDoc.allPageItems.length;i++){
var myItem=myDoc.allPageItems[i];
        switch(myItem.constructor.name)
        {   case "TextFrame": myItem.label="Textový rámeček";break;
            case "Oval": myItem.label="Ovál";break;
            case "Rectangle": myItem.label="Čtverec";break;
            default: myItem.label=myItem.constructor.name.toString();break;
        }
}

nebo

//Všem textovým rámečkům bez labelu a obsahu přiřadí label "Prázdný"
//Všem textovým rámečkům bez labelu, ale s nějakým obsahem přiřadí label "Rozpracovaný"

var myDoc=app.activeDocument;

//V cyklu projde všechny textové rámečky dokumentu a změní je výše naznačeným způsobem
for(i=0;i<myDoc.textFrames.length;i++){
    var myTF=myDoc.textFrames[i];
    if(myTF.label==""){
        if(myTF.contents==""){myTF.label="Prázdný"}
            else{myTF.label="Rozpracovaný"}
    }
}

Největší výhoda použití návěští spočívá v tom, že lze s jejich pomocí jednoznačně a snadno identifikovat objekt či skupinu objektů, jež mají dané návěští přiřazeno. K identifikaci se zde používá přístup přes vlastnost objektu item. Následně pak lze provádět třeba různé hromadné úpravy, jak naznačuje následující skript:

//Textové rámečkem s labelem "Prázdný" vyplní zástupným textem
//Pak změní jejich label na "Rozpracovaný"
var myDoc=app.activeDocument;

//Všechny textové rámečky s labelem "Prázdný" naplní zástupným textem
myDoc.textFrames.item("Prázdný").contents=TextFrameContents.placeholderText;
//Label u těchto rámečků změní na "Rozpracovaný"
myDoc.textFrames.item("Prázdný").label="Rozpracovaný";

Návěští a automatizovaná sazba

Výše popsané postupy se nejčastěji používají pro automatizovanou sazbu. Princip je zde takový, že se nejprve návěští přiřadí jednotlivým textovým a obrázkovým rámečkům, přičemž přiřazení zde lze provést i interaktivně (viz výše). Následně pak skript načte do jednotlivých rámečků data z externích souborů, klíčem k přiřazení zde může být souborové pojmenování. Více si už konkrétněji ukažme na následujícím, rozhodně ne dokonalém, ale věříme, že poměrně inspirativním příkladu. Ten vychází z představy dokumentu - šablony, ve kterém jsou požadované textové a obrázkové rámečky popsány návěštími, odpovídající dvourozměrné pole pak určuje přiřazení souborových názvů, spojených s jednotlivými návěštími. Po spuštění skript na základě zmíněného pole projde dokument a do objektů o daných návěštích načte přiřazené soubory. Pro návěští ve skriptu jsme použili následující konvenci: textové rámečky jsou v dokumentu označeny návěštími ve tvaru s_číslo_stránky_TF_číslo_rámečku (tedy třeba s1TF1 je návěští prvního textového rámečku na první straně), pro obrázky je obdobně použito s_číslo_stránky_IF_číslo_obrázku. Dokument, který plníme, je umístěn na libovolné lokaci, data přebíráme ze složky c:\casopis.

//Skript pro automatizovanou sazbu na základě návěští

if(app.documents.length==0){alert("Otevřete požadovaný dokument a spusťte skript znovu");exit();}

//Pracujeme s aktivním dokumentem, možná je úprava pro pole dokumentů z určité složky apod.
var myDoc=app.activeDocument;

//Složka, ve které se nachází soubory k umístění, možná i jiná identifikace, např. interaktivní
var myFolder="/c/casopis/";

//Pomocná pole pro evidenci chybějících souborů či návěští
var myMissingLabels=new Array;
var myMissingFiles=new Array;

//Pomocné pole obsahující všechna návěští existující v dokumentu
var myLabels=myDoc.pageItems.everyItem().label;

//Dvourozměrné pole popisující přiřazení ve tvaru [label,název_souboru_k_umístění]
//Editací tohoto pole si lze vytvořit vlastní přiřazení
//Upozorňujeme, že pokud bude mít dokument více objektů se stejným labelem
//provede se načtení do všech těchto objektů
var myFiles=[["s1IF1","myim1.jpg"],["s1IF2","myim2.jpg"],["s1TF1","myst1.rtf"],["s1TF2","myst2.rtf"],["s1TF3","myst3.rtf"]];


//Hlavní cyklus ve kterém provedeme zpracování
//Cyklus zpracovává jednotlivé položky pole myFiles
for(var i=0;i<myFiles.length;i++){
    var myLabel=myFiles[i][0];                          //Z položky pole načteme návěští
    var myFileNameP=myFiles[i][1];                      //Z položky pole načteme základ názvu souboru
    if(myIsInArray(myLabel,myLabels)){                  //Otestujeme, zda vůbec dané návěští existuje
        var myObject=myDoc.pageItems.item(myLabel);     //Identifikujeme objekt - textový či obrazový rámeček označený návěštím
        var myFileName=myFolder+myFileNameP;            //Sestavíme celé jméno souboru k umístění
        if(File(myFileName).exists){myPlaceFile(myObject,myFileName)}   //Pokud soubor daného názvu existuje, soubor umístíme
            else{myMissingFiles.push(myFileName)}       //Zaznamenáme chybějící soubor
    }
    else{myMissingLabels.push(myLabel)}                 //Zaznamenáme chybějící návěští
}


//Vypíšeme, pokud při zpracování chyběl soubor k načtení či požadované návěští
if(myMissingFiles!=""){alert("Při načítání chyběly následující soubory: "+myMissingFiles)}
if(myMissingLabels!=""){alert("Následující návěští v dokumentu neexistují: "+myMissingLabels)}


//Způsob, jakým se umisťuje soubor
//Lze ošetřit různé situace, např. odlišný způsob vkládání obrázků a textu,
//existenci neprázdného rámečku atp. Zde jsme nicméně použili nejjednodušší způsob.
function myPlaceFile (myObject,myFileName){
    myObject.place(File(myFileName));
}


//Pomocná funkce, testující přítomnost řetězce v poli
//Zde testujeme k testu existence návěští
function myIsInArray (myString,myArray){
    for(var i=0;i<myArray.length;i++){if(myArray[i]==myString){return true}
    }
    return false;
}

Z didaktických důvodů má náš skript sníženou funkcionalitu. Lze si každopádně představit nepřeberné množství jeho rozšíření, vedoucí k jeho plně reálné využitelnosti (a i ve stávající podobě může v méně složitých situacích fungovat velmi dobře).

Metody insertLabel a extractLabel

Kromě návěští vložených s pomocí výše popsaných mechanismů dovoluje skriptovací engine InDesignu přiřadit jednotlivým objektům v podstatě neomezené množství dalších návěští s pomocí metody insertLabel. Ta má obecný tvar

insertLabel(key,value)

kde key označuje klíč identifikující návěští a value hodnotu ukrytou pod tímto klíčem. Obě zmíněné hodnoty jsou textové řetězce. Přiřazení může tedy vypadat třeba následovně:

//Aktuálně vybranému objektu přiřadí hodnotu do návěští "Poznámka"
myObject=app.selection[0];

if(myPrompt=prompt("Zadejte poznámku ohledně poslání daného objektu","")){
    myObject.insertLabel("Poznámka",myPrompt);
}

Výše přiblížené vlastnosti label objektu odpovídá klíč "Label".

Obsah daného labelu pak získáme pomocí metody extractLabel (na paletě Skript Label se hodnoty vložené s pomocí insertLabel nezobrazují, výjimku tvoří přiřazení klíči "Label"!). Ta má obecný tvar

extractLabel(key)

kde key stejně jako výše označuje klíč identifikující návěští. V případě příkladu uvedeného výše lze obsah vložené poznámky zobrazit následovně:

alert(myObject.extractLabel("Poznámka"));

Případně je možná třeba následující modifikace prvního skriptu:

//Umožňuje měnit hodnotu uloženou pod návěštím "Poznámka"
myObject=app.selection[0];

if(myPrompt=prompt("Zobrazila se vám poznámka ohledně poslání daného objektu, můžete ji dále upravit",myObject.extractLabel("Poznámka"))){
    myObject.insertLabel("Poznámka",myPrompt);
}

K obsahu vlastnosti label lze přistupovat následovně:

//Zobrazí hodnotu vlastnosti "label" pro aktuálně vybraný objekt

mySel=app.selection[0];

alert(mySel.extractLabel("Label"));

Výše uvedené příklady mimo jiné naznačují, jakým způsobem lze dané metody použít třeba k vkládání poznámek pro jednotlivé zpracovávané objekty, které se pak zohlední při skupinové spolupráci nebo při dalším skriptování. Další možné použití spočívá v nasazení návěští pro uchování určitých stavových informací. Více demonstruje následující omezený skript, dovolující daný princip použít k uložení a opakovanému načtení určitého nastavení vrstev:

//Skript, který si dokáže u každé vrstvy zapamatovat následující parametry:
//jméno, barva na paletě Vrstvy, nastavení viditelnosti, nastavení uzamčení
//a na požádání tyto parametry obnoví.
//Jen základní funkcionalita, doplnitelná o možnosti uložení více parametrů,
//použití více konfigurací apod.
//V současné podobě neřeší také třeba zachování pořadí vrstev či absenci určité vrstvy.
//Nicméně dobře ukazuje jak naložit s tokem informací mezi nastaveními a obsahem použitého návěští.

//Pracujeme s aktuálním dokumentem
var myDoc=app.activeDocument;

//Pole všech vrstev v daném dokumentu
var myLayers=myDoc.layers;

//Pomocné pole pro ukládání stavu vrstev
var myLayersState=new Array;


//Dialog kterým volíme uložení nebo obnovení nastavení
//Lze zaměnit kvalitnějším dialogem skriptovacího enginu - viz http://www.grafika.cz/art/sazba/skriptid11.html
switch (prompt("Zadejte svou volbu:\n1: Uložení nastavení vrstev\n2: Obnovení nastavení","2")){

    //Funkce mySaveLayersState uloží aktuální nastavení vrstev do labelu dokumentu "Vrstvy"
    case "1": mySaveLayersState();break;

    //Funkci mySetLayers obnoví nastavení vrstev podle nastavení z labelu "Vrstvy"
    //Předáme ji textové hodnoty přeměněné na textové pole metodou split
    //Pokud dosud neexistuje label "Vrstvy", funkce se neprovede
    case "2": try{mySetLayers(myDoc.extractLabel("Vrstvy").split(","))}catch(e){alert("Nejdřív musíte nějaká nastavení uložit")};break;

    //Pokud uživatel nezvolil 1 ani 2
    default: alert("Nezadali jste platnou volbu, spusťte skript znovu");exit();
}


//Funkce pro uložení stavu vrstev
function mySaveLayersState (){
    //Projdeme všechny vrstvy a uložíme jejich nastavení - více o daných parametrech viz http://www.grafika.cz/art/sazba/skriptid24.html
    for(var i=0;i<myLayers.length;i++){
        //Požadované parametry uložíme do pomocného pole
        //Zde lze provést modifikaci, pokud potřebujeme ukládat i další parametry
        myLayersState.push([myLayers[i].name,myLayers[i].layerColor,myLayers[i].visible,myLayers[i].locked]);
    }
    //Pole pamatující si hodnoty nastavení uložíme do labelu "Vrstvy", musíme je zkonvertovat na text
    myDoc.insertLabel("Vrstvy",myLayersState.toString())
}


//Funkce pro obnovení stavu vrstev
//Na vstupu načte pole uložených nastavení
function mySetLayers (myLayersState){
    for(var i=0;i<myLayersState.length;i++){            //Projdeme jednotlivé položky daného pole
    var myLayer=myDoc.layers.item(myLayersState[i]);    //Najdeme vrstvu daného názvu
    myLayer.properties={layerColor: parseInt(myLayersState[i+1]),           //Obnovíme nastavení barvy (číslo)
                        visible: myStringToBoolean(myLayersState[i+2]),     //Obnovíme nastavení viditelnosti (logická hodnota)
                        locked: myStringToBoolean(myLayersState[i+3])};     //Obnovíme nastavení uzamčení (logická hodnota)
    i=i+3;              //Posuneme se v poli myLayersState na další čtveřici hodnot
    }
}


//Pomocná funkce pro převod textových hodnot na logické - používáme ve funkci mySetLayers
function myStringToBoolean (myString){
    if(myString=="true"){return true}
        else{return false}
}

Skripty v návěštích

Jak jsme již řekli výše, návěští mohou v sobě schraňovat i text skriptu. Zajímavé využití se zde naskýtá především v případě objektů v šablonách dokumentů či knihovnách, které takto sebou mohou nést i příslušnou zpracovávající logiku (obsluha pak jen spustí skript, který u daného objektu provede v něm uložené skripty apod.). Dané téma je hodně komplexní a hodně pokročilé, ale zároveň nabízí značně lákavé možnosti zpracování, na tomto místě naznačíme jenom základní principy, k podrobnějšímu výkladu se dostaneme někdy příště.

Vložení skriptu do labelu může vypadat třeba takto:

//Vybranému objektu přičlení skript vložený jako návěští s klíčem "Skript"
var mySel=app.selection[0];

//Zde určujeme text skriptu. Musí být vložen do uvozovek,
//uvozovky tedy pak ve skriptu zapisujeme třeba jako apostrofy.
//Náš ukázkový skript přepíše obsah vybraného textového rámečku řetězcem "Ahoj"
var myScript="var myTF=app.selection[0];myTF.contents='Ahoj'"

mySel.insertLabel("Skript",myScript);

Použití skriptu extrahovaného z labelu pak funguje s použitím metody doScript následovně:

//U vybraného objektu spustí skript, který má tento přiřazen pod návěštím "Skript".
//V našem příkladu provede skript přepsání obsahu rámečku na řetězec "Ahoj".
var mySel=app.selection[0];

app.doScript(mySel.extractLabel("Skript"));

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

Tématické zařazení:

 » Rubriky  » VSE  

 » Rubriky  » Go verze  

 » Rubriky  » Sazba  

 » Rubriky  » Polygrafie  

 » Rubriky  » Software  

Poslat článek

Nyní máte možnost poslat odkaz článku svým přátelům:

Váš e-mail:

(Není povinný)

E-mail adresáta:

Odkaz článku:

Vzkaz:

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

 

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

Uživatelské jméno:

Heslo: