Skriptujeme InDesign (15): Hledání a záměny 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:

Soutěž

Sponzorem soutěže je:

Saal Digital

 

Jaký největší formát fotoknihy v řadě Professional Line ve formátu na šířku lze ve standardní nabídce Saal Digital Fotoservice objednat? Nápověda: Logo sponzora soutěže

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



Software

Skriptujeme InDesign (15): Hledání a záměny poprvé

Adobe InDesign sazba

29. května 2006, 00.00 | Potřebujete text vložený do InDesignu vyčistit od nadbytečných mezer či nepěkných
kombinací řezů nebo také třeba chcete nahradit určitý textový řetězec inline grafikou?
Pro tyto i další účely lze využít funkce a skripty hledání a nahrazení, které si blíže
představíme v této a následující části našeho seriálu.

V dnešní části našeho seriálu se podíváme na možnosti hledání a záměn textové informace s pomocí skriptů. Jedná se zde o zásadní prostředek, který ocení zřejmě každý. Rozhodně více pravidlem nežli výjimkou totiž v publikacích bývá textový obsah, který je třeba nějakým způsobem hromadně měnit, ať už se to týká korektur, sjednocení vzhledu, sazby s použitím textových značek či třeba změny designu na poslední chvíli. Téma je velmi rozsáhlé, neboť k dispozici jsou jak zabudované prostředky InDesignu, tak skripty vytvořené k danému účelu. Výklad jsme proto rozdělili do dvou částí: v této první se podíváme na základní možnosti zpracování textových záměn ve skriptovacím enginu. V části druhé se pak budeme věnovat dopodrobna využití skriptu TextCleanup a regulárních výrazů k naznačeným účelům.

Základní popis funkce pro hledání a záměny

Měnit textový obsah lze s pomocí skriptů skutečně různorodým způsobem. Využít lze i přímý přístup k textovému obsahu, tj. manipulaci s objekty paragraph, word, line atd. - viz minulé díly našeho seriálu. Podstatně užívanější je ovšem nasazení funkce pro hledání a nahrazení, která zde v základu nabízí stejné možnosti jako její vizuální protějšek, tj. funkce pro hledání a záměny v prostředí InDesignu. Mimo samotného textového obsahu lze v ní tedy zpracovávat i rozmanité textové atributy.

Skutečnost, že ve skriptu můžeme uložit a opakovaně aplikovat sadu vyhledávacích kritérií, zas až tak zásadní není, i když je rovněž v lecčems výhodná, v kombinaci s dalšími prostředky skriptovacího aparátu (už jenom pouhé nasazení cyklů či podmínek, o regulárních výrazech nemluvě) se ovšem dostáváme k možnostem popravdě netušeným.

Daná funkce je použitelná coby metoda search objektů aplikace, dokument či textových objektů (story, text, výběr, paragraph, word aj.) - aplikace dané metody podle typu objektu ovlivňuje zpracovávaný rozsah. Její obecný tvar přitom vždy je:

search(hledaný_řetězec,celé_slovo,rozlišovat_malá_velká,nahrazující_řetězec,hledané_atributy,náhradové_atributy)

Výše uvedené parametry přitom vyžadují podrobnější popis:

hledaný_řetězec: Jedná se o objekt typu String. Triviální zadání zde je opravdu pouhý textový řetězec (např. slovo "první"). Použít lze ale i tzv. zástupných znaků neboli metaznaků (tzv. wildchars), a to všech, které umožňuje použít zmíněný vizuální dialog pro hledání a záměny v InDesignu. Příkladem zde tedy mohou být třeba konec odstavce (^p), pevné zalomení řádku (^n), odkaz na poznámku (^F), proměnná pro číslo stránky (^#), em pomlčka (^_), en pomlčka (^=), číslicová mezera (^/), tabulátor (^t), libovolné číslo (^9), libovolné písmeno (^$), libovolný znak (^?) či prázdné místo (^w). (Úplný seznam lze najít v nápovědě InDesignu, rychlejší cestou jak zjistit požadovaný znak pak může být zmíněný interaktivní dialog.) Daným způsobem lze tedy vytvářet i velmi propracované hledací výrazy, dovolující například vyhledat cenové údaje, datum, zkratky a mnoho dalšího. Dále lze použít výraz vracející obsah vyhodnocení výpočtu či řetězcové proměnné, konečně je možno danou hodnotu nastavit na undefined: typicky v případech, kdy nechceme nahrazovat textový obsah, ale pouze pracovat s atributy.

celé_slovo: Jedná se o logickou hodnotu, která nastavena na true zajistí, že se prohledávání bude vztahovat vždy pouze na celé slovo. Pokud chceme zapsat celý výraz pro prohledávání a nechceme mít zapnutu danou vlastnost, použijeme zde hodnotu false.

rozlišovat_malá_velká: Opět logická hodnota, jež nastavena na true zajistí, že se při hledání bude rozlišovat mezi velkými a malými písmeny. Pokud chceme zapsat celý výraz pro prohledávání a nechceme mít zapnutu danou vlastnost, použijeme zde hodnotu false.

nahrazující_řetězec: Jde zde o řetězec, kterým se provede nahrazení. Pro jeho parametry zde platí totéž, co bylo výše řečeno o výrazu hledaný_řetězec, u metaznaků nicméně nelze použít výrazy pro libovolné písmeno, libovolný znak, libovolnou číslici a prázdné místo. Chceme-li v textu mazat, použijeme zde jako hodnotu prázdný řetězec ("").

hledané_atributy: V daném případě se jedná o možnost určit formátovací charakteristiky textu, o kterých jsme blíže hovořili v minulé části tohoto seriálu. Vyhledat lze tedy takto text určitého znakového či odstavcového stylu, text o určité velikosti, zkosení, barvě, přeškrtnutí, podtržení, vyhovující určitým OpenType charakteristikám atd. atd. Požadované vlastnosti se zapisují jako seznam vlastností, vložený do složených závorek, přičemž přiřazení je vždy provedeno výrazem název_hodnoty: hodnota, tato přiřazení jsou od sebe oddělena čárkou.

Konkrétní příklad:

//popisuje text, jehož font je Times New Roman, řez tučný a vzorníková barva "Yellow"
{appliedFont: "Times New Roman", fontStyle: "Bold", fillColor: app.activeDocument.swatches.item("Yellow")};

Pokud nechceme definovat žádný atribut, ale potřebujeme zapsat celý výraz pro hledání (tedy chceme určit následující atributy pro náhradu), vložíme zde hodnotu undefined.

náhradové_atributy: jedná se o stejný typ formátovacích charakteristik jako v předchozím případě, který se aplikuje na nalezený výsledek.

Preference

S danou funkcí jsou pak zásadním způsobem spojeny ještě preference aplikace (InDesignu) findPreferences a changePreferences. Do nich se ukládá aktuální nastavení vyhledávacího dialogu. Abychom tedy měli jistotu, že námi použitý vyhledávací příkaz nebude ovlivněn nastaveními mimo skript, měli bychom ve skriptu před tímto příkazem vždy použít přiřazení:

app.findPreferences = null;
app.changePreferences = null;

případně se dá použít i následující výraz

app.findPreferences= app.changePreferences=null;

nebo též místo null lze přiřadit NothingEnum.nothing:

app.findPreferences = NothingEnum.nothing;
app.changePreferences = NothingEnum.nothing;

Vynulování hodnot je pak vhodné zařadit i na konec skriptu, aby poslední nastavení nezůstalo zachováno v preferencích InDesignu (pokud si tedy nepřejeme jinak).

Pokud bychom pak chtěli některé z těchto preferencí dopředu nastavit, provedeme přiřazení pole hodnot ve stylu naznačeném výše. Tedy třeba

app.findPreferences.properties={appliedFont: "Times New Roman", fontStyle: "Bold"};

Možné je i nastavování následujícím způsobem:

app.findPrereferences.apliedFont="Times New Roman";
app.findPrereferences.fontStyle="Bold";

atd.

Použití

Název dané metody je poněkud zavádějící, neboť s její pomocí lze provádět (jak plyne ze syntaxe daného příkazu) i záměny. Pokud nám jde nicméně pouze o hledání, můžeme danou funkci volat například takto (a použít ji pro různou "diagnostiku" textového obsahu):

//V tomto příkladu prohledáváme dokument,
//mohli bychom ale také třeba výběr (ale pak musíme otestovat, zda obsahuje text)
//var myRange=app.selection[0];
//nebo také současnou aktivní story
//var myRange=app.selection[0].parentStory;
//atd.

var myRange=app.activeDocument;


app.findPreferences= app.changePreferences=null;
nalezeno=myRange.search("Novák",true,true);
alert("Počet výskytů slova Novák v dokumentu je "+nalezeno.length);

app.findPreferences= app.changePreferences=null;
nalezeno=myRange.search(undefined,false,false,undefined,{underline: true});
alert("Počet podtržení v dokumentu je "+nalezeno.length);

app.findPreferences= app.changePreferences=null;
nalezeno=myRange.search(undefined,false,false,undefined,{underline: true, fontStyle: "Bold"});
if (nalezeno.length!=0){alert("Dokument obsahuje podtržené tučné písmo")};

Mimochodem, s pomocí funkce selectIt, jejímž autorem je Dave Saunders lze snadno zobrazit problémové místo v dokumentu:

function selectIt(theObj) {
  // Selects object, turns to page and zooms in on it
  app.select(theObj,SelectionOptions.replaceWith);
  app.activeWindow.zoom = ZoomOptions.fitPage;
  app.activeWindow.zoomPercentage = 200
}


var myRange=app.activeDocument;
app.findPreferences= app.changePreferences=null;
nalezeno=myRange.search(undefined,false,false,undefined,{underline: true, fontStyle: "Bold"});
if (nalezeno.length!=0){if(confirm("Dokument obsahuje podtržené tučné písmo. Chcete vidět první výskyt?"))
                            {selectIt(nalezeno[0])}};

Výsledkem vyhledání je pole referencí na textové objekty (typu Text), které vyhovují zadaným vyhledávacím kritériím. Pořadí objektů v poli odpovídá pořadí v dané story. Pokud pak s obsahem odkazovaným daným způsobem chceme provádět nějaké transformace, je vhodné aplikovat je od posledního po první objekt, jinak mohou dané reference v průběhu zpracování přestat platit. Obecný zápis takovéhoto cyklu může vypadat takto:

for(j=myFinds.length-1;j>=0;j--) {
//zpracujeme obsah nalezených položek
}

Aplikovat daný způsob zpracování můžeme například v následujícím skriptu, který slouží k velmi zajímavému účelu: náhradě textu vyhledaného na základě kritérií zadaných přes standardní vyhledávací dialog InDesignu obsahem vloženým ze schránky. Výborná pomůcka zejména pro záměnu zadaného textového řetězce speciálním symbolem, inline grafikou či rámečkem libovolného druhu! (Skript jsme opět převzali z blogu D. Saunderse, zde je jeho bližší popis).

//Nejprve zkopírujte do schránky požadovaný obsah
//pak nastavte kritéria pro hledaný obsah
//a případně pro formát obsahu vkládaného, v tomto případě zakomentujte následující řádek
app.changePreferences = null;

myFinds = app.search();
for (j = myFinds.length - 1; j >= 0; j--) {
  app.select(myFinds[j]);
  app.paste();
}

Pokud se pak podíváme na vlastní hledání a nahrazování, mohou být aplikace opravdu nepřeberné. Nejvíce nasnadě je samozřejmě vyčištění textu od problémových prvků, stačí uvést několik triviálních příkladů. Začít můžeme příkladem skriptu, který nahradí problémovou kombinaci řezu a podtržení, která byla vytvořena v textové předloze:

//Následující skript nahradí všechny výskyty tučného podtrženého písma
//znakovým stylem "Tučný"
//Lze samozřejmě vytvořit variace pro jiné kombinace a znakové styly

var myDoc=app.activeDocument;

//Zkontrolujeme existenci daného znakového stylu
try{myDoc.characterStyles.item("Tučný").name} catch(e){alert("Znakový styl tučný v dokumentu neexistuje.");exit()};

//Vynulujeme preference hledání
app.findPreferences = null;
app.changePreferences = null;


myDoc.search(undefined,false,false,undefined,{underline: true, fontStyle: "Bold"},{appliedCharacterStyle: "Tučný"});

Rovněž lze dokument vyčistit od nadbytečných mezer, či jej třeba zbavit mezer pevných (vložených uživatelem textového procesoru) - všimněte si, jak pořadí příkazů ovlivní kvalitu zpracování:

var myDoc=app.activeDocument;
app.findPreferences = NothingEnum.nothing;
app.changePreferences = NothingEnum.nothing;

//Nahradí pevné mezery normálními
myDoc.search("^s",false,false," ");

//Nahradí výskyt dvojitých mezer jednoduchými.
//Pracujeme v cyklu, neboť v dokumentu mohu být i vícenásobné mezery

var mySpaces=myDoc.search("  ",false,false," ");
while(mySpaces.length>0){mySpaces=myDoc.search("  ",false,false," ")};


//Odstraní mezery na konci odstavců
myDoc.search(" ^p",false,false,"^p");

Možné je také ošetření známého problému záměny pomlčky za spojovník, případně lze vytvořit pomlčku z řetězce dvou spojovníků apod.:

myDoc.search(" - ",false,false," ^= ");
myDoc.search(" -- ",false,false," ^= ");

Ve výčtu příkladů bychom mohli dlouho pokračovat. Smysluplnější nám ovšem přijde výklad na tomto místě ukončit, neboť v příští části se podíváme na komplexní prostředky pro úpravy textu naznačeným způsobem: skript TextCleanup a regulární výrazy.

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

Tématické zařazení:

 » Rubriky  » VSE  

 » Rubriky  » Go verze  

 » Rubriky  » Sazba  

 » Rubriky  » Polygrafie  

 » Rubriky  » Software  

 

 

 

 

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

Uživatelské jméno:

Heslo: