30. huhtikuu 2010, 19:36

Hyvää vappua.

Innostuinpa kirjailemaan blogini viimeisenkin (hah) epäkohdan, nimittäin kevyen LaTeX-tuen. Nyt TextPattern hallitsee kauniin matematiikan ladonnan artikulaatin taidon.

Homman suurin ongelma on varsin epäselvä koodirunko, jonka sisään homma piti saada ujuteltua. En ole laisinkaan varma, onko se täysin toimiva, taikka turvallinenkaan. Kuitenkin homma näyttää pelaavan: \int_x^{x^2} t^2 {\rm d}t. Oikein mainio homma indeed; yllätin itsenikin taitojeni puitteissa, sillä TextPatternin ytimessä toimiva Textile-moottori on varsin kehnonlaista, joskin tyypillistä PHP-koodia. Onneksi se toimii sulavasti yksinäänkin, joten otin sen lokaaliin käsittelyyn ja interaktiivisen php-shellin avulla pääsin testailemaan eri osia.

Kirjailin suurimman osan asiaankuuluville foorumeille, mutta ydinpalat voi täälläkin esitellä, ettei turhaan pirstaloidu koodikenttä.

Funktio graf ilmeisesti käsittelee kunkin anonyymin lohkon (usein tekstikappale, ei siis koodi- tai sitaattilohko) osioita, ja itsessään funktio kutsuu vain litaniaa muita funktioita, jotka kukin hoitavat pienen osan parserointia. Ei kaikkein selkein ratkaisu, mutta näyttää toimivan, eikä muutos yhteen paikkaan taida rikkoa muita osioita kovin pahasti. Apuna on kiva funktio doSpecial, joka suorittaa käyttäjän puolesta likaista regular expression -työtä, ja sitten löydetyillä tuloksilla kutsuu käyttäjän antamaa funktiota. Näin homma onkin järkevintä tehdä. Annetaan helppo frameworkki, johon on suorastaan luontevaa työntää omaa koodia. Tämä kutsu on graf-funktion sisään tyrkättynä:

$text = $this->doSpecial($text, '$$', '$$', 'fLatex');

Ja kun se kutsuu fLatex-funktiota parametrinaan $ $-merkkien sisään jäävällä datalla, homma on selkeä. Käytännössähän meidän ei tarvitse tehdä muuta kuin kääriä annettu koodi urliyhteensopivaksi, ja kirjoittaa uusi img-tagi:

/* Parse LaTeX  strings into pictures */
function fLatex($m) 
{
    @list (, $before, $text, $after) = $m;

    $uri = "http://l.wordpress.com/latex.php";
    $background = "000000"; // colours for pictures
    $foreground = "FFFFFF"; 
    $size = "1";
    $style = "tex";

    return " <img class=\"$style\" src=\"". $uri . '?latex='
        . rawurlencode($text) . "&s=$size&fg=$foreground&bg=$background\""
        . " alt=\"$text\""
        . " />";
}

Ja periaatteessa mikä hyvänsä LaTeXia GET-parametrinaan vastaanottava kuvageneroija (vaikkapa wikipedian oma, jos ei muuta keksi) kelpaa tähän hommaan hienosti. Olen säädellyt yo. koodissa asetuksiksi tälle blogille sopivat arvot. Valkoista tummalle.

Tokihan koodi on vähän rumaa, ei testattua ja hidastakin (välimuistiratkaisun voisi hyvinkin kirjoitella vielä tähän, mutta toisaalta PHP turvamoodissaan toimiessa ei tykkää tiedostojen latailusta ja tallentelusta), mutta minusta se on toimiva ja tarpeisiin nähden varsin riittävää.

Parannusehdotuksia saa tietysti ehdotella. Luultavasti saan moitetta tai kiitosta myös tuolta tukifoorumilta, mutta katsotaan nyt.

Ja miksikö tämä vaiva? Aloitin uuden osion blogissani, jossa pyrin kuvailemaan kehittymistäni matemaatikkona ja sen opiskelijana. Toivottavasti se saa tulta alleen, vaikka se nyt jääkin miltei välittömästi tauolle.

Tageja: ,

---
---

---

Aiheen vierestä