GeoGet

Complete geocaching solutions

User Tools

Site Tools


user:skript:stator:develop:stator-vyvojmodulu

Dokumentace pro vývoj modulů

Generování statistik pomocí pluginu Stator je založeno na modulech. Velké množství základních modulů obsahuje již samotná instalace Statoru. Další moduly ale může v podstatě vytvořit kdokoli, kdo má trochu znalostí a chuti do programování pluginů pro GeoGet. Moduly pro Stator jsou takovou jejich odnoží. K tomu, aby vytvořené moduly mohl Stator použít, je třeba dodržet pár pravidel. Jejich popisem se bude zabývat právě tato stránka.

Rozcestník vývojové dokumentace

PageDateDescriptionTags
Dokumentace pro vývoj modulů2021/01/17 11:43stator Dokumentace pro vývoj modulů Generování statistik pomocí pluginu Stator je založeno na modulech. Velké množství základních modulů obsahuje již samotná …,

Překlady do jiného jazyka

Trochu mimo téma, hned na začátku stránky něco, co nemá s moduly až tak moc společného a není to ani příliš věc programátorů: možnost překladu Statoru do dalších jazyků. Stator využívá jazykových nástrojů, které mu poskytuje GeoGet, ale pro práci s moduly se tyto prostředky ukázaly jako nedostatečné nebo nevhodné, takže je situace trochu komplikovanější. Pro překlad do dalšího jazyka (XX označuje kód jazyka, pro EN se neuvádí) je třeba:

  • vytvořit další jazykový překlad pomocí POEditu (soubor *.po)
    • některé položky (zejména nabídky v seznamech) z formulářů nesmějí být překládány, protože by to narušilo vyhodnocení v pluginu. Takové položky jsou označeny v českém jazykovém souboru
    • Soubor musí mít správně nastavené hodnoty v menu Katalog - Vlastnosti, zejména kód jazyka
    • soubor default.po a default.mo vytvořený POEditem musí být uložen v adresáři Locale\XX\LC_MESSAGES
    • ověřit správné texty je možné spuštěním GeoGetu s parametrem -l=XX. Pokud není GeoGet do jazyka přeložen, bude v angličtině, ale Stator v uvedeném jazyce bude
  • každý modul v adresáři Modules a jeho podadresářích má v soubor <Modul>.ini položku Description_XX, kterou je pro nový jazyk potřeba doplnit
  • každý modul má soubor se seznamem parametrů Modules\<Modul>.Params.ini. Každý parametr má svoji sekci [Parametr_XX] a je třeba je v souboru doplnit, příslušné položky přeložit. Pozor, nabídky obsahují před pomlčkou nepřekládanou hodnotu, která je při zpracování testována
  • soubor Modules\CustomizedTable_XX.html obsahuje stručný popis a nápovědu pro nastavení parametrů tohoto modulu
  • v adresáři Common jsou soubory *_XX.ini, zejména ColumnNames_XX.ini, který obsahuje nadpisy jmen sloupců generovaných tabulek
  • soubor Common\Replace_XX.ini implicitně obsahuje znaky národní abecedy, které server geocaching.com neumí správně zpracovat v jiném formátu než HEX kódu. Je tedy vhodné, pokud takové znaky existují, soubor vytvořit a naplnit

Až toto bude hotovo, musím přidat jazyk do nabídky pro generování statistiky. Bez toho bude v novém jazyce jen vlastní Stator, ale ne výstupní statistika.

Základní pojmy

Stator je modulární - skládá výslednou statistiku z výstupu jednotlivých modulů. Kromě samotných modulů Stator rozeznává i další pomocné entity, které mu slouží ke strukturování statistiky, organizování procesu její tvorby a definici proměnných. Stator rozlišuje tyto entity:

  1. moduly - jsou základními funkčními bloky. Každý modul je samostatný skript, který vytváří nějakou část statistiky. Moduly jsou parametrizovatelné a jejich výstup proto závisí na nastavení uživatelem, případně na výsledcích jiných modulů. Moduly Stator rozděluje na:
    • prezentační moduly - tedy moduly, jejichž výstupem je část HTML kódu statistiky - např. graf, tabulka, seznam keší, text.
    • výpočetní moduly - tyto moduly poskytují ostatním modulům jakousi podporu. Připravují pro ně hodnoty proměnných, poskytují jim univerzálnější funkce a podobně.
      Jméno těchto modulů začíná znaky Calc
  2. organizační bloky - jsou entity, které slouží jádru Statoru ke strukturování výstupu. V rámci definice statistiky slouží tyto bloky ke zobrazení stromové hierarchie. V rámci vytvořené statistiky se jedná členění výsledného dokumentu. Organizační bloky využívá jádro při skládání výstupů prezentačních modulů na HTML stránce, kterou člení na základní statické části, záložky, rámy a sloupce. Protože s ve své podstatě jedná o příkazy jádra, jméno těchto modulů začíná znaky Cmd
  3. příkazy - jsou specifické jednoduché funkce (např. pro vložení HTML příkazu do výstupu), které provádí přímo jádro Statoru a není tak pro ně třeba použít modul.
    Jméno těchto modulů začíná znaky Cmd
  4. předdefinované skupiny - slouží pro snadné skládání statistiky z předem připravených vyšších celků. Tyto celky jsou složeny z dříve uvedených entit a tvoří vlastně větev definičního stromu. Stator umožňuje přepínání uživatelského rozhraní podle úrovně znalostí uživatele. V nejjednodušším módu Stator umožní jen skládání statistiky z předdefinovaných skupin. Uživateli je nabídnuto zjednodušené rozhraní a je odstíněn od detailních nastavení. Nic mu ale nebrání přepnout do vyšších módů.
    Tyto moduly jsou pro přehlednost uloženy v podadresáři Predefined

Postup při generování statistiky

Aby bylo možné správně vytvořit modul, je třeba si ujasnit, jak Stator moduly používá. Následující postup se týká pouze těch modulů, které uživatel v konfiguraci určil jako použité pro generování statistiky.

  1. Stator seřadí všechny výpočetní moduly definované v konfiguraci podle vzájemných závislostí a postupně zavolá hlavní funkci z každého modulu, čímž se předpokládá, že budou vytvořeny všechny globální proměnné, které mohou potřebovat prezentační moduly. Pochopitelně, pokud výpočetní modul nabízí nějaké funkce ostatním modulům, Stator je přímo nespouští, o jejich spuštění se musí postarat modul v případě potřeby příslušné funkce.
  2. prochází připravenou definici statistiky a postupně pro každý prezentační modul:
    • vypočítá šířku, do které modul generuje výstup a nastaví globální proměnnou iWidth i modulu předávaný parametr Width
    • vytvoří seznam parametrů, které modul potřebuje (součástí je i ID modulu, tedy pořadové číslo v rámci generované statistiky)
    • spustí hlavní funkci modulu a předá jí připravené parametry
    • převezme výstup z funkce - předpokládá se, že výstupem je HTML kód 1 zařazený do výstupu
    • v převzatém výstupu nahradí všechny globální proměnné správnými hodnotami
    • konvertuje výstup do správného výstupního kódování
    • zapíše výstup do výstupního souboru
  3. Stator postupně spustí všechny uvolňovací funkce všech výpočetních modulů, čímž by mělo dojít k uvolnění všech prostředků alokovaných výpočetními moduly. Funkce jsou spouštěny v opačném pořadí než byly spouštěny hlavní funkce výpočetních modulů.

1 Výstup z modulu je v kódování ANSI a jádrem je převedeno na výstupní kódování statistiky. V některých případech je nutné mít kódování části výstupu konstantní, nezávislé na nastavení statistik (např. pro grafy generované přes Google API je URL vždy v kódování UTF-8). V tom případě musí modul zajistit

  • náhradu proměnných pomocí funkce ReplaceGlobalVar()
  • převod na správně kódování např. funkcí AnsiToUtf()
  • zápis přímo do výstupního souboru použitím metody fOut.Write()

Programové soubory pro generování statistiky

Soubory pro generování statistiky jsou uloženy do adresáře aktuálního statistického profilu v okamžiku uložení konfigurace. To umožňuje současnou existenci několika pluginů pro generování statistiky s různým nastavením a umožňuje to různá “kouzla” (např. spojit statistiku keší a waymarků, tedy data ze dvou různých databází).

StatorGen.ggp.pas

Vlastní statistiku generuje plugin StatorGen.ggp.pas. Ten vznikne při uložení konfigurace statistiky ze souboru StatorGen.Engine.pas (tj. jádro) jeho překopírováním z hlavního adresáře Statoru do adresáře aktuálního statistického profilu. Po překopírování je v souboru nahrazena proměnná profilu aktuálním profilem.

StatorGen.modules.pas

Celý soubor StatorGen.modules.pas je generován Statorem a jeho obsah plně závisí na konfiguraci statistiky. Soubor obsahuje příkazy pro vložení souborů všech použitých modulů a obsahuje i funkci StatorGen. Tato funkce se stará o volání hlavních funkcí všech modulů, předání správných parametrů, převzetí výstupu z modulů, náhradu proměnných, konverzi do výstupního kódování a vytvoření výstupního souboru.

Konvence

Aby spolu mohlo koexistovat větší množství modulů, je nutné dodržet jisté konvence. V opačném případě nebude statistika funkční. Modul je složen z následujících souborů text <modul> si nahraďte skutečným jménem modulu:

  • <modul>.ini - definuje typ modulu, seznam parametrů a další (zatím nevyužívané) vlastnosti
  • <modul>.meta.ini - je standardní instalační soubor, který definuje závislosti na jiných *.gip souborech, tedy i jiných modulech. Soubor je jen u modulů, které nejsou obsaženy ve standardní instalaci Statoru
  • <modul>.params.ini - přesně specifikuje všechny parametry modulu, jejich typy, možné hodnoty, jejich popis, …
  • <modul>.stator.pas - vlastní výkonný program modulu. Soubor povinně obsahuje hlavní funkci <modul>_Run(params:TStringList):string; (příkazy a organizační bloky tento soubor nemají, protože jejich funkci zajišťuje přímo Stator)
  • <modul>.*.png - soubory obsahují obrázek s ukázkami výstupu modulu. Stator tyto obrázky zobrazuje při kliknutí na modul, aby měl uživatel představu, co modul produkuje. Pokud je obrázků více, lze mezi nimi přepínat opakovaným klikáním. Soubory s obrázkem nejsou povinné, jen vřele doporučené
  • <modul>.css - definice kaskádových stylů použitých jen a pouze v jediném konkrétním modulu, pokud je soubor tohoto jména v adresáři profilu, bude použit přednostně 2.2

Všechny funkce a globální proměnné definované v <modul>.stator.pas musí začínat <modul>_.

Moduly nesmějí obsahovat funkce povinné pro pluginy GeoGetu (např. PluginStart, Work, PluginCaption, …).

Popis souboru <modul>.ini

Soubor popisuje základní vlastnosti modulu. Obsah souboru se trochu liší pro moduly, které jsou ve standardní distribuci Statoru a pro moduly mimo tuto distribuci.

  • standardní moduly mají potřebné položky, které jsou čteny ze souboru <modul>.meta.ini, přímo v souboru <modul>.ini. Standardní modul má v souboru 3 sekce - [Module], [Info], [Dependency] a volitelně [Variables]
  • modul distribuovaný mimo standardní instalaci má jedinou sekci [Module] a volitelně [Variables]
Sekce [Module]
CATEGORY Kategorie, do které modul patří. Prezentační modul může patřit do více kategorií, pak jsou uvedeny všechny a jsou oddělené čárkou. Možné hodnoty jsou: ORG (organizační blok), COMMAND (příkaz), CALC (výpočetní modul), PREDEFINED (předdefinovaná skupina), MY_OWN (statistiky mých vlastních keší, GROUP (statistiky skupiny uživatelů), FOUND_CHART (graf z nalezených keší), FOUND_TABLE (tabulka z nalezených keší), FOUND_MAP (mapa z nalezených keší).
PARAMS Seznam jmen parametrů, jména jsou oddělená čárkou. V pořadí zde uvedeném se zobrazuje ve Statoru seznam parametrů k editaci. Uveďte proto v pořadí dle důležitosti.
PARAMS_GGP Pokud je modul složitější a potřebuje k nastavení parametrů vyvolat svůj vlastní script, je zde uvedena relativní cesta vůči GEOGET_SCRIPTDIR a jméno scriptu, který má být spuštěn, např. BadgeGenII\BadgeGenSetting.ggp.
CSS Vyjadřuje schopnost modulu generovat výstup plně využívající kaskádové styly. Možné hodnoty jsou: Yes (vždy generuje výstup používající CSS), No (nikdy negeneruje výstup používající CSS), Possibly (výstup používající CSS může nebo nemusí být generován, závisí to na nastavení vstupních parametrů při spuštění modulu).
JAVASCRIPT Vyjadřuje schopnost modulu generovat výstup využívající Javascript. Možné hodnoty jsou: Yes (vždy generuje výstup používající Javascript), No (nikdy negeneruje výstup používající Javascript), Possibly (výstup používající Javascript může nebo nemusí být generován, závisí to na nastavení vstupních parametrů při spuštění modulu).
Sekce [Info]
Description Stručný popis funkce modulu v angličtině.
Description_XX Stručný popis funkce modulu v jazyce, jehož zkratka je XX - pro češtinu XX=CS.
Sekce [Dependency]
Jméno_modulu=[NoWarn] Sekce obsahuje moduly a pluginy, které jsou pro správnou funkci modulu potřeba. Standardní moduly nemají z pochopitelných důvodů uvedený plugin Stator. Parametr NoWarn potlačuje kontrolu parametrů při vytváření závislostí. Je vhodný pouze pro moduly, kterým je předáváno pole parametrů přímo z výkonné funkce modulu.
Sekce [Uses]
Jméno= Sekce obsahuje jména knihoven/modulů, které jsou vkládány příkazem uses například simplexml.
Sekce [Variables]
* Sekce obsahuje seznam všech proměnných a funkcí, které modul poskytuje ostatním modulům (zapisuje do globálních proměnných).

Popis souboru Modul.params.ini

Soubor popisuje všechny parametry, které pro modul má nebo může uživatel nastavit. Obsahuje pro každý parametr a jazyk samostatnou sekci s proměnnými, které jej plně popisují a říkají Statoru jak jej obsluhovat.

Popis souboru <modul>.Stator.pas

Jde o vlastní výkonný soubor modulu. Povinně musí obsahovat funkci

function <modul>_Run(aParams:TStringList):string;

Výpočetní moduly nemají hlavní funkci, ale přinejmenším:

  function <modul>_Run(aParams:TStringList):string;
  procedure <modul>_Free;

První z uvedených funkcí je inicializační, může ale také zajistit všechny výpočty. Během inicializace nebo výpočtů mohou být vytvářeny různé proměnné, …, které mohou využívat ostatní moduly. Výpočetní modul může také nabízet modulům některé své funkce/procedury.

Po vykonání všech modulů zavolá Stator postupně všechny <modul>_Free procedury všech výpočetních modulů tak, aby byly korektně uvolněny všechny alokované zdroje.

Pozor na odlišné volání výpočetních modulů v případě, kdy je doplněn automaticky od případu, kdy modul je zařazen do stromečku použitých modulů.

  • při automatickém zařazení je předaný seznam parametrů vždy nil, modulu nejsou předány žádné parametry
  • při automatickém zařazení se ignoruje návratová hodnota

Příkladem může být výpočetní modul CalcTrackable, který při své inicializaci vytváří dočasnou databázovou tabulku, kam ukládá informace o trackovacích předmětech. Protože výstupů může být několik a o získání dat se stará externí pluginy, bylo by neekonomické při každém výstupu znovu načítat všechna data. Jsou tedy načtena jen jednou ve výpočetním modulu a uložena do tabulky. Z této tabulky jsou pak prezentačním modulem Trackable data formátována do požadovaného výstupu. Vlastní prezentační modul může být použit vícekrát pro zobrazení přehledu různých předmětů. Procedura CalcTrackable_Free se tedy na konci práce Statoru postará o uvolnění databázové tabulky.

Požadavky na instalaci modulu

*.meta.ini

Konfigurační soubor instalace modulu (*.meta.ini) by měl obsahovat

[info]
...
parent=Stator

Tím bude zajištěno správné zobrazení modulu v seznamu instalovaných pluginů - modul bude zařazen jako podřízený plugin.

Postinstalační script *.gpi.pas

Moduly, které nejsou obsažené ve standardní instalaci a jsou instalované samostatně jako každý jiný plugin GeoGetu, by měly kromě správně nastaveného *.meta.ini souboru zajistit také zkopírování všech svých souborů, které jsou uživatelsky závislé, do všech profilů. Nejedná se o vlastní výkonný kód modulu, ale o případná nastavení, například soubory s definicemi stylů pro správné formátování výstupu s možností uživatelského nastavení.

Podrobnosti o spouštění modulů

Jádro spouští hlavní funkci modulu a předává jí parametry nastavené v konfiguraci statistik. Parametry jsou vždy předávány v poli TStringList ve formátu

Jméno=hodnota

Mezi parametry jsou vždy parametry doplněné jádrem:

ParametrPopis
ID Jedinečné identifikační číslo objektu v rámci statistik.
Width Šířka, do které musí modul umístit svůj výstup.

Přístup k hodnotě Width ukážu jednoduché hlavní funkci modulu:

function JmenoModulu_Run(aPar:TStringList):string;
var sWidth:string;
begin
  sWidth:=aPar.Values['Width'];
  ...
end;

Číselná hodnota šířky je zároveň uložena i v globální proměnné iWidth.

Jména parametru jsou implicitně závislá na velikosti písmen a používají tzv. CamelCase - První písmena slov velká, ostatní malá. Uvedený přístup je možné modifikovat na nezávislý na velikosti písmen nastavením vlastnosti

aPar.CaseSensitive:=false;

Tabulka temp.Stator

Stator při svém startu vytvoří dočasnou tabulku temp.Stator, která slouží ke snadnému testování toho, zda uživatel má nalezenou kešku. Tabulka dál obsahuje pořadí nálezu s ohledem na uživatelem zadaný způsob řazení nálezů (podle dtfound+dtfoundtime, dtfound+dtfoundtime+logID, jen podle logID) a vypočtenou vzdálenost a směr od souřadnic zadaných v konfiguraci. Autor modulu se tak nemusí starat o různý způsob řazení ani výpočty vzdáleností, může použít data připravená v této tabulce a výsledek bude konzistentní napříč všemi moduly Statoru. Tabulka má 4 sloupce:

PolePopis
id GC kód nalezené keše
distance vypočtená vzdálenost keše od nastavených domovských souřadnic (v kilometrech)
angle vypočtený úhel ke keši od nastavených domovských souřadnic
rowid pořadí nálezu podle nastaveného typu řazení

Pozn. rowid není fyzický sloupec v tabulce, ale systémový sloupec. Nicméně přístup k němu je stejný jako k fyzickému sloupci.

Přístup k této tabulce je jen přes plně kvalifikované jméno tabulky temp.Stator. V globálních konstantách je definováno

TEMP_TABLE='temp.Stator';

Používejte v modulech v SQL příkazech při použití dočasné tabulky tuto konstantu místo skutečného jména.

Použití dočasné tabulky vytvořené v aktuální databázi (proměnná GEOGET_DB) má jistá omezení pro moduly. Modul nesmí tuto aktuální databázi přepínat, protože přepnutím a návratem zpět dojde ke ztrátě dočasných tabulek a následující činnost Statoru nutně musí zhavarovat. Pokud je třeba v modulu použít jinou databázi, vytvořte pro ni novou instanci a pracujte s ní. Jednoduchá ukázka takového přístupu:

var JinaDB:TSqliteDatabase;
...
begin
  JinaDB:=TSqliteDatabase.Create(GetDbPathName());
  try
    //pak vsude misto GEOGET_DB pouzivam, napr.
    s:=JinaDB.GetTableString('SELECT ...');
    ...
  finally
    JinaDB.Free();
  end;
end;

Seznam proměnných

Proměnné, které jsou modulu dostupné, jsou rozděleny na dvě skupiny:

  • proměnné jádra - modul je může použít přímo, jejich jména ve výstupu z modulu nejsou nahrazována příslušnými hodnotami
  • globální proměnné - při použití ve výstupním stringu z modulu jsou uzavřeny mezi znaky % (tedy %jméno%) a jádro nahradí tento text při generování výstupu statistiky skutečnou hodnotou proměnné. Pokud potřebuje modul znát nebo změnit hodnotu proměnné, použije k tomu jednu z funkcí pro přístup k nim.

Proměnné jádra

Jádro obsahuje 2 sady proměnných:

  • hodnoty, které v žádném případě nesmí modul měnit
  • proměnné určené pro zápis modulem

Hodnoty neměnitelné modulem

Jde vesměs o hodnoty načtené z konfigurace nebo hodnoty z konfigurace odvozené. Tyto hodnoty by neměly být modulem změněny, jinak může být narušena funkčnost. Řadím sem i proměnné, které sice funkci Statoru neovlivní, ale s jejich změnou by měli být autoři modulů obezřetní.

sProfile:string
jméno profilu, v kterém je generována statistika
sLang:string
jazyk, v kterém plugin pracuje
sLangOut:string
výstupní jazyk statistik
sOutCoding:string
typ kódování výstupní statistiky (cp1250, UTF-8, …)
sCachePrefix:string
prefix bodů (keší) zpracovávaných do statistiky, implicitně GC
sGcCzId:string
ID uživatele na geocaching.cz (ačkoli jde o číslo, je proměnná typu string)
sGuidCom:string
GUID uživatele na geocaching.com (od verze 1.2.3)
bCss:boolean
příznak uživatelem povoleného použití kaskádových stylů
bJavascript:boolean
příznak uživatelem povoleného použití Javascriptu
bColorScale:boolean
příznak uživatelem povoleného použití škálování barev
fHomeX, fHomeY:extended
domovské souřadnice pro výpočty vzdáleností …
iSortFound:integer
uživatelem požadovaný způsob řazení nálezů (viz. Config.ini nebo nastavení konfigurace ve formuláři)
sIgnoreCaches:string
seznam GC kódů keší, které si uživatel přeje vynechat při výpočtech vzdáleností, … Seznam je ve formátu pro frázi IN do SQL příkazu
sLocationlessCaches:string
seznam GC kódů nalezených Locationless keší. Seznam je ve formátu pro frázi IN do SQL příkazu

Hodnoty, které jádro nastavuje pro každý modul:

sModuleName:string
jméno aktuálně prováděného modulu
iItem:integer
jedinečné identifikační číslo objektu, který má modul generovat. Hodnota odpovídá parametru ID předanému modulu na konci jeho vlastních parametrů.
iWidth:integer
šířka, do které generuje modul svůj výstup. Pokud jsou správně nastaveny hodnoty v souboru Styles.ini, tato šířka zohledňuje i hodnoty margin , border a padding všech elementů ve struktuře nadřazených modulů. Např. tedy hodnoty definované u záložky, rámce, sloupce a nakonec i bloku pro samotný modul.

Hodnoty určené pro změnu modulem

Jedná se o proměnné, které může modul využít k indikaci chyby nebo zobrazení nějakého textu … Doporučuji používat funkci AddError(), která s těmito proměnnými pracuje automaticky.

nModuleErrors:integer
Počet chyb, které modul hlásí. Chybový text může obsahovat více chyb najednou, jejich počet je v této proměnné. Nenulová hodnota indikuje pro jádro chybu modulu, jádro pak zobrazí počet chyb, číslo chyby a text vrácený modulem.
iModuleError:integer
Vlastní hodnota je nezajímavá, jádro s ní nijak nepracuje, jen zobrazí číslo.
sModuleError:string
Je text chyby. Pokud je hodnota proměnné iModuleError nenulová, bude text z této proměnné zobrazen současně se zobrazením hodnoty iModuleError.

Pokud jádro zobrazí návratovou hodnotu a text z modulu, zároveň zobrazí dotaz na pokračování ve výpočtu statistik.

aNumbersPersonal:TStrinList
Jde o pole řádků doplněných ke standardní sadě tabulky zajímavých čísel. Každý řádek obsahuje tři položky oddělené svislítkem. Položky jsou jméno sekce, levá část a pravá část řádku. Pokud jméno sekce nepatří ke standardně generovaným sekcím, bude na konci tabulky vytvořena nová sekce s odpovídajícími řádky. Do pole řádků může doplňovat libovolný jiný modul. Zároveň jsou do pole automaticky doplněny řádky ze souboru NumbersAdd.ini v adresáři profilu.

Globální proměnné

Globální proměnné jsou nahrazovány v uvedeném pořadí, takže je možné použít jejich vnořování. Například proměnná definující styl rámu může obsahovat jména proměnných pro barvy pozadí a textu rámu. Jádro napřed nahradí jméno proměně se stylem jeho skutečným stylem a pak ve stylu nahradí jména barev jejich RGB hodnotami.

Všechna jména proměnných jsou závislá na velikosti písmen!
Při použití globálních proměnných je nutné název proměnné uzavřít do znaků %, např. datum generování statistiky vložíme jako %StatisticStartDate%

Hodnoty ze souborů

Pokud je třeba hodnoty změnit, musí je uživatel změnit úpravou souboru. Výjimkou jsou jen barvy. Hodnoty barev uložené je možné měnit přímo v pluginu na záložce Colors.

Styles* definice použitých stylů pro formátování jednotlivých prvků
Color* definice použitých barev v RGB formátu
IconCacheType* ikony typů keší, místo hvězdičky je plné jméno typu konvertované funkcí StringCompress() nebo jedno písmeno typu používané v GeoGetu, položka TypeID
IconCacheTypeSmall* malé ikony typů keší, místo hvězdičky je plné jméno typu konvertované funkcí StringCompress() nebo jedno písmeno typu používané v GeoGetu, položka TypeID
IconCacheSize* ikony velikosti keší, místo hvězdičky je plné jméno velikosti konvertované funkcí StringCompress() nebo jedno písmeno pro velikost keše používané v GeoGetu
IconCacheDiff* ikony obtížnosti keší, místo hvězdičky je číselně vyjádřená obtížnost nebo písmeno používané v GeoGetu, položka TypeID
IconCacheTerr* ikony terénu keší, místo hvězdičky je číselně vyjádřený terén nebo písmeno používané v GeoGetu, položka TypeID
IconCacheStatus* ikony stavu keší, místo hvězdičky je Enabled/Disabled/Archive nebo hodnota stavu použitá v databázi 0/1/2
IconCacheLog* ikony typů logu, místo hvězdičky je plný typ logu konvertovaný funkcí StringCompress()
IconDirection* ikony směru, místo hvězdičky je anglická zkratka směru v osmistupňové škále (N, NE, E, …) nebo odpovídající hodnota ve stupních
IconCountry* ikony států, místo hvězdičky je dvoupísmenný ISO kód země nebo název země podle Groundspeaku z databáze GeoGetu
IconLayout* ikony, použité v grafických stylech (rozbalení/sbalení frame, nápověda,…), ikony pro záložky a frame (ve dvou velikostech a typech), které je možné na odlišení, jaké informace záložka nebo frame obsahuje; místo hvězdičky je název ikony podle Common/IconsLayot.ini

Hodnoty vypočtené a závislé na uživateli

CRLF odřádkování ve výstupním souboru - protože výstupní soubor je v HTML formátu, je odřádkování víceméně formální záležitostí pro přehlednost statistiky v HTML formátu a až na výjimky nemá žádný vliv na výsledné zobrazení.
Profile jméno profilu, v kterém jsou statistiky generovány
GeogetOwner uživatel GeoGetu, který spouští statistiku
OwnedAuthorsForInPhrase seznam autorů, kteří jsou považováni za autory “mých keší”. Seznam je ve formátu pro frázi IN v SQL příkazu (např. 'gordici','gord' )
OwnedIdsForInPhrase seznam vlastněných keší ve formátu vhodném pro frázi IN v SQL příkazu. Seznam je získán buďto přímo z konfigurace statistik (pokud tam je seznam keší uveden) nebo je získán jako seznam všech možných keší podle konfigurace Statoru (podle GEOGET_OWNER, OwnedAuthorsForInPhrase a doplňkového seznamu ID vlastněných keší.
OwnedLABIDsForInPhrase2.1.2.28 seznam GC kódů LABek, které patří GEOGET_OWNER. Seznam je ve formátu pro frázi IN v SQL příkazu.
StatisticStartDate datum spuštění generování statistiky
StatisticStartTime čas spuštění generování statistiky ve tvaru HH:MM
FoundCachesCount celkový počet nalezených keší
FoundLogsCount celkový počet “nálezových” logů, tedy logů Found it, Attended a Webcam Photo Taken
Evaluate(výraz [,n]) pseudoproměnná, pomocí které je možné vypočítat vlastní hodnoty z jiných globálních proměnných. Vyhodnocení aritmetického výrazu podporuje základní operátory +, -, *, /, ^ (mocninu) a závorky ( ). Rozlišuje se priorita operátorů, konstanty zapisujte s desetinným oddělovačem . (tečka). Druhý nepovinný parametr n určuje počet desetinných míst, na které bude zaokrouhlen a zobrazen výsledek. Příklad: pseudoproměnná %Evaluate(100 * %Calc_FTFCount% / %FoundCachesCount%, 2)% bude v HTML textu nahrazena hodnotou FTF indexu, zobrazeného na dvě desetinná místa.
TableListLastRowCount1.3.1.10 počet řádků, které byly k dispozici pro poslední zpracovávanou tabulku
TotalDistance1.4.1.12 celková vzdálenost od keše ke keši v km
CentroidCoord1.4.1.12 souřadnice geometrického středu nalezených keší
CentroidDistance1.4.1.12 vzdálenost geometrického středu nalezených keší od domácích souřadnic
CentroidAngle1.4.1.12 azimut geometrického středu nalezených keší od domácích souřadnic

Funkce použitelné v modulech

Modul pochopitelně může používat všechny funkce, které poskytuje GeoGet. Omezení ohledně těchto funkcí je dvoje:

  • přepínání databází, omezení je popsáno v popisu pracovní tabulky
  • v obsluze Busy Dialogu; byl bych rád, kdyby modul využíval pouze funkci:
function GeoBusyTest:boolean;

Pro zápis a zobrazení postupu by moduly měly používat funkci:

procedure StatorBusy(Message:string);

Jádro kromě parametrů předávaných při spuštění hlavní funkce modulu a globálních proměnných poskytuje modulům i funkce, jejichž úkolem je zjednodušit práci programátora modulu a unifikovat některé postupy a výstupy.

Nastavení Statoru

function GetMyDir: string;
function GetModulesDir: string;
  • Vrací adresář s moduly Statoru.
function GetProfilesDir: string;
  • Vrací adresář s profily Statoru.
function GetMyProfileDir: string;
  • Vrací adresář s aktuálním profilem Statoru.

Obecné funkce

procedure StatorAbort;
  • Přeruší zpracování statistiky.
procedure AddError(sText:string);
  • Přidá sText mezi texty modulem hlášených chyb. Chyby budou vypsány najednou automaticky po návratu z modulu do funkce jádra.
function ScaleColor(iValue,iValueMin,iValueMax:integer;sColorMin,sColorAvg,sColorMax:string):string;
  • Funkce vrací hodnotu škálované barvy pro hodnotu iValue a bere ohled na uživatelské nastavení s povolením škálování barev. Škáluje se číselný prostor iValueMin - průměr - iValueMax na barevný prostor sColorMin - sColorAvg - sColorMax. Lze tak např. dosáhnout škálování zelená - žlutá - červená.
function ConvertFromKm(fLength:extended; sUnitTrg:string):extended;
  • Funkce převede vzdálenost z kilometrů na jednotku podle sUnitSrc. Povolené hodnoty sUnitSrc jsou: Meter, Mile, Yard, Foot, Inch. FIXME
function ConvertToKm(fLength:extended; sUnitSrc:string):extended;
  • Funkce převede vzdálenost z jednotek sUnitSrc na kilometry. Povolené hodnoty sUnitSrc jsou: Meter, Mile, Yard, Foot, Inch. FIXME
function ConvertLength(fLength:extended; sUnitSrc,sUnitTrg:string):extended;
  • Funkce převede vzdálenost z jednotek sUnitSrc na jednotky sUnitTrg. Povolené hodnoty sUnitSrc/Trg jsou: Meter, Mile, Yard, Foot, Inch. FIXME
function GetLengthAbbr(sUnit:string):string;
  • Funkce vrací textovou zkratku jednotky sUnit. Vhodné na popisy os grafů apod. Povolené hodnoty sUnit jsou: Kilometer, Meter, Mile, Yard, Foot, Inch. FIXME
function DirectionToIcon(fAngle:extended):string;
  • Převede azimut na ikonku směru. Např. DirectionToIcon(201.53) vrátí string %IconDirection180%.
function EncodeDataExtended(iNum:integer):string;
  • Funkce vrací vstupní hodnotu zakódovanou do znaků pro komprimovaný datový formát Google Image Charts API. Převedeny jsou vstupní hodnoty v rozsahu 0-4095 na dvouznakovou hodnotu Extended Encoding Formatu. Vstupní hodnoty mimo rozsah funkce vrací jako neznámou resp. chybějící hodnotu (dvě podtržítka).
function EncodeNormDataExtended(iNum,iMax:integer):string;
  • Funkce znormalizuje rozsah 0-iMax na rozsah 0-4095 a převede pomocí EncodeDataExtended().
function EncodeDataSimple(iNum:integer):string;
  • Funkce vrací vstupní hodnotu zakódovanou do znaku pro komprimovaný datový formát Google Image Charts API. Převedeny jsou vstupní hodnoty v rozsahu 0-61 na jednoznakovou hodnotu Simple Encoding Formatu. Vstupní hodnoty mimo rozsah funkce vrací jako neznámou resp. chybějící hodnotu (podtržítko).
function EncodeNormDataSimple(iNum,iMax:integer):string;
  • Funkce znormalizuje rozsah 0-iMax na rozsah 0-61 a převede pomocí EncodeDataSimple().
function GraphAxisStep(eRange:extended):integer;
  • Funkce spočítá krok osy grafu pro jeho automatické nastavení.
function FormatFloatDot(const sFormat:string; eValue:extended):string;
  • Funkce naformátuje číslo s desetinnou tečkou (nezávisle na systémové definici oddělovače). Vhodné pro parametry Google Image Chart, kde je nutný desetinný oddělovač tečka.

Funkce pro obsluhu globálních proměnných a vstupních parametrů

V tomto případě jsou myšleny proměnné, které nejsou součástí modulů, ale jsou ve společně dostupném prostoru. Tyto proměnné mohou být využity k automatické náhradě hodnot do výstupního HTML textu.

function StringCompress(str:string):string;
  • Upraví text tak, aby odpovídal jménu proměnné v globálních proměnných (převede na malá písmena, první znaky slov velká písmena, vypustí mezery a některé nevhodné znaky)
function GlobalVarGet(name:string):string;
  • Vrací hodnotu globální proměnné z oblasti pro výměnu proměnných mezi moduly.
function GlobalVarSet(name, value:string):boolean; 
  • Nastaví hodnotu globální proměnné v oblasti pro výměnu proměnných mezi moduly. Pokud proměnná neexistuje, vytvoří ji.
  • Prozatím funkce vrací vždy false.
procedure GlobalVarRemove(name:string); 
  • Odstraní globální proměnnou z oblasti pro výměnu proměnných mezi moduly.
procedure GlobalVarRemoveMask(mask:string); 
  • Odstraní z oblasti pro výměnu proměnných mezi moduly všechny proměnné odpovídající zadané masce. Maska je zadaná jako text pro regulární výraz. Funkce umožňuje odstranit z proměnných celou skupinu proměnných najednou, např. při náhradě hodnot TAGu použitých pro vykreslení jiné mapy.
procedure GlobalVarFromFile(INIfile,section,prefix:string); 
  • Ze souboru načte všechny proměnné dané sekce a uloží je mezi proměnné. Jméno každé proměnné bude tvořeno zadaným prefixem a vlastním jménem získaným z INI souboru.
procedure GlobalVarFromTag(category,prefix:string); 
  • všechny hodnoty tagu zadané kategorie uloží mezi proměnné. Jméno proměnné bude tvořit prefix doplněný o pořadí načtené hodnoty.
function GlobalVarReplace(str:string):string; 
  • ve vstupním textu nahradí všechny definované globální proměnné
procedure GlobalVarRegisterReplaceFunction(name:string,funkce:TModuleReplaceFunction); 
  • registrace funkce, kterou modul může nahrazovat některé globální proměnné, např. hodnotami z polí nebo složitějších struktur. Vlastní nahrazovací funkce má deklaraci function Name(aParams:TStringList):string; a jméno funkce podléhá stejným konvencím jako ostatní jména. Při volání pak jádro napřed nahradí všechny normální proměnné (aby v parametrech mohly být i nahrazené hodnoty) a pak postupně volá všechny registrované funkce v pořadí, v kterém došlo k jejich registraci.

Funkce generující výstup

procedure Log(message: string);
  • Zapíše text do protokolu (soubor Stator.log v adresáři profilu). Textu je automaticky předřazen aktuální čas. Chybové zprávy by pro přehlednost měly začínat textem ERR:
function MakeHtmlCacheInfo(sId,sType,sName,sCountry:string):string;
  • Funkce vrací informace o keši naformátované do jednotného HTML vzhledu.
function MakeHtmlCacheInfoFromID(sId:string):string;
  • Funkce vrací informace o keši naformátované do jednotného HTML vzhledu. Potřebné údaje si zjistí sama podle GC kódu keše.
function MakeHtmlShortCacheInfoFromId(sId:string):string;
  • Funkce vrací informace o keši naformátované do jednotného HTML vzhledu. Oproti funkci MakeHtmlCacheInfoFromID chybí vlajka státu. Potřebné údaje si zjistí sama podle GC kódu keše.
procedure Output(text: string);
  • Zapíše do výstupního souboru statistik zadaný text. Jádro za normálních okolností přebírá výstup hlavní funkce modulu a pomocí tohoto příkazu zajistí jeho začlenění do statistik. Modul však může příkaz zavolat i přímo. Pak ovšem by neměl stejný text vracet jako svou návratovou hodnotu, protože by se ve statistikách vyskytl opakovaně.
procedure OutputSwitchButtons(sMainId,sSwitchType:string; iListboxRow integer; bCheckboxUnique:boolean; aData:TStringList);
  • Funkce vytváří tlačítka pro střídavé zobrazení různých bloků statistiky.
  • sMainId je Id prvku, pro který se výstup generuje, většinou ID modulu
  • sSwitchType je typ přepínacího prvku, jeden z Button, Radiobutton, Checkbox, Listbox, Combobox
  • aListRow je maximální počet řádků, který může listbox zobrazit najednou
  • bCheckboxUnique je true, pokud vždy může být aktivní jen jeden zaškrtávací checkbox ze skupiny
  • aData obsahu pro každý přepínací prvek
    • text zobrazený na/u ovládacího prvku
    • ID prvku, který má prvek zobrazit
function OutputTableList(sCols:string; aData:TStringList; iRowFirst,nRowCount,idxCount:integer):string;
  • Funkce vrací string s vygenerovanou tabulkou typu seznam. Vstupem jsou hodnoty:
sCols Seznam sloupců oddělených znakem svislítko ve stejném tvaru, jako je v konfiguraci sloupců (sloupec[=zarovnání]). Seznam sloupců slouží pro vytvoření záhlaví tabulky a k úpravě implicitního zarovnání. Text pro záhlaví se bere ze souboru ColumnsName.ini a pokud v něm jméno sloupce není nalezeno, použije se přímo zadaný text.
aData Seznam hodnot. Pro sloupce Percent a Histogram nezáleží na hodnotě, je automaticky počítaná pomocí indexu idxCount. Pokud je první hodnota !NoHeader!, bude tabulka bez záhlaví s popisem sloupců (a první hodnota v poli se pak v tomto datovém poli pro vytvoření tabulky ignoruje)
iRowFirst Definuje index prvního zobrazeného datového řádku.
nRowCount Definuje počet vypisovaných datových řádků.
idxCount Definuje index hodnoty v řádku, která obsahuje počet, tedy hodnotu, která je použitá pro výpočet sloupců obsahujících procenta nebo histogram.
function OutputChartBarUtf(aValues:TStringList; iHeight:integer; var iGraphWd:integer; iRange:integer):string;
  • Funkce vrací string s vygenerovaným sloupcovým grafem (tag <img…> s odkazem na Google Image Chart API). Výstup je vždy v kódování UTF-8. Parametry funkce:
aValues Seznam hodnot pro graf v pořadí: hodnota, popis osy, popis sloupečku.
iHeight Výška grafu v px. Šířka je dána aktuální šířkou pro výstup modulu.
iGraphWd Funkce interně přepočítává přesnou šířku grafu podle počtu sloupečků. Výslednou hodnotu vrací v této proměnné.
iRange Měřítko svislé osy. Pokud není zadáno (je zadáno nulové), použije se jako rozsah maximální hodnota dat.
function OutputChartPieUtf(aValues:TStringList; iHeight:integer):string;
  • Funkce vrací string s vygenerovaným koláčovým grafem (tag <img…> s odkazem na Google Image Chart API). Výstup je vždy v kódování UTF-8. Parametry funkce:
aValues Seznam hodnot pro graf.
iHeight Výška grafu v px. Šířka je dána aktuální šířkou pro výstup modulu.

Další funkce

function TableListMakeSqlFromParams(aPar:TStringList; bIncludeIgnoring:boolean; sIncludeCacheTypes:string; var idxCount:integer):string;
  • Funkce vrací string s SQL dotazem podle zadaných parametrů:
ParametrPopis
aPar definice sloupců tabulky (v každém řádku jeden sloupec se všemi informacemi o něm - řazení, zarovnání, výběr hodnot, …)
bIncludeIgnoring Příznak zpracování keší definovaných v konfiguraci jako ignorované
sIncludeCacheTypes Seznam typů keší, které budou při zpracování ignorované. Jedná se o plná jména typů, oddělovačem v seznamu je svislítko |
idxCount pořadí sloupce s počtem hodnot. Tyto hodnoty jsou použity pro případný výpočet procent, …

Vytváření Framu v modulu

Za normálních okolností jsou strukturální elementy (Frame/Column) generovány na základě definice ve stromečku použitých modulů. Některé moduly však mohou generovat složitější výstup, který je účelné nějak dál členit. V takových případech může být vhodné, např. pro zachování jednotného vzhledu a ovládání se zbytkem statistiky, aby modul strukturální prvky vytvářel sám. Ukázkový příklad, jak prvek vytvořit je:

var sIdElementOld:string;
    aParTmp:TStringList;
    //...
begin
  Result:='';          //funkce vraci vygenerovany vystup, zaciname s cistym stitem
  //...
  //kazdy Frame musi mit jedinecny identifikator, odvodime jej od identifikatoru
  //prave zpracovavaneho modulu pridanim 'part1'
  sIdElementOld:=GlobalVarGet('IdElement');
  GlobalVarSet('IdElement',sIdElementOld+'part1');
 
  //upravime aktualni sirku pro pouziti Framu
  SaveWidth('Frame');
 
  //vygenerujeme Frame
  aParTmp:=TStringList.Create();
  aParTmp.Values['Title']:='Nadpis';
  aParTmp.Values['Open']:='Yes';  //priznak rozbaleneho Framu
  //pokud nepotrebujeme zobrazit napovedu nebo nastavit ikonku Framu
  //zapoznamkovat prislusny prikaz
  aPar.Values['Help']:='text tooltipu';
  aPar.Values['Icon']:='URL s ikonkou zobrazenou pred nadpisem';
 
  Result:=Result+ProcessFrameStart(GlobalVarGet('IdElement'),aParTmp);
 
  //... (doplnitt skutecny vystup modulu)
  Result:=Result+VytvorVystup();
 
  //ukoncime Frame
  Result:=Result+ProcesFrameEnd();
 
  //vypiseme vystup do vysledne statistiky. To se musi udelat jeste
  //pred navratem vsech hodnot zmenenych globalnich promennych na puvodni.
  Output(Result);
  Result:='';     //vystup uz je prepsan do souboru
 
  //vratime hodnoty globalnich promennych a uvolnime alokovanou pamet
  RestoreWidth('Frame');
  GlobalVarSet('IdElement',sIdElementOld);
  aParTmp.Free();
user/skript/stator/develop/stator-vyvojmodulu.txt · Last modified: 2021/01/17 11:43 by mikrom