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:
-
5. září 2024
Matrixmedia - Obsluha a tisk na velkoformátových digitálních tiskárnách
-
30. září 2024
-
4. října 2024
Polygrafie
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).
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
https://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
https://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):
- Skriptujeme InDesign (1): Úvod
- Skriptujeme InDesign (2): První kroky
- Skriptujeme InDesign (3): Základy JavaScriptu poprvé
- Skriptujeme InDesign (4): Základy JavaScriptu podruhé
- Skriptujeme InDesign (5): Dokumenty poprvé
- Skriptujeme InDesign (6): Dokumenty podruhé
- Skriptujeme InDesign (7): Výstup
- Skriptujeme InDesign (8): Stránky
- Skriptujeme InDesign (9): Stránkové objekty poprvé
- Skriptujeme InDesign (10): Stránkové objekty podruhé
- Skriptujeme InDesign (11): Dialogy
- Skriptujeme InDesign (12): Text poprvé
- Skriptujeme InDesign (13): Text podruhé
- Skriptujeme InDesign (14): Text potřetí
- Skriptujeme InDesign (15): Hledání a záměny poprvé
- Skriptujeme InDesign (16): Hledání a záměny podruhé
- Skriptujeme InDesign (17): Regulární výrazy
- Skriptujeme InDesign (18): Tabulky poprvé
- Skriptujeme InDesign (19): Tabulky podruhé
- Skriptujeme InDesign (20): Obrázky poprvé
- Skriptujeme InDesign (21): Obrázky podruhé
- Skriptujeme InDesign (22): Obrázky potřetí
- Skriptujeme InDesign (23): ESTK aneb jak na editaci a ladění skriptů
- Skriptujeme InDesign (24): Vrstvy
- Skriptujeme InDesign (25): Barvy poprvé
- Skriptujeme InDesign (26): Barvy podruhé
- Skriptujeme InDesign (27): Barvy potřetí
- Skriptujeme InDesign (29): Metadata podruhé
- Skriptujeme InDesign (30): Návěští
- Skriptujeme InDesign (31): Okna
- Skriptujeme InDesign (32): Reakce na události
- Skriptujeme InDesign (33): Novinky v CS3 verzi
Tématické zařazení:
» Rubriky » Polygrafie
-
14. května 2014
Jak vkládat snímky do galerií a soutěží? Stručný obrazový průvodce
-
23. dubna 2014
Konica Minolta přenesla výhody velkých zařízení do kompaktních modelů
-
12. června 2012
-
9. dubna 2014
-
29. listopadu 2013
-
6. září 2004
OKI snižuje ceny barevných laserových tiskáren C3100 a C5200n
-
13. května 2004
-
19. ledna 2004
QuarkXPress Passport 6: předvedení nové verze na konferenci Apple Forum 27.1.2004
-
6. února 2001
-
30. listopadu 2014
Nový fotoaparát α7 II: první plnoformát s pětiosou optickou stabilizací obrazu na světě
-
5. srpna 2024
Bubnový scanner na 4000dpi optické rozlišení + PC + software
-
8. září 2024
-
14. října 2024
-
5. listopadu 2024