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



VSE

Skriptujeme InDesign (16): Hledání a záměny podruhé

Adobe InDesign sazba

5. června 2006, 00.00 | Skript TextCleanup je jeden z nejužitečnějších pomocníků sazeče v InDesignu. S jeho
pomocí lze totiž automatizovat čištění a nahrazování textu či formátovacích
charakteristik, a to zcela dle potřeb uživatele. Více už v našem článku.

V této části našeho seriálu navážeme bezprostředně na předchozí díl, věnovaný hledání a nahrazování textu a textových atributů v dokumentech InDesignu. Pomůckou, která dovoluje dříve popsané principy použít maximálně efektivně i laikovi v oblasti skriptování je skript TextCleanup. Jeho podrobnému přiblížení se věnujeme v tomto článku.

TextCleanup: základní popis

Skript TextCleanup Martina Olava Kverna je dodáván coby součást Creative Suite (1 i 2). V dalším výkladu si popíšeme podobu pro CS2, kterou si lze mimochodem (nemá-li uživatel k dispozici instalační CD nebo se mu nechce skript zdlouhavě hledat) stáhnout spolu s ostatními skripty pro InDesign CS2 z Internetu. V případě CS se pak vyplatí "upgrade" na podobu, kterou autor svého času spam_email('.zkcJ', '@', '1', '128');gs95qzU@.3bbcfd21">zveřejnil v diskusním fóru o skriptování InDesignu.

TextCleanup si klade za cíl usnadnit uživateli provádění sérií náhrad v dokumentu. Činnost skriptu přebírá popis záměn z textového souboru JSFindChangeList.txt (umístěného v adresáři skriptu), ve kterém jsou uloženy příkazy popisující požadované náhrady. Každému příkazu zde přitom odpovídá řádek o čtyřech položkách, oddělených tabulátory (v našem následujícím zápisu zastupuje tabulátor značka <tab>):

findProperties<tab>changeProperties<tab>range_string<tab>description

FindProperties zde určují hledaný text, changeProperties pak způsob náhrady. V obou případech se jedná o sérii přiřazení vloženou do složených závorek, přičemž přiřazení jsou ve tvaru parametr: hodnota a jsou oddělena čárkami. Parametry přitom mohou nejen popisovat text (včetně zástupných a speciálních znaků, zástupné znaky, tedy ^9, ^$, ^? či ^w lze ovšem použít pouze v poli pro hledání), ale i formátovací parametry - syntaxi jsme popsali v minulé části seriálu. Range_string pak určuje kolikrát se má zpracování dokumentu provádět. Možnými volbami je zde buďto once (provede se pouze jedno zpracování dokumentu) nebo all (zpracování se provádí opakovaně, dokud v textu existuje obsah určený danými podmínkami - používá se například při odstraňování vícenásobných mezer). V druhém případě se může samozřejmě vyskytnout riziko nekonečné cyklu, to je nicméně autorem skriptu ošetřeno poměrně jednoduchým trikem: vyhledávání podle daného kritéria je vloženo do smyčky a poté co proběhne více jak 100krát, je uživatel dotázán, zda chce v daném hledání pokračovat, jinak se zpracování ukončí. Konečně parametr description pak dovoluje připojit popisek, kterým tvůrce příkazu obvykle vysvětluje význam daného příkazu. Mimo řádků s příkazy lze v textu použít i prázdné řádky či řádky zakomentované dvojitým obráceným lomítkem (obdobně jako komentáře v JavaScriptu).

Skript po spuštění detekuje, zda je otevřen nějaký dokument a tento obsahuje text. Pokud ano, dovoluje provést záměnu v aktuální story, celém dokumentu nebo aktuálním výběru: volba je zde na uživateli.

Využití a konfigurace

Daný skript má obrovské možnosti využití. Není zde problémem zkombinovat do jednoho souboru (či souborů vícero, viz dále) prakticky všechna myslitelná kritéria, která uživatel potřebuje k vyčištění textu od nepotřebných či špatně vložených znaků, nesprávného formátování atd. Uveďme zde jen několik jednoduchých příkladů:

//Nadbytečné mezery
{findText:"  "} {changeText:" "}    all Dvojite mezery za jednoduché
{findText:"^t^t"}   {changeText:"^t"}   all Dvojite tabulátory za jednoduche.
{findText:"^p "}    {changeText:"^p"}   all Odstrani mezery na začátcích odstavců.
{findText:" ^p"}    {changeText:"^p"}   all Odstrani mezery na koncích odstavců
{findText:"^p^t"}   {changeText:"^p"}   all Odstrani tabulátory na začátcích odstavců
{findText:"^t^p"}   {changeText:"^p"}   all Odstrani tabulátory na koncích odstavců
{findText:" ,"} {changeText:","}    all Vymaže mezeru před čárkou.


//Znaky
{findText:" - "}    {changeText:" ^= "} once    Nahradí spojovník oddělený z obou stran mezerou pomlčkou
{findText:"^s"} {changeText:" "}    once    Pevné mezery zamění za obyčejné
{findText:"^s- "}   {changeText:" ^= "} once    Spojovník mající z jedné strany pevnou a z druhé normální mezeru nahradí pomlčkou
{findText:"..."}    {changeText:"<2026>"}   once    Tři tečky nahradí znakem elipsis

//Pevné mezery u jednoznakových předložek, zkratek apod.
{findText: " a ", caseSensitive:true}   {changeText:" a^s",  caseSensitive:true}    once    Malé a
{findText: " A ", caseSensitive:true}   {changeText:" A^s",  caseSensitive:true}    once    Velké a
{findText: " i ", caseSensitive:true}   {changeText:" i^s",  caseSensitive:true}    once    Malé i
{findText: " I ", caseSensitive:true}   {changeText:" I^s",  caseSensitive:true}    once    Velké i
//atd.
{findText: " cm ", caseSensitive:true}  {changeText:"^scm",  caseSensitive:true}    once    Připojí pevnou mezeru před zkratku cm
{findText: " cm.", caseSensitive:true}  {changeText:"^scm",  caseSensitive:true}    once    Připojí pevnou mezeru před zkratku cm následovanou tečkou


//Formátování
{findText:"", underline: true, fontStyle: "Bold"}   {changeText:"", appliedCharacterStyle: "Tučný"} once    Zformátuje všechny výskyty podtrženého tučného písma znakovým stylem Tučný
{findText:"", underline: true, fontStyle: "Italic"} {changeText:"", appliedCharacterStyle: "Kurzíva"}   once    Zformátuje všechny výskyty podtrženého kurzivního písma znakovým stylem Kurzíva

Ale nejen to, s pomocí daného konfiguračního souboru lze provést i zformátování tagovaného textu vytvořeného exportem z PageMakeru či QuarkXPressu (návod uvádí autor skriptu zde). Se záměnami HTML či obecně jakýchkoli párových tagů je to poněkud problematičtější, nicméně i zde se najde řešení, nasadíme-li regulární výrazy: o tom nicméně až příště.

Jak vytvořit JSFindChangeList.txt?

Otázkou samozřejmě je, jak konfigurační soubor (či soubory) daného typu vytvořit. V podstatě zde stačí použít jakýkoli textový editor či procesor, který ovšem musí korektně zachovat vložené tabulátory coby oddělovače jednotlivých položek. Jakmile se tabulátory nezachovají, skript skončí chybovým hlášením. Více nežli daný prostředek se ale spíše pro rozsáhlejší konfigurace podle našeho názoru hodí tabulkový procesor (např. Calc v OpenOffice.org), kde jednotlivé sloupce tabulky odpovídají položkám příkazu (viz popis výše), obsah tabulky se pak exportuje do textového souboru pro záměny coby soubor s oddělovači, přičemž nastaveným oddělovačem je tabulátor a položky nejsou při exportu ohraničeny žádnými znaky. Ale pozor, v daném případě není přípustné použití prázdných řádků (ty se totiž exportují s tabulátory, což povede k pádu skriptu), pouze prázdných řádků zakomentovaných.

Pokud chce uživatel uložit aktuální parametry vyhledávacího dialogu použitého v InDesignu, může tak učinit s pomocí skriptu RecordFindChange. Ten převede daná nastavení do textové podoby a uloží je do textového souboru zadaného jména. Odtud si pak uživatel může zkopírovat vybraná (či všechna) nastavení do souboru pro záměny popsaného výše. Ale pozor, daný skript ukládá opravdu všechna nastavení a tak je spíše použitelný k různým ladícím účelům či bližšímu seznámení s možnostmi dané funkce než nějakému rutinnímu naplňování daného seznamu.

Ošetření problémů a rozšířené použití

Určitým zádrhelem mohou být v případě daného seznamu odvolávky na prvky, které v aktuálním dokumentu nemusí existovat. Typickými případy zde jsou textové styly či barvy. Pokud tedy například seznam záměn obsahuje následující příkazy:

{findText:"", underline: true, fontStyle: "Italic"} {changeText:"", appliedCharacterStyle: "Kurzíva"} once Zformátuje všechny výskyty podtrženého kurzivního písma znakovým stylem Kurzíva
{findText:"ahoj", caseSensitive:true} {changeText:"ahoj", fillColor: "Red"} once Všechny výskyty slova "ahoj" obarví barvou ze vzorníku jménem Red

musí být dané styly a barvy v dokumentu definovány.

Řešení dané situace je zde dvojí: modifikace samotného skriptu TextCleanup, což není v mnoha ohledech právě výhodný postup, nebo vytvoření skriptu, ze kterého se daný skript volá (s pomocí metody app.doScript), přičemž se nejprve ošetří existence požadovaných prvků a poté provedou potřebné záměny. Daný skript může vypadat například takhle:

//Souborové cesty v daném skriptu odpovídají standardní instalaci InDesignu CS2.
//Je třeba je případně modifikovat pro změněné podmínky.
var myDoc=app.activeDocument;
var myChScript=File("/c/Program Files/Adobe/Adobe InDesign CS2/Presets/Scripts/TextCleanup.jsx");
if (!myChScript.exists){alert("Skript " + myChScript + " není instalován");exit()}

//Zkontroluje přítomnost znakového stylu Kurzíva v aktivním dokumentu
//Pokud styl daného jména neexistuje, vytvoří jej
try{myDoc.characterStyles.item("Kurzíva").name}
catch(e){myDoc.characterStyles.add({name: "Kurzíva", basedOn: "None", fontStyle: "Italic"})};

//Zkontroluje přítomnost barvy Red v aktivním dokumentu
//Pokud barva daného jména neexistuje, vytvoří ji
try{myDoc.colors.item("Red").name}
catch(e){myDoc.colors.add({name: "Red", model: ColorModel.process, space: ColorSpace.cmyk, colorValue: [15,100,100,0]})};

//Provede TextCleanup
app.doScript(myChScript);

Naznačeným spojením volání TextCleanup s dalšími příkazy lze poměrně pohodlně řešit použití vícero konfiguračních souborů pro záměny (jeden pro jednoznakové předložky, jiný pro čištění od mezer atd.). Příslušný skript by zde mohl vypadat například takto (počítáme zde s konfiguračními soubory s příponou CSV, které se vytvoří například při exportu z tabulkového procesoru, případná úprava pro TXT soubory, propracovanější interakce s uživatelem atd. jsou na čtenáři):

//Souborové cesty v daném skriptu odpovídají standardní instalaci InDesignu CS2.
//Je třeba je případně modifikovat pro změněné podmínky.

var myDoc=app.activeDocument;

//Zjistí přítomnost skriptu TextCleanup v systému
var myChScript=File("/c/Program Files/Adobe/Adobe InDesign CS2/Presets/Scripts/TextCleanup.jsx");
if (!myChScript.exists){alert("Skript " + myChScript + " není instalován");exit()}

//Určí soubor záměn
var myChList=File("/c/Program Files/Adobe/Adobe InDesign CS2/Presets/Scripts/JSFindChangeList.txt");

//Zvolí nový soubor pro záměny a přepíše jim ten původní
var myTList=myChList.openDlg("Zvolte soubor ze seznamem záměn:","Dokumenty CSV: *.csv");
if (myTList== null){alert("Nezvolili jste žádný nový seznam, použiji výchozí nastavení");}
if(!myTList.copy(myChList)){alert("Nelze provést přepsání konfiguračního souboru, zřejmě jej edituje jiná aplikace");exit()};

//Provede TextCleanup
app.doScript(myChScript);

Možné jsou pak mnohé další scénáře nasazení, jako je například nejprve provedení záměn s tím, že jsou vyznačeny určitou barvou. Teprve poté, co je uživatel s jejich provedením spokojen, spustí skript, jenž provede obarvení všeho obsahu vyznačeného danou barvou na černou.

Závěrem

Využití TextCleanup je všestranné, leccos se zde nicméně provádí poměrně pracně vzhledem k omezení samotné hledací funkce InDesignu. Pro pokročilejší a efektivnější zpracování je zde ještě jiná cesta, kterou představují regulární výrazy, o těch si nicméně přece jen povíme až příště. Rádi bychom nicméně ještě ke skriptu TextCleanup podotkli, že v diskusním fóru přivítáme jakékoli podněty, postřehy či dotazy našich čtenářů týkající se praktického využití daného skiptu.

Poznámka: Autor článku si na tomto místě dovoluje poděkovat panu Jaroslavu Vlčkovi ze studia Lacerta za cenné podněty k danému tématu.

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: