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:
-
30. září 2024
-
4. října 2024
-
14. listopadu 2024
-
11. prosince 2024
skenerista, osvitář
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):
- 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
-
5. ledna 2017
-
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ě
-
14. října 2024
-
10. prosince 2024