Pokud tam máte WSH, asi to stačí... Já tu WSH nemám...

[color=#808080](Pokud to teď nemáte čas číst, nechte to na
jindy...)[/color]

-----

Třeba jiná ukázka, co "entity" v ini-file nezvládnou:

Dost často píšu v pascalu tabulku metod něco jako toto:

@C:
  dd offset @Clear             +1
  dd offset NArray_Clear
  dd offset @Copy              +1
  dd offset NArray_Copy
  dd offset @Concat            +1
  dd offset NArray_Concat
  dd offset @Clone             +1
  dd offset NArray_Clone
  ...
  dd 0


Označím blok a script mi z toho vygeneruje toto do externího vieweru
[color=#808080](nebo tam můžete mít "Nový soubor" a otevřít to na novou
záložku...)[/color], už to pak jenom přesunu na správná místa:


@Clear: db 5,'Clear',0
@Copy: db 4,'Copy',0
@Concat: db 6,'Concat',0
@Clone: db 5,'Clone',0
//
function NArray_Clear(Params: PObjCallParams): Boolean; //New200722
begin
  //...
end;
 
function NArray_Copy(Params: PObjCallParams): Boolean; //New200722
begin
  //...
end;

function NArray_Concat(Params: PObjCallParams): Boolean; //New200722
begin
  //...
end;

function NArray_Clone(Params: PObjCallParams): Boolean; //New200722
begin
  //...
end;


Ukázka scriptu:


var Lines:=new TStringList, Procs:=new TStringList, Cols:=new TStringList;
Lines.Text:=StdIn.toString();
for(i=0;i<Lines.Count;i++){
  Cols.Clear();
  Cols.BreakApart(Lines[i],''); // rozdelit podle white-space
  if (Cols[1]=='offset') Cols.Delete(1);
  if (Cols[0]=='dd') {
    var S:=Cols[1];
    if (S=='0') continue;
    if (Cols[Cols.Count-1]=='+1' && S[1]=='@') {
      // mistni label:
      S:=SubStr(S,2);
      L("@%s: db %d,'%s',0",S,Length(S),S);
    } else
    if (S[1]!='@') {
      // externi funkce, nekdy jsou duplicitni:
      if (Procs.IndexOf(S)<0) Procs.Add(S);
    }
  }
}
L('//');
Procs.ForEach(#f(S){
  L('function %s(Params: PObjCallParams): Boolean; //New%s', S,
FormatDate(Now()-0.25, 'yymmdd'));
  L('begin'); L('  //...'); L('end;'); L('');
});


Pak je otázka, kolikrát se to použije, jestli se vyplatí si na to psát ten
script, nebo to smolit párkrát ručně...

S tím oknem na obrázku to má výhodu, že se nemusím starat o žádný
soubor toho scriptu, prostě otevřu okno Script [color=#808080](klávesovou
zkratkou)[/color], něco tam napíšu a Ctrl+Enter spustím... Když to chci
používat častěji, nahoře napíšu jméno a dám tlačítko uložit...
Editor je někde má, jako uživatel se o to nestarám a nezdržuju se ani s
open-dialogem, ani s případným uklízením starých souborů...

K tomu ještě poznámka: v tom seznamu v combo-boxu je na konci položka
"_(Last used)_", to okno se implicitně otevírá s naposledy použitým
scriptem, i když jsem ho neuložil, pamatuje si to poslední použitý
automaticky...

K tomu ještě poznámka: okno Script je ne-modální, ale plovoucí nad
editorem... [color=#808080](V CreateParams má Style:=Style or WS_OVERLAPPED a
má nastavené WndParent...)[/color]
Takže se můžu překliknout zpátky do editoru a kopírovat kousky textu přes
schránku do toho scriptu... Tlačítko "OK" to spustí, ale okno scriptu
nezavře, takže můžu třeba označit další kus textu a spustit znovu...
Nebo je tam na to Checkbox, jestli se to má při použití zavřít...

-----

Jen poznámka, že já to teď akutně nepotřebuji... V případě potřeby to
jde i z příkazové řádky přes schránku...
[color=#808080](Já mám na něco vlastní Editor, a na něco používám PSPad,
třeba na soubory v utf8, což ten můj Editor neumí...)[/color]

Ale je to zajímavý nápad a ta varianta s externím programem je celkem
jednoduchá na implementaci a uživatelsky pohodlná...

Nevím, jak často se vám stane, že píšete a duplikujete řádky a postupně
tam něco přepisujete, co by šlo vygenerovat v nějakém "for" ve scriptu, ale
ukládat na to script do souboru je zbytečně složité?

Nebo když je za každým výskytem něčeho v souboru potřeba přidat na
další řádku něco jiného nebo to nějak netriviálně nahrazovat...

Takhle k použití je to uživatelsky dost zjednodušené...

Nebo příklad: otevřu "content.xml" ze souboru ODT z open-office, ve scriptu
to XML z jedné dlouhé řádky přeformátuji, aby se v tom dalo editovat:
L(DomParseXml(StdIn.toString(),{preserveSpace:true}).xml)
a pak to zase scriptem vrátit zpátky na jednu dlouhou řádku:
StdIn.EnumLines(#f(S){StdOut.Write(Subst(TrimLeft(S),'&nbsp;',#$A0))});[/c
ode]
[color=#a0a0a0](OpenOffice neumí &nbsp;, ale moje implementace XML to nahrazuje
na vstupu automaticky... Property .xml automaticky indentuje, mezery jsou při
{preserveSpace:true} zachované na konci řádků, property .xmlNonIndent by
měl zachovat původní indentaci...
Další možnost, jak to XML rozložit na víc řádek, je vložit
odřádkování před > na konci hlaviček elementů, kde to není /> ... To se
pak nemusí skládat, to OpenOffice ignoruje automaticky a nevloží tam mezery
navíc...
Třeba na tohle PSPad občas používám, protože to můj editor nezvládne,
ale smolím to na té jedné dlouhé řádce a jde to dost pomalu, když to má
pár Mb... Ale ušetřilo mi to dlouhé piplání v OpenOffice, kde vkládání
odkazů automaticky obarvuje a podtrhává text a vložit tam další styl
<text:a ...><text:span...> je problematické, v XML to jde jednoduše...
Vracet opravený content.xml nebo styles.xml do souboru ODT není triviální,
protože musí být v tom ZIPu v původním pořadí, jinak to OpenOffice
neotevře... Mám na to funkci ve scriptu:

#dll EvalArc
var Z:=OpenArchive('soubor.odt','zip');
Z.ReplaceFile('content.xml','soubor_content.xml');

)
[/color]

-----

Na ukázku moje implementace okna [color=#808080](pas+dfm)[/color] :
UScripter.zip (viz http://semi.gurroa.cz/AltUtil/Source/UScripter.zip )
[color=#808080](V delphi to asi nepůjde otevřít, když mám jiné komponenty,
a ukládají se ty scripty do registry, vy byste to asi spíš dával do
nějaké složky do souborů...? Je tam ale ta funkce na spouštění a
zápis/čtení pipe, viz btOkClick a nad tím kódy těch threadů...)[/color]

-- 
<https://forum.pspad.com/read.php?1,73966,73970>
PSPad freeware editor https://www.pspad.com

Odpovedet emailem