Z Wikipedie na Microsoft Surface

Někteří z vás se na konferenci LinuxExpo nebo na veletrhu Svět knihy zastavili na stánku Wikimedia Česká republika, kde jste měli možnost si vyzkoušet brouzdání na Wikipedii pomocí Microsoft Surface. V článku se podíváme, jak tato aplikace za použití MediaWiki API a WPF vznikla.

MediaWiki API

Pokud potřebujete automaticky zpracovávat informace z projektů z rodiny Wikimedia, máte k dispozici velmi rozsáhlé API, které je pro všechny projekty v podstatě stejné. My budeme používat API pro dotazy na Wikipedii a Wikimedia Commons. Popis API je vždy v angličtině, nezávisle na tom, jaký uvedete jazyk Wikipedie, který se řídí doménou třetí úrovně, nebo jaký použijete typ projektu. Kompletní seznam jazyků je dostupný na List of Wikipedias. Adresa pro API české Wikipedie je tedy http://cs.wiki­pedia.org/w/a­pi.php a pro Wikimedia Commons je http://common­s.wikimedia.or­g/w/api.php.

Z těchto adres budou vycházet všechny ukázky dotazů. Tím, že budeme informace jen číst, není třeba se k API nijak přihlašovat nebo se registrovat. Přihlašovat byste se museli v případě zápisu informací nebo při stahování velkého množství informací najednou. Aplikace pro Microsoft Surface využívá jen malou část MediaWiki API, a to hledání článků a obrázků, načtení jejich obsahu, zpracování obrázků a vyřešení přesměrování. Jako výstupní formát je nastaveno XML, které se zpracovává pomocí LINQ to XML.

Hledání na Wikipedii nebo Wikimedia Commons

http://{2}.wikipedia.org/w/api.php?action=opensearch&search={0}&format=xml&limit={1}

http://commons.wikimedia.org/w/api.php?action=opensearch&search={0}&format=xml&limit={1}

{0} – hledané heslo
{1} – maximální počet nalezených hesel
{2} – jazyk Wikipedie 

Výsledek hledání odpovídá formátu OpenSearch, což je formát používaný pro vyhledávací pole prohlížečů, které je typicky vpravo od řádku s URL. Výsledek hledání slova Praha vypadá následovně http://cs.wiki­pedia.org/w/a­pi.php?action=o­pensearch&sear­ch=Praha&format=xml&li­mit=50. Tímto způsobem jsme se dostali k seznamu existujících hesel, případně obrázků. Další postup je odlišný pro Wikipedii a Wikimedia Commons.

Získání článku z Wikipedie

http://{0}.wikipedia.org/w/api.php?action=query&prop=revisions&titles={1}&rvprop=content&format=xml&redirects

{0} – jazyk Wikipedie
{1} – titulek článku na Wikipedii 

Pomocí předchozího URL získáte aktuální verzi článku na Wikipedii na základě jeho názvu (pozor na velikost písmen). Poslední parametr redirects automaticky vyřeší přesměrování článku. Jako příklad může být heslo Lynx lynx, které ve skutečnosti odkazuje na článek Rys ostrovid. Obsah článku, například Lynx lynx (http://cs.wi­kipedia.org/w/a­pi.php?action=qu­ery&prop=revi­sions&titles=Lyn­x%20lynx&rvprop=con­tent&format=xml&re­directs), je ve formátu wikitext, který přispěvatelé Wikipedie jistě dobře znají.

Získání obrázků z Wikimedia Commons

http://commons.wikimedia.org/w/api.php?action=query&prop=images&titles={0}&format=xml

{0} – název článku, jehož obrázky chceme získat 

Pomocí tohoto URL v podstatě získáte seznam obrázků, které obsahuje článek s příslušným titulkem. Pokud se podíváte na seznam obrázků pro heslo Lynx lynx na Wikimedia Commons, tak uvidíte, že jste získali jen seznam souborů s obrázky. Skutečné URL obrázku musíte získat dalším dotazem:

http://commons.wikimedia.org/w/api.php?action=query&prop=imageinfo&iiprop=url&titles={0}&format=xml

{0} – název souboru 
Wikimedia Surface Browser

Zobrazení wikitextu ve WPF aplikaci

Další krok je konverze wikitextu do FlowDocument. Pěkný úvod do této technologie najdete v článku Flexible Content Display With Flow Documents. Zjednodušeně řečeno, objekt FlowDocument je obdoba HTML pro Windows Presentation Foundation. Vypadá následovně:

<?xml version="1.0" encoding="utf-8"?>
<FlowDocument
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Paragraph>Hello World!</Paragraph>
</FlowDocument> 

Stejný dokument můžeme vytvořit i za použití objektů místo XAML:

FlowDocument doc = new FlowDocument();
Paragraph p = new Paragraph();
p.Inlines.Add("Hello World!");
doc.Blocks.Add(p); 

Pro zobrazení obsahu objektu FlowDocument můžete využít několik kontejnerů od jednoduchého zobrazení „nekonečné“ stránky (FlowDocumentScro­llViewer) po vícesloupcovou sazbu (FlowDocumentRe­ader).

Vlastní převod z formátu wikitextu do formátu FlowDocument je v podstatě jednoduché cvičení s textem. Například z:

== Hello World! == 

vytvoříme třeba

<Paragraph FontWeight="UltraBold" FontSize="16">Hello World!</Paragraph> 

K formátování textu lze samozřejmě využít styly.

Parser pro wikitext v aplikaci pro Microsoft Surface generuje XAML, který popisuje FlowDocument, do textové proměnné pomocí objektu StringBuilder. Když je konverze hotová, tak takto vytvořený XAML „zkompilujeme“ a tím získáme požadovaný objekt FlowDocument.

FlowDocument fd = (FlowDocument) XamlReader.Parse(flowDocumentXaml); 
Wikimedia Surface Browser

Jak na odkazy mezi články?

Asi nejzajímavější bylo řešit provázání článků odkazy. Zásadní rozdíl mezi „normální“ aplikací a aplikací pro Microsoft Surface je ovládání rukama. Běžná dotyková obrazovka je z hlediska operačního systému myš, ale více dotykové obrazovky se chovají jinak a operační systém jim musí rozumět, jako např. Windows 7. Pokud jim operační systém nerozumí, což je případ Windows Vista, tak je třeba toto „porozumění“ přidat do aplikace.

ČTĚTE K TÉMATU: Microsoft Surface: udělá na vás dojem

Aplikace pro Microsoft Surface se proto vytvářejí pomocí Microsoft Surface SDK, které rozšiřuje .NET Framework 3.5 SP1 o ovládací prvky, které „rozumí“ více dotykovému ovládání. Jedná se však jen o základní sadu ovládacích prvků a pro nás důležitý ovládací prvek Hyperlink mezi nimi chybí. Tím pádem se odkaz zobrazí, ale nepůjde ho aktivovat dotykem. Naštěstí objekt FlowDocument podporuje, jako jeden ze svých potomků, objekt UIContainer, do kterého můžete vložit libovolný objekt uživatelského rozhraní, který se pak stane součástí dokumentu. Můžete tak snadno generovat například dotazníky se zaškrtávacími políčky, přepínači, seznamy a podobně jako textový dokument. Odkazy mezi články jsem tedy implementoval jako tlačítka:

<InlineUIContainer>
  <s:SurfaceButton Tag="Rys ostrovid">Lynx lynx</s:SurfaceButton>
</InlineUIContainer> 

Informace o článku, na který tlačítko odkazuje, je ve vlastnosti Tag. Ta je univerzálně použitelná pro uchování interních informací, které potřebujeme přiřadit k libovolnému objektu uživatelského rozhraní. Všimněte si, že objekt SurfaceButton má svůj vlastní jmenný prostor, který musíte samozřejmě zaregistrovat.

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:s="http://schemas.microsoft.com/surface/2008">...</FlowDocument> 

Dále si všimněte, že nikde není odkaz na událost, která by zpracovávala stisknutí tlačítka. Registrace události probíhá na úrovni nadřazeného kontejneru, konkrétně FlowDocumentScro­llViewer, aby nebylo třeba registrovat událost zvlášť pro každé tlačítko. Případně jde událost hromadně zaregistrovat pomocí stylu, který se přiřadí všem tlačítkům.

Závěr

Jak vidíte, princip prohlížeče některých projektů z rodiny Wikimedie, v našem případě Wikipedia a Wikimedia Commons, pro Microsoft Surface je velmi jednoduchý. Zdrojové kódy si můžete stáhnout ze serveru Codeplex a zapojit se do dalšího vývoje.


Autorem článku je Štěpán Bechynský, Developer Evangelist společnosti Microsoft. Informace pro vývojáře také najdete na blogu odborníků z českého Microsoftu.

Zatím nebyl přidán žádný komentář, buďte první!

Přidat komentář
Zdroj: https://www.zdrojak.cz/?p=3025