Rozšiřujeme XHTML o MathML

2007-03-06 15:35 napsal Lukáš Havrlant

Protože XHTML je aplikací XML, můžeme díky jmenným prostorům připojit do našeho XHTML dokumentu další jazyky založené na XML. Ovšem není to tak jednoduché, jak by se mohlo zdát.

Takže problém první: abyste mohli XHTML rozšířit o nějaký ten jazyk, bude nutné stránku poslat jako skutečné XHTML, tedy nejlépe jako application/xhtml+xml, ale jsou pochopitelně možné i další varianty. Pokud pošlete stránku jako obyčejné HTML, tedy text/html, parser to nezpracuje jako X(HT)ML, ale prostě jako HTML a tam pochopitelně jmenné prostory nepozná a bude je ignorovat, respektive vykreslí obsah jednotlivých elementů nezávisle na tom, co v tom jmenném prostoru znamenají.

Ok, pojďme si tedy ukázat nějaký příklad. Vzhledem k tomu, že vedu web o matice, uvažoval jsem dlouho o nasazení MathML. Web v XHTML mám, takže teoreticky žádný problém. MathML do kódu zapojíme jednoduše tak, že na požadované místo vložíme element <math> se jmenným prostorem http://www.w3.org/1998/Math/MathML. Do obsahu tohoto elementu pak už jen prostě vložíte požadovaný MathML kód a prohlížeč ho interpretuje jako matematický zápis. Celý zápis může vypadat takto:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" lang="cs">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Pracujeme s MathML</title>
  </head>
  <body>
    <h1>Jak to MathML krásně funguje!</h1>

    <math xmlns="http://www.w3.org/1998/Math/MathML">
      <mfrac>
        <mn>2<mo>-</mo><mi>x</mi></mn> <mn>3</mn>
      </mfrac>
      <mo>+</mo>
      <msubsup>
        <mn>X</mn>
        <mrow>
          <mn>i</mn>
        </mrow>
        <mrow>
           <mn>2</mn>
        </mrow>
      </msubsup>
    </math>

    <p>Dobrý, ne?</p>
  </body>
</html>

(živá ukázka, prohlížejte nejlépe ve Firefoxu, Opera MathML nezná)

Funguje to sice hezky, ale má to drobný háček, která nám už předvedla Opera. Pokud totiž prohlížeč zná XHTML, ale nezná MathML, vykreslí prostě obsah elementů za sebou, bez dalšího fyzického formátování (jako by byly například ve spanu). Což – přiznejme si – není to, co bychom od toho zrovna očekávali, do přístupného webu to má daleko. Pokud prohlížeč nezná požadovaný jazyk, neexistuje spolehlivá možnost, jak mu říct, aby nic nevykreslil, případně aby vykreslil alternativní obsah jako v případě obrázku. Takže jak z toho ven?

Můžeme docela snadno využít klasický element <object>, matematický vzorec uložit do externího XML souboru a ten potom skrze tento element nalinkovat. Tedy kód by mohl vypadat nějak takto:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" lang="cs">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Pracujeme s MathML</title>
  </head>
  <body>
    <h1>Jak to MathML krásně funguje!</h1>

<object data="mathml1.xml" type="application/xml" style="height:2em;">
Váš prohlížeč nepodporuje MathML.
</object>

    <p>Dobrý, ne?</p>
  </body>
</html>

Výsledek bude prakticky identický. Bohužel až příliš identický. MathML totiž nemá přiřazený konkrétní MIME typ a vkládání přes object není tedy moc dobře podporované. Opera zkrátka nepozná, že se pokoušíte vložit něco, co nedokáže vykreslit a namísto zobrazení alternativy, opět zobrazí původní MathML.

Ideální by bylo, kdyby existoval přímo v XML nějaký mechanismus, nejlépe asi nějaký element, jehož obsah by se prostě interpretoval v případě, že by prohlížeč neznal požadovaný jmenný prostor. Vzhledem k tomu, že nic takového neexistuje a řešení přes <object> je nefunkční (jestli jsem něco přehlédl, napište prosím), o nějakém MathML si můžete nechat jen zdát a všechny zlomky se zase budou psát přes tabulky.

A ještě bych se zmínil o výhodách a nevýhodách řešení přes jmenné prostory a přes <object>. Nevýhody už ale sepsal Chamurappi, tak já se pokusím sepsat výhody (Chamurappi si vybral SVG, já si vyberu mé oblíbené MathML):

  • Když jsem psal matematiku, potřeboval jsem občas vložit do stránky nějaký speciální matematický znak, který ale ve jmenném prostoru XHTML není. Zde se vyplatí vložit tento znak pomocí jmenných prostorů, vkládat <object> doprostřed odstavce není zrovna ideální.
  • Pokud už jednou MathML používám, patrně to nebude jednou na stránce a kdybych měl mít na stránce dvacet objectů, nebylo by to příliš efektivní z hlediska http požadavků.
  • Když mám na stránce dvacet matematických zápisů aplikovaných pomocí <object>, bude správa takového webu docela šílená, kdo má ty externí XML soubory pořád hledat. Když to mám přímo v kódu, vidím to hned a případně mohu kód i upravit.

To jsou výhody, na které jsem natrefil, když jsem se MathML pokoušel zavést. Bohužel, díky okolnostem je to prakticky nemožné. Takže bych si přál, aby mi Ježíšek tenhle rok přinesl nějakou lepší podporu zjišťování, zda ten a ten prohlížeč zvládá MathML či nezvládá (respektive obecně zda ten a ten prohlížeč zvládá tu a tu technologii). Možná pak to snažení W3C vážně k něčemu bude.

Linkuj.cz!

Komentáře

6. March 2007, 16:17

Možná to k ničemu nebude.

Matematiku jsem studoval, ale nepochopil. Češtinu jsem také studoval a také nepochopil. Oženil jsem se, ale manželku jsem také nepochopil. Vypadá to, že hoši z W3C jsou na tom podobně.

Navíc – co by asi tak měli říkat chemici, na které se vlastně na webu úplně zapomnělo. Zkuste do HTML (nebo XHTML, to je fuk), propašovat chemický vzorec :)

6. March 2007, 16:42

1. Plaváček: H2SO4 :o)). Ale nějaký organický nesmysl bych asi zapisoval těžko.

# Jonge
6. March 2007, 16:48

Myslím že zatím nemá tohle cenu řešit vzhledem k tomu že to z majoritních prohlížečů podporuje jen Firefox. Navíc v IE se nezobrazí ani XML…

1. Plaváček:
Dobrá hláška :o)

6. March 2007, 16:50

3. Jonge: Ale jo, má, mně by stačil i FF. Pro FF bych si napsal MathML a ostatním prohlížečům bych poslal alternativu – obrázek nebo tabulku (v případě zlomků to ještě jde). Ale ono to prostě není tak jednoduché.

6. March 2007, 18:07

Nemám k tomu příliš co dodat. Snad jen jednu češtinářskou, pokud odpustíš: „nejideálnější“ je superlativ superlativu. Jinými slovy, už „ideální“ samo o sobě je třetím stupněm, nelze jej tedy dál stupňovat.

6. March 2007, 18:17

2. Lukáš Havrlant: Pokud by jsi chtěl zobrazit kovalentní vazby tak asi opravdu jen těžko. Podpora MathML by měla být zjistitelná druhou verzí Document.crea­teElementNS(na­mespaceURI, qualifiedName), pokud namespace neexistuje vyhodí error NAMESPACE_ERR viz. http://www.w3­.org/…re/core­.html#…

6. March 2007, 18:18

[5] tak schválne.. ideální, ideálnější, nejideálnější :-) huh, fakt to jde :-) – čeština budiž pružná..

možná bych dal i další stupeň – bohovskysuperul­tranejideálnjší nebo něco podobného.. :-)

6. March 2007, 18:27

1. Plaváček: Pro chemiky je tu CML. Ale na webu je to nepoužitelné ze stejného důvodu jako MathML.

3. Jonge: IE zobrazí XML, akorát nezobrazí application/xhtml+xml a taky nezná jmenný prostor MathML.

Ono by to mělo smysl řešit, kdyby existovaly možnosti odlišení nepodporujících prohlížečů. Dříve u nových webstandardů naprosto běžná věc – noframes, noscript, applet, embed… Ale ty čistě W3C standardy nějak postrádávají onu domyšlenost (mimochodem, WHATWG na tom není o moc lépe – podporu WebForms taky nelze detekovat).

6. March 2007, 18:30

8. llook: Já myslím, že není moc třeba ho detekovat, přidáš pár atributů a buď to prohlížeč pochopí nebo nepochopí, ale nic se zároveň nestane. Což se v případě MathML říct nedá, prohlížeč prostě vyplivne suchý text, který vadí.

5. Dero: Jaj, školácká chyba. Díky :-).

# Zdeněk Košťál
6. March 2007, 18:37

llook: Také jsem na to chtěl upozornit, je to ale myslím škoda že ani CML, ani MathML nejsou použitelné, to bysme zase byli někde jinde. Jinak docela mě trkla nepoužitelnost v Opeře, protože jsem ji doteď pokládal za božský prohlížeč.

Řešit to obrázky myslím není také nejšťastnější, ale jiné řešení opravdu nevidím. Nebo udělat prasárnu a psát to slovy :-)).

W3C tohle nějak nedořešilo…

6. March 2007, 18:41

Mě se líbí, jak to má zpracované Wikipedia. Každý uživatel si může nastavit, jakým způsobem chce matematické vzorce zobrazovat. Ale chápu, že to není takové řešení, jaké bychom všichni chtěli.

6. March 2007, 18:42

10. Zdeněk Košťál:

Řešit to obrázky myslím není také nejšťastnější, ale jiné řešení opravdu nevidím. Nebo udělat prasárnu a psát to slovy :-)).

Zlomky se ještě dají nasimulovat buď přes závorky a lomítka (x+3)/2 nebo pomocí tabulky. Osobně to dělám tak, že jednodušší zlomky zapisuju přes lomítko, složitější přes tabulku. Horší to je, když chceš třeba vrazit zlomek pod odmocninu, to už se nedá prakticky řešit jinak než obrázkem.

Proč všichni nepoužívají Amayu? :-)

6. March 2007, 19:21

Proč nemají prohlížeče interpret na TeX? ;-))

6. March 2007, 19:25

8. llook: Ale naštěstí tu mám pluginy, které nám pomohou k zobrazení svělých flashů, PDF, SVG a dokonce i MathML i v IE. takže bych nezoufal a na stráku hodil tejnoiu hlášku jako háže flash nebo vystavovatelé PDF: Stáhněte si plugin ;)

6. March 2007, 21:29

13. Littlemaple: A co takhle zavést TeXHTML??? ;-)

# ger
6. March 2007, 22:09

laicka otazka, psal jste, ze se takova stranka musi posilat se spravnym content typem, jaktoze tedy vas priklad zobrazuje mathml dobre kdyz tam mate text/html?

diky

6. March 2007, 22:48

16. ger: Kde mám text/html? U obou příkladů je application/xhtml+xml.

7. March 2007, 07:16

ad 1. Mno vidíte, webdesign jste nestudoval a přesto pochopil :)

ad 7. Přesně tak, dneska už se používá kde co a většina lidí to ani nepozná, že je to nespisovné.

# Tom
11. March 2007, 14:20

17. Lukáš Havrlant: Asi mysli tohle:

< meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
11. March 2007, 14:24

19. Tom: jo aha, toho jsem si nevšiml, ten meta tag jsem odnekud zkopíroval.

Takže ještě jednou pro gera – stránka se skutečně posílá (nehledě na meta tag) jako application. Lze to vidět například z přípony .xhtml nebo si v Opeře najeď na tab se stránkou a bude tam poslední položka „MIME typ: application/xhtml+xml­“. Ve Firefoxu je na to taky nějaké rozšíření. Nebo si to „zobraz“ v MSIE, nepůjde to.

21. May 2007, 18:29

Mám pocit že syntaxe MathML je dost hloupá. XML puritánství je cesta do pekla --- představte si třeba náhradu JavaScriptů nějakým XML kódem. Na programování a zápis matematiky prostě XML není stavěné. Řešení bych viděl v konstrukcích typu , přičemžv komentáři by byla LaTeXová sekvence. Ale pryč od mých zbožžných přání. Rozumný způsob jak sázet matematiku je pomocí nějakého cgi/php skriptu na převod LaTeXu do gifu.
Pokud nemáte vlastní stroj, zkuste

http://www.matf.bg.ac.yu/~matic/cgi-bin/mimetex.cgi?\frac{x^2}{\sqrt{2}}
21. May 2007, 18:35

21. Kondr: S obrázky nerad pracuji. Pokud to jen jde, snažím se vystačit s pouhým HTML+CSS. Zlomky se dají zapsat do tabulky a dost matematických značek se vyskytuje ve formě entit. Na většinu zápisů to stačí.

XML zápis mi problém nedělá, já ho stejně nepíšu – nechám to vygenerovat nějakým programem a pak už to buď vložím do stránky podobně jako obrázek nebo zkopíruju kód (teoreticky, v praxi to – viz článek – nefunguje).

21. May 2007, 22:39

22. Lukáš Havrlant: Netrdím že obrázky jsou ideální řešení na věky věků. Ale do doby, než bude existovat rozumný standard na webovou matematiku (ideálně založený na TeXu obdobně jako to má wiki, ale parsovaný u klienta) mi příjdou obrázky jako schůdnější, sémanticky vhodnější a typograficky hezčí řešení než např. zlomky pomocí tabulek.
Můj názor není relevantní, proto použiji důkaz autoritou: velké weby, které o matematice píší (např. mathworld, aops/mathlinks, wikipedia) používají na vyznačování matematiky obrázky (wiki dělá výjimku u triviálních vzorců).

Co se týče XML kódu: občas to člověk prohlíží v režimu, který matematiku nějak esteticky parsovat nemůže (třeba v textových náhledch vyhledávačů nebo LYNXu) a tam se TeXové alty obrázků vyjímají daleko líp než MathML s vynechanými tagy případně čistý MathML kód.

21. May 2007, 22:52

23. Kondr:

Můj názor není relevantní, proto použiji důkaz autoritou: velké weby, které o matematice píší (např. mathworld, aops/mathlinks, wikipedia) používají na vyznačování matematiky obrázky (wiki dělá výjimku u triviálních vzorců).

Velké české weby jako třeba Matematika polopatě používají na zlomky tabulky a obrázkům se vyhýbají jako čert kříži ;-). Ale budu asi jediný web, to je pravda, e-matematika používá obrázky, stejně jako Cifrikova matematika.

Obrázek má nicméně dost nevýhod – déle trvá příprava a výroba a následné zasazení do designu, pokud chci něco upravit, musím vygenerovat znova celý obrázek. Navíc obrázek se nezvětšuje v závislosti na velikosti písma prohlížeče. Zkrátka psaní a udržování matematických vzorců přímo v HTML+CSS je (minimálně pro mě) jednodušší a pro uživatele možná také. Párkrát se mi stalo, že jsem třeba chtěl vyselektovat čitatel zlomku, ale u obrázku to jde těžko. U HTML+CSS to není problém.

Komentáře jsou uzavřeny