Jednorázové hromadné nahrazení volání metod ve zdrojácích rubrika: Programování: PHP
Ahoj,
řeším následující problém. Provozujeme celkem rozsáhlý projekt, který je lokalizovaný do X jazyků. Bohužel jsme používali nevhodné řešení, jak v PHP posílat na výstup lokalizované řetězce. Nyní migrujeme na gettext, což ale znamená nahradit všude ve zdrojácích hromadně volání jedné metody a zaměnit za jinou. To by nebyl problém, ale potřebuji to nahradit chytřejším způsobem. Potřebuji pracovat i s parametry té volané metody. Tzn. místo jednoho parametru použít jeho ekvivalent v jiné podobě (místo ID jazykového řetězce použít přímo daný řetězec).
Moje otázka zní - znáte někdo nějaký nástroj, který by toto dokázal, tak nějak bezpečně, aby se nerozbil k´od?
Díky za odpovědi.
EDIT: Nyní funguje výstup textu např. takto: echo class::get('skupina', 123) -> 123 je ID textu (v databázi, a načítá se z vygenerovaného souboru). Nahradit to chceme například za class::translate('skupina', 'Přímo zdrojový text').
Můžeš použít http://php.net/manual/en/book.tokenizer.php a jednoduchým automatem nahradit vše potřebné. Výhodou je, že se ti nerozhodí formátování.
Zkus doplnit vzorový kód vstupu a vzor požadovaného výstupu. K tomu nějaké mapování na stávající zdroj textů. Zkusím navrhnout ten automat.
Komentáře
- rmaslo : Taky bych na šel přes tokenizer. Každodenně ho používám ho pro prohledávání zdrojáků bez komentářů a jednou i na něco podobnýho co popisuje žadatel a naprosto ok. Akorát nějaká hodně stará verze PHP vynachávala enter za heredoc. — 16.3.2015
- Kit : @rmaslo: Díky za info o Heredoc, ověřím si u své verze, zda to opravili. Zatím jsem totiž na žádný problém nenarazil. — 16.3.2015
- Anonym : Dík za tip. Tokenizer používám pro parsování textů ze zdrojáků a funguje skvěle. Napadlo mě ho použít, ale k tomu musím vymyslet, jak chytře nahradit konkrétní řádek ve zdrojáku, abych si tím nic nerozbil. — 16.3.2015
- Kit : Stavovým automatem. Pokud verzuješ, tak přece rozbití nehrozí. — 16.3.2015
- Anonym : Asi jsem trochu mimo, co myslíš tím stavovým automatem? :-) Máš nějaký konkrétní příklad? — 16.3.2015
- Kit : Jsem ve stavu 0. Ve chvíli, kdy přijde očekávaný element (identifikátor hledané funkce), přepnu se do stavu 1. Přijde levá závorka, přepnu se do stavu 2. Přijde další identifikátor a protože jsem ve stavu 2, tak vím, že je to první parametr ke zpracování. Přepnu do stavu 3, přijde čárka. Přepnu do 4 a očekávám druhý parametr. Nyní nahradím funkci novou funkcí a dva parametry hodnotou z databáze. Přepnu se do stavu 0. Když jsem ve stavu 0, jenom opisuji vstup na výstup. To je vše. — 16.3.2015
- Anonym : @Kit: Aha, díky :) přesně takhle nám funguje parser textů. Nenapadlo mě ale opisovat vstup na výstup a tím provést rovnou nahrazení. Dík za rady, s největší pravděpodobností použiji toto řešení přes tokenizer, jelikož nic lepšího asi nenajdu. — 17.3.2015
Pro zobrazení všech 8 odpovědí se prosím přihlaste:
Nebo se přihlaste jménem a heslem:
Komentáře