enable_session(); $error_text = new HAW_text($error_msg); $error_deck->add_text($error_text); $error_deck->create_page(); exit(); } function HAWIKI_specchar($string) { // special character handling // utf8_decode and reconvert HTML entities (e.g. ü ==> �) $trans = get_html_translation_table(HTML_ENTITIES); $trans = array_flip ($trans); return(strtr(utf8_decode($string), $trans)); } function HAWIKI_unhtmlentities($string) { // special character hnadling without utf8-decoding (see above) // & -> &, �->� (will be destroyed by utf8_decode) $trans = get_html_translation_table (HTML_ENTITIES); $trans = array_flip ($trans); return(strtr($string, $trans)); } class HAWIKI_page { var $deck; // HAW_deck object var $wiki_string; // input in wiki syntax var $wiki_base; // URL for WikiName links var $title; // page title var $navlink; // array with navigation links (home, menue etc.) var $smiley_dir; // where smiley gif's are stored var $link_jingle; // where link wav file for VoiceXML is located var $hawimconv; // where HAWHAW image converter script is located var $firstColumn; // flag to determine parser position var $listLine; // flag to indicate that line belongs to a list var $listNumbering; // array with current list numbers var $debugflags; // flags for dumping debug info var $textformat; // text format: bold, italic etc. var $textcolor; // text color function HAWIKI_page($input, $wiki_base, $title, $lang) { $this->wiki_string = utf8_decode($input); $this->wiki_base = $wiki_base; $this->title = HAWIKI_specchar($title); $this->smiley_dir = ""; // has to be set later by function call $this->link_jingle = ""; // dito $this->hawimconv = ""; // dito $this->navlink = array(); $this->firstColumn = true; $this->listLine = false; $this->listNumbering = array(); $this->debugflags = HAWIKI_DEBUG_NONE; $this->textformat = HAW_TEXTFORMAT_NORMAL; $this->textcolor = ""; // check input string for presence resp. maximum length if (strlen($input) > HAWIKI_MAXINPUTCHARS) { // invalid input size HAWIKI_error("Error: Invalid wiki size"); // script end } $this->deck = new HAW_deck(HAWIKI_TITLE); HAWTIKI_deck_init($this->deck); $this->deck->set_width(HAWIKI_DISP_WIDTH); $this->deck->set_height(HAWIKI_DISP_HEIGHT); $this->deck->set_disp_bgcolor(HAWIKI_DISP_BGCOLOR); if (isset($lang) && (strlen($lang) == 2)) { $this->deck->set_language($lang); if ($this->deck->ml == HAW_VXML) { global $language; // needed for tra(nslation) to work properly $language = $lang; if ($lang == "en") $this->deck->set_voice_nomatch("I did not understand what you said, please try again."); if ($lang == "fr") $this->deck->set_voice_nomatch("Je n'ai pas compris ce que vous avez dit. SVP essayer de nouveau."); if ($lang == "es") $this->deck->set_voice_nomatch("No comprendo lo que tu dices. Por favor, intenta otra vez."); if ($lang == "de") $this->deck->set_voice_nomatch("Ich habe Sie leider nicht verstanden. Bitte wiederholen Sie."); } } } function display() { // convert wiki text into HAWHAW object structure and create appropriate markup if (isset($_GET["hawikidebugremote"])) $url_debugflags = $_GET["hawikidebugremote"]; else $url_debugflags = HAWIKI_DEBUG_NONE; if ($url_debugflags && ($this->debugflags == HAWIKI_DEBUG_NONE)) $this->debugflags = $url_debugflags; if ($this->debugflags & HAWIKI_DEBUG_PARSER) printf("Input:
%s

\n", $this->wiki_string); if ($this->title) { $title = new HAW_text($this->title, HAW_TEXTFORMAT_BIG | HAW_TEXTFORMAT_BOXED); $this->deck->add_text($title); } $link_counter = 0; foreach ($this->navlink as $value) { // create navigation link(s) at top of wiki page if ($value["pos"] & HAWIKI_NAVLINK_TOP) { $link = new HAW_link($value["label"], $value["url"]); $this->deck->add_link($link); $link_counter++; } } if (($link_counter > 0) || $this->title) { // create horizontal rule between page header and wiki content $rule = new HAW_rule(); $this->deck->add_rule($rule); } $input = strip_tags($this->wiki_string); // remove all HTML while ($po = HAWIKI_parser($input, $this->firstColumn)) // evaluate parser output { $this->firstColumn = false; // default switch ($po["token"]) { case HAWIKI_TOKEN_DUMMY: { if ($this->debugflags & HAWIKI_DEBUG_PARSER) printf("Dummy token
\n"); // unsupported syntax element ==> do nothing break; } case HAWIKI_TOKEN_NEWLINE: { if ($this->debugflags & HAWIKI_DEBUG_PARSER) printf("Newline: %d
\n", $po["count"]); $text = new HAW_text(""); $text->set_br($po["count"]); // set number of line breaks $this->deck->add_text($text); $this->firstColumn = true; // now we're again in column 0 // numbered list are terminated by all lines, that are not list elements if ($this->listLine) $this->listLine = false; // continuation of numbered list is possible else $this->listNumbering = array(); // init numbering array // reset text formatting $this->textformat = HAW_TEXTFORMAT_NORMAL; break; } case HAWIKI_TOKEN_TEXT: { if ($this->debugflags & HAWIKI_DEBUG_PARSER) printf("Text: %s
\n", $po["text"]); if (strlen($po["text"]) > 0) { $text = new HAW_text(HAWIKI_unhtmlentities($po["text"]), $this->textformat); if ($this->textcolor) $text->set_color($this->textcolor); $text->set_br(0); $this->deck->add_text($text); } break; } case HAWIKI_TOKEN_BOLD: { if ($this->debugflags & HAWIKI_DEBUG_PARSER) printf("Toggle bold
\n"); $this->textformat ^= HAW_TEXTFORMAT_BOLD; break; } case HAWIKI_TOKEN_ITALIC: { if ($this->debugflags & HAWIKI_DEBUG_PARSER) printf("Toggle italic
\n"); $this->textformat ^= HAW_TEXTFORMAT_ITALIC; break; } case HAWIKI_TOKEN_UNDERLINE: { if ($this->debugflags & HAWIKI_DEBUG_PARSER) printf("Toggle underline
\n"); $this->textformat ^= HAW_TEXTFORMAT_UNDERLINE; break; } case HAWIKI_TOKEN_COLORED: { if ($this->debugflags & HAWIKI_DEBUG_PARSER) printf("Colored: %s
\n", $po["color"]); $this->textcolor = $po["color"]; break; } case HAWIKI_TOKEN_MONOSPACED: { if ($this->debugflags & HAWIKI_DEBUG_PARSER) printf("Monospaced
\n"); // monospace is not supported by HAWHAW -> draw small instead $this->textformat |= HAW_TEXTFORMAT_SMALL; break; } case HAWIKI_TOKEN_PARAGRAPH: { if ($this->debugflags & HAWIKI_DEBUG_PARSER) printf("Paragraph: %s
\n", $po["text"]); $paragraph = new HAW_text($po["text"], HAW_TEXTFORMAT_BIG | HAW_TEXTFORMAT_BOXED); $paragraph->set_br(0); $this->deck->add_text($paragraph); break; } case HAWIKI_TOKEN_HEADING: { if ($this->debugflags & HAWIKI_DEBUG_PARSER) printf("Heading (level %d)
\n", $po["level"]); $this->textformat |= HAW_TEXTFORMAT_BOLD; if ($po["level"] <= 2) $this->textformat |= HAW_TEXTFORMAT_BIG; if ($po["level"] == 1) $this->textformat |= HAW_TEXTFORMAT_UNDERLINE; break; } case HAWIKI_TOKEN_BULLIST: { if ($this->debugflags & HAWIKI_DEBUG_PARSER) printf("Bullet list (level %d)
\n", $po["level"]); $bullet = str_repeat("*", $po["level"]); $text = new HAW_text($bullet . " ", HAW_TEXTFORMAT_BOLD); $text->set_br(0); $this->deck->add_text($text); break; } case HAWIKI_TOKEN_NUMLIST: { if ($this->debugflags & HAWIKI_DEBUG_PARSER) printf("Numbered list (level %d)
\n", $po["level"]); if (isset($this->listNumbering[$po["level"]])) $this->listNumbering[$po["level"]]++; // increment this level else $this->listNumbering[$po["level"]] = 1; // init this level $number = ""; for ($n=1; $n <= $po["level"]; $n++) { // assemble current numbering if (isset($this->listNumbering[$n])) $number .= sprintf("%d.", $this->listNumbering[$n]); else $number .= "0."; } $number = substr($number, 0, -1); // remove trailing dot $text = new HAW_text($number . " ", HAW_TEXTFORMAT_BOLD); $text->set_br(0); $this->deck->add_text($text); $this->listLine = true; break; } case HAWIKI_TOKEN_RULE: { if ($this->debugflags & HAWIKI_DEBUG_PARSER) printf("Horizontal rule
\n"); $rule = new HAW_rule(); $this->deck->add_rule($rule); $this->firstColumn = true; // now we're again in column 0 break; } case HAWIKI_TOKEN_WIKINAME: { if ($this->debugflags & HAWIKI_DEBUG_PARSER) printf("WikiName: extwiki:%s page:%s label:%s dtmf:%s
\n", $po["extwiki"], $po["page"], $po["label"], $po["dtmf"]); if ($po["extwiki"]) { $link = new HAW_link($po["label"], ereg_replace('\$page', $po["page"], $po["extwiki"]) . "&mode=mobile"); } else $link = new HAW_link($po["label"], $this->wiki_base . $po["page"]); if (isset($po["dtmf"])) // assign DTMF key $link->set_voice_dtmf($po["dtmf"]); $link->set_br(0); $this->deck->add_link($link); break; } case HAWIKI_TOKEN_LINK: { if ($this->debugflags & HAWIKI_DEBUG_PARSER) printf("Link: url:%s label:%s
\n", $po["url"], $po["label"]); // determine file extension of link if (preg_match("/\.(\w*)$/", $po["url"], $matches)) $extension = strtolower($matches[1]); if (($this->deck->ml == HAW_VXML) && isset($extension) && (($extension == "wav") || ($extension == "mp3"))) { // play audio file on VoiceXML browser instead of creating link $introtext = new HAW_text($po["label"]); $this->deck->add_text($introtext); $audio = new HAW_text(""); $audio->set_voice_text("Sorry, this voice browser does not support " . $extension . " format", HAWIKI_specchar($po["url"])); $this->deck->add_text($audio); } else { // mark as external link if ($po["ext"]) { $el_image = new HAW_image(HAWIKI_EXTLINK_ICON . ".wbmp", HAWIKI_EXTLINK_ICON . ".gif", $po["extlink_text"]); $el_image->set_voice_text($po["extlink_text"]); $this->deck->add_image($el_image); } // create link $link = new HAW_link($po["label"], HAWIKI_specchar($po["url"])); $link->set_br(0); $this->deck->add_link($link); } break; } case HAWIKI_TOKEN_TABLE: { // format of "text": // colums are seperated by '|' (this is pipe, not slash!) // rows are seperated by '\n' if ($this->debugflags & HAWIKI_DEBUG_PARSER) printf("Table: %s
\n", $po["text"]); $table = new HAW_table(); $table_arr = explode("\n", $po["text"]); while (list($key1, $val1) = each($table_arr)) { $row = new HAW_row(); $row_arr = explode("|", $val1); while (list($key2, $val2) = each($row_arr)) { $text = new HAW_text($val2); $text->set_br(0); $row->add_column($text); } $table->add_row($row); } $this->deck->add_table($table); break; } case HAWIKI_TOKEN_IMAGE: { global $tikidomain; if ($tikidomain) $po["src"] = preg_replace("~img/wiki_up/~","img/wiki_up/$tikidomain/", $po["src"]); if ($this->debugflags & HAWIKI_DEBUG_PARSER) printf("Image: src:%s alt:%s link:%s
\n", $po["src"], $po["alt"], $po["link"]); if ($po["src"]) { if ($this->hawimconv) { // HAWHAW image converter available if (preg_match("/^htt/", $po["src"])) { // full qualified url ==> use unchanged $img_wbmp = sprintf("%s?img=%s", $this->hawimconv, urlencode($po["src"])); } elseif(preg_match("/^\//", $po["src"])) { // absolute url ==> append filename to document root $img_wbmp = sprintf("%s?img=%s", $this->hawimconv, urlencode($_SERVER["DOCUMENT_ROOT"] . $po["src"])); } else { // relative url ==> append filename to working directory $img_wbmp = sprintf("%s?img=%s", $this->hawimconv, urlencode(getcwd() . "/" . $po["src"])); } } else { // no image converter available ==> rely on available wbmp image ... $img_wbmp = ereg_replace(".gif$|.png$|.jpg$", ".wbmp", $po["src"]); } if (isset($po["alt"]) && ($po["alt"] != "")) $img_alt = $po["alt"]; else $img_alt = $po["src"]; // set alternative text to src, if not available $image = new HAW_image($img_wbmp, $po["src"], $img_alt); $this->deck->add_image($image); } if (isset($po["link"]) && $po["link"] && ($this->deck->ml != HAW_VXML)) { // HAWHAW does not support images as links // ==> draw @-link next to image (for visual browsers) $po["link"] = ereg_replace("&", "&", $po["link"]); // &-treatment is done by HAWHAW $link = new HAW_link("@", $po["link"]); $link->set_br(0); $this->deck->add_link($link); } break; } case HAWIKI_TOKEN_SMILEY: { if ($this->debugflags & HAWIKI_DEBUG_PARSER) printf("Smiley: %s
\n", $po["text"]); if ($this->smiley_dir) { // smiley directory has been set by the user $img_html = $this->smiley_dir . "/icon_" . $po["text"] . ".gif"; $img_wbmp = $this->smiley_dir . "/icon_" . $po["text"] . ".wbmp"; $img_alt = ":)"; $image = new HAW_image($img_wbmp, $img_html, $img_alt); $image->use_localsrc("smileyface"); $this->deck->add_image($image); } break; } case HAWIKI_TOKEN_PLUGIN: { if ($this->debugflags & HAWIKI_DEBUG_PARSER) printf("Plugin: %s
\n", htmlspecialchars($po["html"])); if ($po["html"]) { // plugins return pure HTML ==> show on HTML browsers only $rawhtml = new HAW_raw(HAW_HTML, $po["html"]); $this->deck->add_raw($rawhtml); } break; } default: { if ($this->debugflags & HAWIKI_DEBUG_PARSER) printf("Unknown token: %d
\n", $po["token"]); break; } } } if (strlen($input) > 0) { // parsing aborted due to syntax error // ==> terminate output with error message $newline = new HAW_text(""); $this->deck->add_text($newline); $error_text = new HAW_text("Error: Invalid wiki syntax"); $this->deck->add_text($error_text); } $link_counter = 0; foreach ($this->navlink as $value) { // create navigation link(s) at bottom of wiki page if ($value["pos"] & HAWIKI_NAVLINK_BOTTOM) { if ($link_counter == 0) { // create horozontal rule between wiki content and 1st link $rule = new HAW_rule(); $this->deck->add_rule($rule); } $link = new HAW_link($value["label"], $value["url"]); $this->deck->add_link($link); $link_counter++; } } // set jingle for VoiceXML links if ($this->link_jingle) { // jingle has been set by hawiki user $this->deck->set_voice_jingle($this->link_jingle); } // smooth voice sections $this->deck->smooth_voice(); // output appropriate markup language $this->deck->create_page(); } function set_navlink($label, $url, $pos) { // define navigation link on top and/or bottom of wiki page // label: link text // url: link url // pos: HAWIKI_NAVLINK_TOP (link is created at top of wiki page) // HAWIKI_NAVLINK_BOTTOM (link is created at bottom of wiki page) // HAWIKI_NAVLINK_TOP | HAWIKI_NAVLINK_BOTTOM (top AND bottom) $arr["label"] = HAWIKI_specchar($label); $arr["url"] = $url; $arr["pos"] = $pos; $this->navlink[] = $arr; // enhance array with navigation links } function set_smiley_dir($dir) { // set directory where smileys are stored $this->smiley_dir = $dir; } function set_link_jingle($url) { // set link wav-file for VoiceXML $this->link_jingle = $url; } function set_hawimconv($url) { // determine HAWHAW image conversion script $this->hawimconv = $url; } function set_debugflags($flags) { $this->debugflags = $flags; } }; ?>