Mercurial > hg > mpdl-group
diff software/eXist/webapp/mpdl/interface/lt/wordInfo.xql @ 7:5589d865af7a
Erstellung XQL/XSL Applikation
author | Josef Willenborg <jwillenborg@mpiwg-berlin.mpg.de> |
---|---|
date | Tue, 08 Feb 2011 15:16:46 +0100 |
parents | |
children | d6f528ad5d96 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/eXist/webapp/mpdl/interface/lt/wordInfo.xql Tue Feb 08 15:16:46 2011 +0100 @@ -0,0 +1,405 @@ +xquery version "1.0"; + +import module namespace mpdl-time = "http://www.mpiwg-berlin.mpg.de/ns/mpdl/util/time" at "../../util/time.xql"; + +declare namespace request="http://exist-db.org/xquery/request"; +declare namespace xlink="http://www.w3.org/1999/xlink"; + +(: TODO: Verlinkung von lemma, form, weiteren Einheiten in den Infos auf mpdl-proto (HTML und XML) :) + +let $type := request:get-parameter("type", "all") +let $language := request:get-parameter("language", "") +let $word := request:get-parameter("word", "") +let $placeHref := request:get-parameter("placeHref", "") +let $output := request:get-parameter("output", "xml") + +let $currentTimeBegin := util:system-time() + +let $lemmas := mpdltext:get-lemmas-by-form-name($language, $word) +let $htmlOrderedLemmas := + if (empty($lemmas)) + then ("no lemmas found for your query") + else + for $lemma in $lemmas/lemmas/lemma + let $lemmaText := concat($lemma/lemma-name, " (", $lemma/provider, ")") + let $orderedFormsStrTmp := + for $form in $lemma/forms/form + let $formStr := concat($form/form-name, " (", $form/provider, ")") + order by $form/form-name + return $formStr + let $orderedFormsStr := string-join($orderedFormsStrTmp, ", ") + let $remotePerseusLink := + if ($language = "ar" or $language = "la") + then concat("http://www.perseus.tufts.edu/hopper/morph?l=", $lemma/lemma-name, "&la=", $language) + else if ($language = "el") + then concat("http://www.perseus.tufts.edu/hopper/morph?l=", $lemma/lemma-name, "&la=greek") + else "" + let $lemmaLi := + if ($language = "ar" or $language = "el" or $language = "la") + then + <li><b>Lemma: </b>{$lemmaText} (see this entry in <a href="{$remotePerseusLink}">www.perseus.tufts.edu</a>) + <ul>{$orderedFormsStr}</ul> + </li> + else + <li><b>Lemma: </b>{$lemmaText} + <ul>{$orderedFormsStr}</ul> + </li> + order by $lemma/lemma-name + return $lemmaLi +let $xmlOrderedLemmas := + for $lemma in $lemmas/lemmas/lemma + let $orderedForms := + for $form in $lemma/forms/form + order by $form/form-name + return $form + let $retLemma := + <lemma> + {$lemma/provider} + {$lemma/language} + {$lemma/lemma-name} + <forms size="{$lemma/forms-size}">{$orderedForms}</forms> + </lemma> + order by $lemma/lemma-name + return $retLemma +let $lemmasStrTmpTmp := + if (empty($lemmas)) + then "" + else + for $lemma in $lemmas/lemmas/lemma + let $lemmaStr := $lemma/lemma-name + order by $lemma/lemma-name + return $lemmaStr +let $lemmasStrWithoutWord := string-join($lemmasStrTmpTmp, " ") +let $lemmasStrTmp := + if (not(contains($lemmasStrWithoutWord, $word))) + then concat($word, " ", $lemmasStrWithoutWord) (: also the form itself is added :) + else $lemmasStrWithoutWord +let $lemmasStr := + if ($language = "de" and (contains($lemmasStrTmp, "ae") or contains($lemmasStrTmp, "oe") or contains($lemmasStrTmp, "ue") or contains($lemmasStrTmp, "ss"))) + then replace(replace(replace(replace($lemmasStrTmp, "ae", "ä"), "oe", "ö"), "ue", "ü"), "ss", "ß") + else $lemmasStrTmp +let $lemmasStrTokenized := tokenize($lemmasStr, " ") + +let $dictionariesLocal := + if ($type = "all" or $type = "dict") + then mpdltext:get-lex-entries-by-lucene-query($language, $lemmasStr) + else () +let $dictionariesRemoteTmp := + if ($language = "de") + then + <lexica> + <lexicon> + <name>dwds</name> + <description>Deutsches Wörterbuch der deutschen Sprache</description> + </lexicon> + </lexica> + else if ($language = "el") + then + <lexica> + <lexicon> + <name>slater</name> + <description>William J. Slater, Lexicon to Pindar</description> + </lexicon> + </lexica> + else if ($language = "fr") + then + <lexica> + <lexicon> + <name>artfl-fr</name> + <description>The ARTFL project: Dictionnaires d'autrefois: French dictionaries of the 17th, 18th, 19th and 20th centuries</description> + </lexicon> + <lexicon> + <name>artfl-fr-en</name> + <description>The ARTFL project: French - English dictionary</description> + </lexicon> + </lexica> + else if ($language = "la") + then + <lexica> + <lexicon> + <name>lewis</name> + <description>Charlton T. Lewis, an Elementary Latin Dictionary</description> + </lexicon> + </lexica> + else if ($language = "nl") + then + <lexica> + <lexicon> + <name>wikiwoordenboek</name> + <description>Wiktionary: WikiWoordenboek</description> + </lexicon> + </lexica> + else if ($language = "zh") + then + <lexica> + <lexicon> + <name>linyutan</name> + <description>Lin Yutang</description> + </lexicon> + </lexica> + else () + +let $dictionariesRemote := + for $lex in $dictionariesRemoteTmp//lexicon + let $lexName := $lex/name + let $lexEntries := + for $l in $lemmasStrTokenized + let $lLink := + if ($language = "el") + then mpdltext:transcode("unicode", "betacode", $l) + else if ($language = "zh") + then mpdltext:encode-big5($l) + else $l + let $repairedEntryContentLink := + if ($lexName = "dwds") + then concat("http://beta.dwds.de/?qu=", $l) + else if ($lexName = "slater") + then concat("http://www.perseus.tufts.edu/hopper/text?doc=Perseus:text:1999.04.0072:entry=", $lLink) + else if ($lexName = "artfl-fr-en") + then concat("http://machaut.uchicago.edu/?resource=frengdict&action=search&french=", $l) + else if ($lexName = "artfl-fr") + then concat("http://artflx.uchicago.edu/cgi-bin/dicos/pubdico1look.pl?strippedhw=", $l) + else if ($lexName = "lewis") + then concat("http://www.perseus.tufts.edu/hopper/text?doc=Perseus:text:1999.04.0060:entry=", $l) + else if ($lexName = "wikiwoordenboek") + then concat("http://nl.wiktionary.org/wiki/", $l) + else if ($lexName = "linyutan") + then concat("http://humanum.arts.cuhk.edu.hk/cgi-bin/agrep-lindict?query=", $lLink, "&category=wholerecord") + else "" + let $lexiconEntry := + <entry> + <form>{$l}</form> + <content> + <xml-valid>true</xml-valid> + <original-entry><original-entry></original-entry></original-entry> + <repaired-entry><directLink xlink:type="simple" xlink:href="{$repairedEntryContentLink}">{$l}</directLink></repaired-entry> + </content> + </entry> + return $lexiconEntry + return + <lexica> + <lexicon> + <name>{$lex/name}</name> + <description>{$lex/description}</description> + <entries>{$lexEntries}</entries> + </lexicon> + </lexica> + +let $dictionaries := + <result> + <lexica> + {$dictionariesLocal//lexicon} + {$dictionariesRemote//lexicon} + </lexica> + </result> +let $retDictionaries := + if (empty($dictionaries)) + then () + else + for $dictionary in $dictionaries/lexica/lexicon + let $dictName := $dictionary/name + let $dictDescription := $dictionary/description + let $dictEntries := $dictionary/entries + let $entryDictEntryContent := + for $dictEntry in $dictionary/entries/entry + let $dictEntryContent := $dictEntry/content + let $dictEntryXmlValid := $dictEntryContent/xml-valid + let $dictEntryOriginalContent := $dictEntryContent/original-entry + let $dictEntryRepairedContent := $dictEntryContent/repaired-entry + let $dictEntryRepairedContentLink := $dictEntryRepairedContent/directLink + let $dictEntryForm := + if ($language = "el") + then mpdltext:transcode("unicode", "betacode", string($dictEntry/form)) + else if ($language = "ar") + then mpdltext:transcode("unicode", "buckwalter", string($dictEntry/form)) + else $dictEntry/form + let $dictEntryContentParsedTmp := + if ($dictEntryXmlValid = "true" and empty($dictEntryRepairedContentLink)) + then util:parse($dictEntryRepairedContent) + else if ($dictEntryXmlValid = "true" and not(empty($dictEntryRepairedContentLink)) and $output = "html") + then <div>External link: <a href="{$dictEntryRepairedContentLink/@xlink:href}">{$dictEntryRepairedContentLink}</a></div> + else if ($dictEntryXmlValid = "true" and not(empty($dictEntryRepairedContentLink)) and $output = "xml") + then <div>{$dictEntryRepairedContentLink}</div> + else <bla><text>[<i>Remark: entry in dictionary has no valid XML, so only the Betacode text version of the entry could be displayed</i>]</text><p></p>{$dictEntryOriginalContent}</bla> + let $dictEntryContentParsed := + if ($dictionary/name = "ls" and $output = "html") + then <div>{$dictEntryContentParsedTmp}<br/>(external link to <a href="http://www.perseus.tufts.edu/hopper/text?doc=Perseus:text:1999.04.0059:entry={$dictEntry/form}">www.perseus.tufts.edu</a>)</div> + else if ($dictionary/name = "ls" and $output = "xml") + then <div>{$dictEntryContentParsedTmp}<directLink type="simple" xlink:href="http://www.perseus.tufts.edu/hopper/text?doc=Perseus:text:1999.04.0059:entry={$dictEntry/form}">www.perseus.tufts.edu</directLink></div> + else if ($dictionary/name = "lsj" and $output = "html") + then <div>{$dictEntryContentParsedTmp}<br/>(external link to <a href="http://www.perseus.tufts.edu/hopper/text?doc=Perseus:text:1999.04.0057:entry={$dictEntryForm}">www.perseus.tufts.edu</a>)</div> + else if ($dictionary/name = "lsj" and $output = "xml") + then <div>{$dictEntryContentParsedTmp}<directLink type="simple" xlink:href="http://www.perseus.tufts.edu/hopper/text?doc=Perseus:text:1999.04.0057:entry={$dictEntryForm}">www.perseus.tufts.edu</directLink></div> + else if ($dictionary/name = "autenrieth" and $output = "html") + then <div>{$dictEntryContentParsedTmp}<br/>(external link to <a href="http://www.perseus.tufts.edu/hopper/text?doc=Perseus:text:1999.04.0073:entry={$dictEntryForm}">www.perseus.tufts.edu</a>)</div> + else if ($dictionary/name = "autenrieth" and $output = "xml") + then <div>{$dictEntryContentParsedTmp}<directLink type="simple" xlink:href="http://www.perseus.tufts.edu/hopper/text?doc=Perseus:text:1999.04.0073:entry={$dictEntryForm}">www.perseus.tufts.edu</directLink></div> + else if ($dictionary/name = "buckwalter" and $output = "html") + then <div>{$dictEntryContentParsedTmp}<br/>(external link to <a href="http://www.perseus.tufts.edu/hopper/text?doc=Perseus:text:2002.02.0014:entry={$dictEntryForm}">www.perseus.tufts.edu</a>)</div> + else if ($dictionary/name = "buckwalter" and $output = "xml") + then <div>{$dictEntryContentParsedTmp}<directLink type="simple" xlink:href="http://www.perseus.tufts.edu/hopper/text?doc=Perseus:text:2002.02.0014:entry={$dictEntryForm}">www.perseus.tufts.edu</directLink></div> + else if ($dictionary/name = "salmone" and $output = "html") + then <div>{$dictEntryContentParsedTmp}<br/>(external link to <a href="http://www.perseus.tufts.edu/hopper/text?doc=Perseus:text:2002.02.0005:entry={$dictEntryForm}">www.perseus.tufts.edu</a>)</div> + else if ($dictionary/name = "salmone" and $output = "xml") + then <div>{$dictEntryContentParsedTmp}<directLink type="simple" xlink:href="http://www.perseus.tufts.edu/hopper/text?doc=Perseus:text:2002.02.0005:entry={$dictEntryForm}">www.perseus.tufts.edu</directLink></div> + else $dictEntryContentParsedTmp + let $liDictEntryContentParsed := + if ($output = "html") + then <li>{($dictEntryContentParsed)}</li> + else if ($output = "xml") + then <entry>{($dictEntryContentParsed)}</entry> + else () + return $liDictEntryContentParsed + let $dictLi := + if ($output = "html") + then + <li><b>{$dictDescription}</b> + <ul>{$entryDictEntryContent}</ul> + </li> + else if ($output = "xml") + then + <dictionaryEntries> + <dictionary> + <name>{$dictName}</name> + <description>{$dictDescription}</description> + <entries>{$entryDictEntryContent}</entries> + </dictionary> + </dictionaryEntries> + else () + return $dictLi + +let $wikiArticles := + if (empty($lemmas)) + then () + else + for $l in $lemmasStrTokenized + let $wikiHref1 := concat("http://", $language, ".wikipedia.org/wiki/", $l) + let $wikiHref2 := concat("http://", $language, ".wikipedia.org/wiki/index.php?search=", $l) + let $wikiArticle := + if ($output = "html") + then <li><b>Article: </b>External link: <a href="{$wikiHref1}">{$l}</a> (or search for <a href="{$wikiHref2}">{$l})</a></li> + else if ($output = "xml") + then + <article> + <name>{$l}</name> + <directLink xlink:type="simple" xlink:href="{$wikiHref1}"/> + <searchLink xlink:type="simple" xlink:href="{$wikiHref2}"/> + </article> + else () + return $wikiArticle +let $places := + if ($placeHref != "" and $output = "html") + then <li><b>Place: </b>External link: <a href="{$placeHref}">{$word}</a></li> + else if ($placeHref != "" and $output = "html") + then + <place> + <name>{$word}</name> + <directLink xlink:type="simple" xlink:href="{$placeHref}"/> + </place> + else () + +let $dict := + if (not(empty($retDictionaries)) and ($type = "all" or $type = "dict") and $output = "html") + then + <p> + <h3>Dictionary</h3> + <ul>{$retDictionaries}</ul> + </p> + else if (empty($retDictionaries) and ($type = "all" or $type = "dict") and $output = "html") + then + <p> + <h3>Dictionary</h3> + <ul>No information available</ul> + </p> + else if (not(empty($retDictionaries)) and ($type = "all" or $type = "dict") and $output = "xml") + then $retDictionaries + else () +let $morph := + if (not(empty($htmlOrderedLemmas)) and ($type = "all" or $type = "morph") and $output = "html") + then + <p> + <h3>Morphology</h3> + <ul>{$htmlOrderedLemmas}</ul> + </p> + else if (empty($htmlOrderedLemmas) and ($type = "all" or $type = "morph") and $output = "html") + then + <p> + <h3>Morphology</h3> + <ul>No information available</ul> + </p> + else if (not(empty($htmlOrderedLemmas)) and ($type = "all" or $type = "morph") and $output = "xml") + then <morphologyEntries>{$xmlOrderedLemmas}</morphologyEntries> + else if ($type = "morph" and $output = "string") + then $lemmasStrWithoutWord + else () +let $wiki := + if (not(empty($wikiArticles)) and ($type = "all" or $type = "wiki") and $output = "html") + then + <p> + <h3>Wikipedia</h3> + <ul>{$wikiArticles}</ul> + </p> + else if (not(empty($wikiArticles)) and ($type = "all" or $type = "wiki") and $output = "xml") + then <wikiEntries>{$wikiArticles}</wikiEntries> + else () +let $place := + if (not(empty($places)) and ($type = "all" or $type = "place") and $output = "html") + then + <p> + <h3>Place</h3> + <ul>{$places}</ul> + </p> + else if (not(empty($places)) and ($type = "all" or $type = "place") and $output = "xml") + then <placeEntries>{$places}</placeEntries> + else () + +let $currentTimeEnd := util:system-time() +let $neededTime := mpdl-time:duration-as-ms($currentTimeEnd - $currentTimeBegin) + +let $declare := + if ($output = "html" or $output = "string") + then util:declare-option("exist:serialize", "method=html media-type=text/html omit-xml-declaration=no indent=yes encoding=utf-8") + else util:declare-option("exist:serialize", "method=xml media-type=text/xml omit-xml-declaration=no indent=yes encoding=utf-8") + +let $queryResultHeaderStr := <h2>Word information for: {$word}</h2> +let $commentExternalLinks := + "[* no guarantee for external links]" + +let $retXmlResult := + <word> + <form>{$word}</form> + <provider>Max Planck Institute for the History of Science, Berlin</provider> + {$morph} + {$dict} + {$wiki} + {$place} + </word> +let $retHtmlResult := + <html> + <head> + <title>Mpdl: word information</title> + </head> + <body> + <table align="right" valign="top"> + <td>[<i>This is a MPDL language technology service</i>] <a href="../../info.xql?info=wordInfo" onclick="window.open("../../info.xql?info=wordInfo", "InfoWindow", "menubar=no,width=800,height=600,toolbar=yes,scrollbars=yes");return false"><img src="../../images/info.png" valign="bottom" width="15" height="15" border="0" alt="MPDL language technology service"/></a></td> + </table> + <p/> + {$queryResultHeaderStr} + {$morph} + {$dict} + {$wiki} + {$place} + {$commentExternalLinks} + <hr/> + <p/> + Elapsed time: {$neededTime} ms, see the <a href="/exist/xquery.xml">XQuery documentation</a> and the <a href="wordInfo.xql?_source=yes">XQuery source</a> of this page, if you find a bug <a href="https://itgroup.mpiwg-berlin.mpg.de:8080/tracs/mpdl-project-software/newticket">let us know</a> + </body> + </html> + +let $retResult := + if ($output = "html") + then $retHtmlResult + else if ($type = "morph" and $output = "string") + then $morph + else $retXmlResult +return $retResult \ No newline at end of file