Windows Live Writer je velmi pěkná aplikace. Používám ji třeba pro psaní článků sem na VbNet, ale i na správu obsahu jiných webů, do kterých jsem MetaWeblog API, tedy protokol, jímž Writer s webem komunikuje, implementoval.
Jak jste si možná všimli, do článku Naučte se programátorsky myslet - Algoritmy pro třídění 2 jsem se pokusil vytvořit Silverlightovou animaci. Windows Live Writer podporuje přepnutí se a editaci HTML výsledného článku, takže jsem kód pro zobrazení animace vepsal ručně. Protože tento způsob mi nepřišel právě elegantní, rozhodl jsem se napsat plugin pro vkládání Silverlightových aplikací do článků. To jsem si ještě naivně myslel, že za hodinku mám hotovo.
Plugin jsem po celodenních útrapách napsal, ale asi 5 hodin jsem řešil jednu věc. Když k článku přiložíte soubor (třeba obrázek, ale i cokoliv jiného), zkopíruje si ho Windows Live Writer do dočasného adresáře a do HTML kódu umístí odkaz na toto dočasné umístění. Při publikování článku pak uploaduje soubory na web, zjistí si adresy, na kterých nacházeti se budou, pak HTML projde, adresy nahradí a odešle samotný článek.
Co čert nechtěl, napsal jsem plugin, který uploaduje dva soubory, např. Page.xaml s definicí vzhledu aplikace a Page.xaml.js s kódem na pozadí. Druhý soubor se vkládá do stránky jako normální vložený javascript, tedy takto:
<script type="text/javascript" src="Page.xaml.js"></script>
Adresa v tomto kousku se nahradila naprosto správně, tak, jak by člověk čekal. Na první soubor se ovšem odkazuje pouze ve volání javascriptové funkce a Windows Live Writer tuto adresu nenahradí!
createSilverlightFromPlugin(parametr, parametr, "Page.xaml", parametr);
Zůstane tam původní adresa z klienta. Abych pravdu řekl, vůbec mě tohle nenapadlo, Při generování tohoto HTML kódu volám a na příslušné místo dosazuji content.Files.GetUri(soubor), takže bych očekával, že si WLW při nahrazování adres tuto funkci zavolá a GetUri bude prostě vracet finální cesty tak, jak jsou na webu. Navíc když třída SmartContentSource, kterou plugin dědí, má metody GenerateEditorHtml a GeneratePublishingHtml.
Fakt bych nečekal, že Live Writer bude procházet HTML kód článku nezávisle na tom, co chtějí generovat pluginy, a nahradí cesty jenom ve značkách a, link a img. Takovéhle detaily v dokumentaci nejsou, přišel jsem na to až z Reflectoru. Už jsem totiž podezříval, že Live Writer má problémy uploadovat více než 2 soubory jedním pluginem. Pak jsem ale zjistil tohle.
Řešení je mimořádně hnusné, ale lepší mě bohužel nenapadlo. Před místo, kde se má zobrazit Silverlightová aplikace vygeneruji skrytý a href, do kterého plácnu adresu. Tu mi Writer nahradí, a já si ji pak javascriptem vytáhnu. Je to škaredé, ale funguje to.
Ještě musím nějak vyřešit situaci, když někdo do aplikace přidá externí soubory. Je nutné celý XAML soubor projít a najít v něm všechny reference, ty pak nějak uploadovat a opět cesty v XAML souboru nahradit (a to by mě zajímalo jak, když to nemám šanci programově ve WLW zjistit). Jednoduché aplikace fungují v pořádku, ale složitější, s těmi je prostě problém. Co nejdříve se pokusím svůj plugin dodělat a dát ho k dispozici.