diff --git a/config/layouts/default.json b/config/layouts/default.json deleted file mode 100755 index 080ecd11736c57cfd05d207b7a06b0badcec4b16..0000000000000000000000000000000000000000 --- a/config/layouts/default.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "type": "xsplit", - "cut": 35, - "left": { - "type": "panel", - "name": "departure", - "config": "oh14" - }, - "right": { - "type": "ysplit", - "cut": 30, - "up": { - "type": "panel", - "name": "clock" - }, - "down": { - "type": "cycler", - "duration": 5, - "panels": [ - { - "type": "panel", - "name": "ufc" - }, - { - "type": "panel", - "name": "mensaPlan" - }, - { - "type": "panel", - "name": "lsfView" - } - ] - } - } -} diff --git a/config/layouts/default.json.skel b/config/layouts/default.json.skel index dacb79cafd2137392373e8be06e10b8143b58adc..e40d6488e89b935d55bc745a5248cf2752bdf66f 100755 --- a/config/layouts/default.json.skel +++ b/config/layouts/default.json.skel @@ -23,12 +23,14 @@ "config": { "files": [ { - "filename": "itour2016_0.png", - "enddate": "02.11.2016" + "filename": "SOMEFILE.png", + "startdate": "NEVER", + "enddate": "30.11.2016" }, { - "filename": "DAT_2016_Flyer_DINA6.png", - "enddate": "18.11.2016" + "filename": "OpenSourceInfoscreen.jpg", + "startdate": "NEVER", + "enddate": "18.11.2017" } ] } diff --git a/panels/GameOfLife/script.js b/panels/GameOfLife/script.js index 66e0ff700acacf9bc1ac99e16b99116a63234ae5..dc99d193e8a7c2faee6ff64e9fdb9a73d4205163 100755 --- a/panels/GameOfLife/script.js +++ b/panels/GameOfLife/script.js @@ -11,14 +11,28 @@ var GOLData = { grid: 1 }; -this.loaded = function(panel, config) { +this.loaded=function(panel,config) { + console.log("TESTV"); GOLData.panel = panel; + console.log("TESTN"+panel); GOLData.config = config; GOLinit(); GOLdraw(); setTimeout(function(){setInterval(function() {GOLiterate(); GOLdraw();}, 500); }, 10000); } +this.show=function() { +} + +this.resize=function() { +} + +this.hide = function() { +} + +this.checkShowCondition = function() { +} + function GOLinit(){ //if(GOLData.config[initType] == "random") { //GOLinitRandom(); @@ -258,8 +272,8 @@ function GOLcountDead(temp,x,y){ function GOLinitDraw(){ GOLData.canvas = document.getElementById("GOLCanvas"); GOLData.context = document.getElementById("GOLCanvas").getContext("2d"); - GOLData.canvas.width = panel.width(); - GOLData.canvas.height = panel.height(); + GOLData.canvas.width = GOLData.panel.width(); + GOLData.canvas.height = GOLData.panel.height(); if(GOLData.grid) { GOLData.sWidth = (GOLData.canvas.width-(GOLData.vAmount+1)) / GOLData.vAmount; GOLData.sHeight = (GOLData.canvas.height-(GOLData.hAmount+1)) / GOLData.hAmount; diff --git a/panels/lsfView/lsfParser.php b/panels/lsfView/lsfParser.php index de35246595be35e56ab96164158689d167323b35..c361fc6dac7aec9f66f8e59ff51d5c7be26b863d 100755 --- a/panels/lsfView/lsfParser.php +++ b/panels/lsfView/lsfParser.php @@ -60,34 +60,34 @@ if($SEMESTER == 1){ // search subject $subjects = array (); foreach ( $SUBJECT_LIST as $SUBJECT ) { - echo "Searching ".$SUBJECT->getSearchName()."-"; + echo "Searching ".$SUBJECT->getSearchName()."\n"; $html = file_get_html ( $SEARCH_URL."&veranstaltung.dtxt=".str_replace(' ',"+",$SUBJECT->getSearchName())."&veranstaltung.semester=".date("Y").$SEMESTER); if ($html != null) { $list = $html->find('a[title="Mehr Informationen zu '.$SUBJECT->getSearchName().'"]'); if (count($list) != 0) { foreach($list as $a){ if(removeSpace($a->parent()->parent()->children (2)->innertext) == "Vorlesung") { - echo "Hit-"; + echo " - Hit \n"; $HREF = $a->href; $html->clear(); unset($html); $html = file_get_html ( html_entity_decode($HREF) ); if ($html != null) { - array_push ( $subjects, parsSubject ($html,$SUBJECT) ); + array_push ( $subjects, parsSubject ($html,$SUBJECT) ); } else { - echo "\"".$SUBJECT->getSearchName()."\"-Site nicht aufrufbar\n"; + echo "\"".$SUBJECT->getSearchName()."\"-Site nicht aufrufbar\n"; } break; } } + } else { + echo " - \"".$SUBJECT->getSearchName()."\"-Search liefert kein passendes Ergebnis\n"; + } } else { - echo "\"".$SUBJECT->getSearchName()."\"-Search liefert kein passendes Ergebnis\n"; - } - } else { - echo "\"".$SUBJECT->getSearchName()."\"-Search nicht aufrufbar.\n"; + echo " - \"".$SUBJECT->getSearchName()."\"-Search nicht aufrufbar.\n"; } } toJsonSubjects ( $subjects, $JSON_NAME_SUBJECTS, $JSON_INC_NAME_SUBJECTS, $JSON_INC_SHORT_SUBJECTS); toJsonEvents ( $subjects, $JSON_NAME_EVENTS, $JSON_INC_NAME_EVENTS, $JSON_INC_SHORT_EVENTS); -?> \ No newline at end of file +?> diff --git a/panels/mensaPlan/config.php.skel b/panels/mensaPlan/config.php.skel deleted file mode 100755 index 3ff769b5d8579846eba70a1bd289e82acab3d04a..0000000000000000000000000000000000000000 --- a/panels/mensaPlan/config.php.skel +++ /dev/null @@ -1,22 +0,0 @@ -<?php -// Universal -$MENSA_URL = "http://www.stwdo.de/gastronomie/speiseplaene/hauptmensa/wochenansicht-hauptmensa/"; -$PARSE_DAYLIST = array ( - "montag", - "dienstag", - "mittwoch", - "donnerstag", - "freitag" -); - -// JSON -$JSON_NAME = "../../tmp/mensaPlan.json"; -$JSON_INC_NR = false; -$JSON_INC_ORIGINAL = false; -$JSON_INC_SHORT = true; -$JSON_INC_ART = true; -$JSON_INC_KIND = false; -$JSON_INC_COUNTER = true; -$JSON_INC_STOFFE = false; -$JSON_INC_DATE = true; -?> diff --git a/panels/mensaPlan/gericht.php b/panels/mensaPlan/gericht.php deleted file mode 100755 index ed0808573859f491ba099af5a9c14a748414b6a9..0000000000000000000000000000000000000000 --- a/panels/mensaPlan/gericht.php +++ /dev/null @@ -1,348 +0,0 @@ -<?php -class GERICHT { - private $nr = 0; - private $originalText = ""; - private $shortText = ""; - private $rind = false; - private $schwein = false; - private $gefluegel = false; - private $fisch = false; - private $vegetarisch = false; - private $vegan = false; - private $kinderteller = false; - private $counter = ""; - private $zusatzStoffe = array ( - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ); - private $date = ""; - public function getNr() { - return $this->nr; - } - public function getOriginalText() { - return $this->originalText; - } - public function getShortText() { - return $this->shortText; - } - public function isRind() { - return $this->rind; - } - public function isSchwein() { - return $this->schwein; - } - public function isGefluegel() { - return $this->gefluegel; - } - public function isFisch() { - return $this->fisch; - } - public function isVegetarisch() { - return $this->vegetarisch; - } - public function isVegan() { - return $this->vegan; - } - public function isKinderteller() { - return $this->kinderteller; - } - public function getArtAsString($seperator = " ") { - $art = ""; - $first = true; - if ($this->rind) { - $art .= "R"; - $first = false; - } - if ($this->schwein) { - if (! $first) { - $art .= $seperator; - } - $art .= "S"; - $first = false; - } - if ($this->gefluegel) { - if (! $first) { - $art .= $seperator; - } - $art .= "G"; - $first = false; - } - if ($this->fisch) { - if (! $first) { - $art .= $seperator; - } - $art .= "F"; - $first = false; - } - if ($this->vegetarisch) { - if (! $first) { - $art .= $seperator; - } - $art .= "V"; - $first = false; - } - if ($this->vegan) { - if (! $first) { - $art .= $seperator; - } - $art .= "N"; - $first = false; - } - if ($this->kinderteller) { - if (! $first) { - $art .= $seperator; - } - $art .= "K"; - $first = false; - } - return $art; - } - public function getCounter() { - return $this->counter; - } - public function isZusatzstoff($id) { - return $this->zusatzStoffe [$id]; - } - public function getZusatzstoffe() { - return $this->zusatzStoffe; - } - public function getZusatzstoffeAsString($seperator = " ") { - $stoffe = ""; - $first = true; - for($i = 0; $i < count ( $this->zusatzStoffe ); $i ++) { - if ($this->zusatzStoffe [$i]) { - if (! $first) { - $stoffe .= $seperator . $i; - } else { - $stoffe .= $i; - $first = false; - } - } - } - return $stoffe; - } - public function getDate() { - return $this->date; - } - public function setNr($nr) { - $this->nr = $nr; - } - public function setOriginalText($originalText) { - $this->originalText = $originalText; - } - public function setShortText($shortText) { - $this->shortText = $shortText; - } - public function setRind($rind) { - $this->rind = $rind; - } - public function setSchwein($schwein) { - $this->schwein = $schwein; - } - public function setGefluegel($gefluegel) { - $this->gefluegel = $gefluegel; - } - public function setFisch($fisch) { - $this->fisch = $fisch; - } - public function setVegetarisch($vegetarisch) { - $this->vegetarisch = $vegetarisch; - } - public function setVegan($vegan) { - $this->vegan = $vegan; - } - public function setKinderteller($kinderteller) { - $this->kinderteller = $kinderteller; - } - public function setArt($in, $val) { - switch ($in) { - case "R" : - $this->rind = $val; - break; - case "S" : - $this->schwein = $val; - break; - case "G" : - $this->gefluegel = $val; - break; - case "F" : - $this->fisch = $val; - break; - case "V" : - $this->vegetarisch = $val; - break; - case "N" : - $this->vegan = $val; - break; - case "K" : - $this->kinderteller = $val; - break; - default : - echo "Angegebene Art '" . $in . "' nicht bekannt."; - } - } - public function setCounter($counter) { - $this->counter = $counter; - } - public function setZusatzstoff($in, $val) { - $this->zusatzStoffe [$in] = $val; - } - public function setZusatzstoffe($zusatzStoffe) { - $this->zusatzStoffe = $zusatzStoffe; - } - public function setDate($date) { - $this->date = $date; - } - public function toggleRind() { - $this->rind = ! $this->rind; - } - public function toggleSchwein() { - $this->schwein = ! $this->schwein; - } - public function toggleGefluegel() { - $this->gefluegel = ! $this->gefluegel; - } - public function toggleFisch() { - $this->fisch = ! $this->fisch; - } - public function toggleVegetarisch() { - $this->vegetarisch = ! $this->vegetarisch; - } - public function toggleVegan() { - $this->vegan = ! $this->vegan; - } - public function toggleKinderteller() { - $this->kinderteller = ! $this->kinderteller; - } - public function toggleArt($in) { - switch ($in) { - case "R" : - $this->rind = ! $this->rind; - break; - case "S" : - $this->schwein = ! $this->schwein; - break; - case "G" : - $this->gefluegel = ! $this->gefluegel; - break; - case "F" : - $this->fisch = ! $this->fisch; - break; - case "V" : - $this->vegetarisch = ! $this->vegetarisch; - break; - case "N" : - $this->vegan = ! $this->vegan; - break; - case "K" : - $this->kinderteller = ! $this->kinderteller; - break; - default : - echo "Angegebene Art '" . $in . "' nicht bekannt."; - } - } - public function toggleZusatzstoff($in) { - $this->zusatzStoffe [$in] = ! $this->zusatzStoffe [$in]; - } - public function toJson($inc_nr = true, $inc_original = true, $inc_short = true, $inc_art = true, $inc_kind = true, $inc_counter = true, $inc_stoffe = true, $inc_date = true) { - $json = "{"; - if ($inc_nr) { - $json .= '"nr": "' . $this->nr . '"'; - } - if ($inc_nr && ($inc_original || $inc_short || $inc_art || $inc_kind || $inc_counter || $inc_stoffe || $inc_date)) { - $json .= ','; - } - if ($inc_original) { - $json .= '"originalText": "' . $this->originalText . '"'; - } - if ($inc_original && ($inc_short || $inc_art || $inc_kind || $inc_counter || $inc_stoffe || $inc_date)) { - $json .= ','; - } - if ($inc_short) { - $json .= '"shortText": "' . $this->shortText . '"'; - } - if ($inc_short && ($inc_art || $inc_kind || $inc_counter || $inc_stoffe || $inc_date)) { - $json .= ','; - } - if ($inc_art) { - $json .= '"rind": ' . $this->rind . ','; - $json .= '"schwein": ' . $this->schwein . ','; - $json .= '"gefluegel": ' . $this->gefluegel . ','; - $json .= '"fisch": ' . $this->fisch . ','; - $json .= '"vegetarisch": ' . $this->vegetarisch . ','; - $json .= '"vegan": ' . $this->vegan . ''; - } - if ($inc_art && ($inc_kind || $inc_counter || $inc_stoffe || $inc_date)) { - $json .= ','; - } - if ($inc_kind) { - $json .= '"kinderteller":' . $this->kinderteller . ''; - } - if ($inc_kind && ($inc_counter || $inc_stoffe || $inc_date)) { - $json .= ','; - } - if ($inc_counter) { - if ($this->getCounter () == "") { - $json .= '"counter": ' . 0; - } else { - $json .= '"counter": ' . $this->getCounter (); - } - } - if ($inc_counter && ($inc_stoffe || $inc_date)) { - $json .= ','; - } - if ($inc_stoffe) { - $json .= '"zusatzStoffe": {' . '"0":' . $this->zusatzStoffe [0] . ',' . '"1":' . $this->zusatzStoffe [1] . ',' . '"2":' . $this->zusatzStoffe [2] . ',' . '"3":' . $this->zusatzStoffe [3] . ',' . '"4":' . $this->zusatzStoffe [4] . ',' . '"5":' . $this->zusatzStoffe [5] . ',' . '"6":' . $this->zusatzStoffe [6] . ',' . '"7":' . $this->zusatzStoffe [7] . ',' . '"8":' . $this->zusatzStoffe [8] . ',' . '"9":' . $this->zusatzStoffe [9] . ',' . '"10":' . $this->zusatzStoffe [10] . ',' . '"11":' . $this->zusatzStoffe [11] . ',' . '"12":' . $this->zusatzStoffe [12] . ',' . '"13":' . $this->zusatzStoffe [13] . ',' . '"14":' . $this->zusatzStoffe [14] . ',' . '"15":' . $this->zusatzStoffe [15] . ',' . '"16":' . $this->zusatzStoffe [16] . ',' . '"17":' . $this->zusatzStoffe [17] . ',' . '"18":' . $this->zusatzStoffe [18] . ',' . '"19":' . $this->zusatzStoffe [19] . ',' . '"20":' . $this->zusatzStoffe [20] . ',' . '"21":' . $this->zusatzStoffe [21] . ',' . '"22":' . $this->zusatzStoffe [22] . ',' . '"23":' . $this->zusatzStoffe [23] . ',' . '"24":' . $this->zusatzStoffe [24] . ',' . '"25":' . $this->zusatzStoffe [25] . ',' . '"26":' . $this->zusatzStoffe [26] . ',' . '"27":' . $this->zusatzStoffe [27] . ',' . '"28":' . $this->zusatzStoffe [28] . ',' . '"29":' . $this->zusatzStoffe [29] . ',' . '"30":' . $this->zusatzStoffe [30] . ',' . '"31":' . $this->zusatzStoffe [31] . ',' . '"32":' . $this->zusatzStoffe [32] . ',' . '"33":' . $this->zusatzStoffe [33] . '}'; - } - if ($inc_stoffe && ($inc_date)) { - $json .= ','; - } - if ($inc_date) { - $json .= '"date": "' . $this->date . '"'; - } - $json .= '}'; - return $json; - } - public function __toString() { - for($i = 0; $i < count ( $this->zusatzStoffe ); $i ++) { - if ($this->zusatzStoffe [$i]) { - $stoffe = $stoffe . " " . $i; - } - } - - return "Nr: " . $this->nr . ", Original Text: " . $this->originalText . ",\n" . "Short Text: " . $this->shortText . ",\n" . "Rind: " . booleanToString ( $this->rind ) . ",\n" . "Schwein: " . booleanToString ( $this->schwein ) . ",\n" . "Fisch: " . booleanToString ( $this->fisch ) . ",\n" . "Vegetarisch: " . booleanToString ( $this->vegetarisch ) . ",\n" . "Vegan: " . booleanToString ( $this->vegan ) . ",\n" . "Kinderteller: " . booleanToString ( $this->kinderteller ) . ",\n" . "Counter: " . $this->counter . ",\n" . "Zusatzstoffe: " . $stoffe . ",\n"; - } -} -?> \ No newline at end of file diff --git a/panels/mensaPlan/helper.php b/panels/mensaPlan/helper.php deleted file mode 100755 index 8cab197c6fc0884ad5db71f5cd21666b0a60d4d3..0000000000000000000000000000000000000000 --- a/panels/mensaPlan/helper.php +++ /dev/null @@ -1,117 +0,0 @@ -<?php -function booleanToString($bool) { - if ($bool) { - return "True"; - } else { - return "False"; - } -} -function toJson($tage, $name, $inc_nr, $inc_original, $inc_short, $inc_art, $inc_kind, $inc_stoffe, $inc_counter, $inc_date) { - $kommata = false; - $json = '{'; - foreach ( $tage as $tag ) { - if ($kommata) { - $json .= ','; - } else { - $kommata = true; - } - $json .= $tag->toJson ( $inc_nr, $inc_original, $inc_short, $inc_art, $inc_kind, $inc_counter, $inc_stoffe, $inc_date ); - } - $json .= "}"; - file_put_contents ( $name, $json ); -} -function parsDay($html, $day) { - $tag = new TAG ( $day, substr ( $html->find ( 'a[href="#' . $day . '"]', 0 )->innertext, - 10, 10 ) ); - - $html = $html->find ( 'a.#' . $day, 0 ); - $html = $html->first_child ()->children ( 1 ); - $tr = $html->first_child (); - $nr = 0; - while ( $tr != null ) { - $nr ++; - $current = new GERICHT (); - $current->setNr ( $nr ); - $td0 = $tr->find ( 'td', 0 ); - $td1 = $tr->find ( 'td', 1 ); - $td2 = $tr->find ( 'td', 2 ); - // parse originalText shortText and Zusatzstoffe - if ($td0 != null) { - $current->setOriginalText ( $td0->innertext ); - // prepare Zusatzstoffe - $zusatzstoffe = $td0->innertext; - preg_match_all ( '#\([\d+,]+\)#', $zusatzstoffe, $matches ); - foreach ( $matches [0] as $match ) { - preg_match_all ( '#[\d+]+#', $match, $stoffe ); - foreach ( $stoffe [0] as $stoff ) { - $current->setZusatzstoff ( $stoff, true ); - } - } - // shorten Text - $current->setShortText ( shortenText ( $td0->innertext ) ); - } - // parse Art - if ($td1 != null) { - $art = $td1->innertext; - $current->setRind ( substr_count ( $art, "R" ) ); - $current->setSchwein ( substr_count ( $art, "S" ) ); - $current->setGefluegel ( substr_count ( $art, "G" ) ); - $current->setFisch ( substr_count ( $art, "F" ) ); - $current->setVegetarisch ( substr_count ( $art, "V" ) ); - $current->setVegan ( substr_count ( $art, "N" ) ); - $current->setKinderteller ( substr_count ( $art, "K" ) ); - } - // parse Counter - if ($td2 != null) { - $img = $td2->find ( 'img', 0 ); - if ($img != null) { - $img = $img->src; - $img = array_pop ( explode ( "/", $img ) ); - switch ($img) { - case "icon-menue-1.png" : - $current->setCounter ( 1 ); - break; - case "icon-menue-2.png" : - $current->setCounter ( 2 ); - break; - case "icon-tagesgericht.png" : - $current->setCounter ( 3 ); - break; - case "icon-vegetarisch.png" : - $current->setCounter ( 4 ); - break; - case "icon-aktionsteller.png" : - $current->setCounter ( 5 ); - break; - case "icon-grillstation.png" : - $current->setCounter ( 6 ); - break; - case "icon-fisch.png" : - $current->setCounter ( 7 ); - break; - case "icon-vegan.png" : - $current->setCounter ( 8 ); - break; - } - } - } - if ($current->getOriginalText () != "") { // remove empty Fields - $current->setDate ( $tag->getDate () ); - $tag->addGericht ( $current ); - } - $tr = $tr->next_sibling (); - } - return $tag; -} -function shortenText($text) { - $text = preg_replace ( '#\([^\)]*\)#', '', $text ); // remove zusatzstoffe - $text = preg_replace ( '#(\s,|,\s)#', ',', $text ); // fix Komma - $text = preg_replace ( '#,#', ', ', $text ); // fix Komma - $text = preg_replace ( '#\s+#', ' ', $text ); // fix double Whitespace - $text = preg_replace ( '#,\sdazu\s\d\sBeilagen\snach\sWahl#', '', $text ); // remove Beilagen - $text = preg_replace ( '#,\sdazu\s#', ' + ', $text ); // replace dazu - $text = preg_replace ( '#\sund\s#', ' & ', $text ); // replace und - $text = str_replace(' ;','; ',$text); //weniger hässlich - return $text; -} - -?> \ No newline at end of file diff --git a/panels/mensaPlan/mensaParser.php b/panels/mensaPlan/mensaParser.php deleted file mode 100755 index 9519dbfeb8c5691a3bf982d3ffd7724dc544ba3d..0000000000000000000000000000000000000000 --- a/panels/mensaPlan/mensaParser.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php -require 'config.php'; -require 'simple_html_dom.php'; -require 'helper.php'; -require 'gericht.php'; -require 'tag.php'; - -// Parse -$html = file_get_html ( $MENSA_URL ); -if ($html != null) { - $tage = array (); - foreach ( $PARSE_DAYLIST as $DAYNAME ) { - array_push ( $tage, parsDay ( $html, $DAYNAME ) ); - } - - // CREATE JSON - toJson ( $tage, $JSON_NAME, $JSON_INC_NR, $JSON_INC_ORIGINAL, $JSON_INC_SHORT, $JSON_INC_ART, $JSON_INC_KIND, $JSON_INC_STOFFE, $JSON_INC_COUNTER, $JSON_INC_DATE ); -} else { - echo "Webseite nicht erreichbar."; -} -?> \ No newline at end of file diff --git a/panels/mensaPlan/script.js b/panels/mensaPlan/script.js index 010bd982a136475c5676b1f2d83b15db381c1ee5..f6f81d93d74d640dbbc7d68efe539670b49052c3 100755 --- a/panels/mensaPlan/script.js +++ b/panels/mensaPlan/script.js @@ -1,7 +1,7 @@ this.tabtime=20; this.checkShowCondition = function() { - return 3*this.tabtime; + return 4*this.tabtime; } this.show = function() { @@ -16,6 +16,9 @@ this.show = function() { currentTab = 2; break; case 2: + currentTab = 3; + break; + case 3: currentTab = 0; break; default: @@ -32,6 +35,48 @@ this.hide = function() { clearInterval(this.interval); } +function padTwo(num) { + if (num < 10) { + return "0" + num + } else { + return num + } +} + +function isNextDay() { + if (new Date().getHours() >= 15) { + return true; + } +} + +function calcDateAPI() { + if (isNextDay) { + return new Date().getFullYear() + "-" + padTwo(new Date().getMonth()+1) + "-" + (padTwo(new Date().getDate() + 1)); + } else { + return new Date().getFullYear() + "-" + padTwo(new Date().getMonth()+1) + "-" + padTwo(new Date().getDate()); + } +} + +function calcTextDisplay() { + if (isNextDay) { + return "Mensaplan von MORGEN, dem " + (padTwo(new Date().getDate() + 1)) +"."+ padTwo(new Date().getMonth()+1) +"."+ new Date().getFullYear(); + } else { + return "Mensaplan von HEUTE, dem " + padTwo(new Date().getDate()) +"."+ padTwo(new Date().getMonth()+1) +"."+ new Date().getFullYear(); + } +} + +function handleGericht(text) { + text = text.replace(/\([^\)]*\)/g, ""); // remove zusatzstoffe + text = text.replace(/\s+/g, " "); // fix double Whitespace + text = text.replace(/(\s,|,\s)/g, ","); // fix Komma + text = text.replace(/,/g, ", "); // fix Komma + text = text.replace(/,\sdazu\s\d\sBeilagen\snach\sWahl/g, " "); // remove Beilagen + text = text.replace(/\sund\s\d\sBeilagen\snach\sWahl/g, " "); // remove Beilagen + text = text.replace(/,\sdazu\s/g, " + "); // replace dazu + text = text.replace(/\sund\s/g, " & "); // replace und + return text +} + this.loaded = function(panel, config) { // reload data setInterval(function() { @@ -39,7 +84,7 @@ this.loaded = function(panel, config) { }, 30*60*1000); function getMensaPlan() { - $.getJSON("tmp/mensaPlan.json?"+( new Date().getTime()) ).done(function(json) { + $.getJSON("https://mobil.itmc.tu-dortmund.de/canteen-menu/v1/canteens/341/"+calcDateAPI()).done(function(json) { fillTable(json); }).fail(function(jqxhr, textStatus, error) { var err = textStatus + ", " + error; @@ -48,95 +93,88 @@ this.loaded = function(panel, config) { } function fillTable(json) { - var date = new Date(); - var next = 0; - if (date.getHours() >= 15) { - next = 1; - } - switch (date.getDay() + next) { - case 0: - var day = json.montag; - break; - case 1: - var day = json.montag; - break; - case 2: - var day = json.dienstag; - break; - case 3: - var day = json.mittwoch; - break; - case 4: - var day = json.donnerstag; - break; - case 5: - var day = json.freitag; - break; - case 6: - var day = json.montag; - break; - case 7: - var day = json.montag; - break; - } - if (next) { - document.getElementById("mensaPlanTitleBar").innerHTML = "Mensaplan von MORGEN, dem " - + day[0].date; - } else { - document.getElementById("mensaPlanTitleBar").innerHTML = "Mensaplan von HEUTE, dem " - + day[0].date; - } + document.getElementById("mensaPlanTitleBar").innerHTML = calcTextDisplay(); var tableBody1 = document.getElementById("mensaPlanTable1Body"); var tableBody2 = document.getElementById("mensaPlanTable2Body"); var tableBody3 = document.getElementById("mensaPlanTable3Body"); + var tableBody4 = document.getElementById("mensaPlanTable4Body"); tableBody1.innerHTML = ""; // clear tableBody2.innerHTML = ""; // clear tableBody3.innerHTML = ""; // clear + tableBody4.innerHTML = ""; // clear var a = 0; var b = 0; var c = 0; - for (var i = 0; i < day.length; i++) { - var gericht = day[i]; + var d = 0; + for (var i = 0; i < json.length; i++) { + var gericht = json[i]; var row = ""; - switch (gericht.counter) { - case 1: + switch (gericht.category) { + case "1": // Menu 1 var row = tableBody1.insertRow(a); a++; + var cell = row.insertCell(0); + cell.innerHTML = handleGericht(gericht.title.de); break; - case 2: + case "2": // Menu 2 var row = tableBody1.insertRow(a); a++; + var cell = row.insertCell(0); + cell.innerHTML = handleGericht(gericht.title.de); break; - case 3: + case "3": // Tagesgericht var row = tableBody1.insertRow(a); a++; + var cell = row.insertCell(0); + cell.innerHTML = handleGericht(gericht.title.de); break; - case 4: + case "4": // Vegetarisch var row = tableBody3.insertRow(c); c++; + var cell = row.insertCell(0); + cell.innerHTML = handleGericht(gericht.title.de); break; - case 5: + case "5": // Aktionsteller var row = tableBody1.insertRow(a); a++; + var cell = row.insertCell(0); + cell.innerHTML = handleGericht(gericht.title.de); break; - case 6: - var row = tableBody2.insertRow(b); - b++; + case "6": // Aktionsteller Fisch + var row = tableBody3.insertRow(c); + c++; + var cell = row.insertCell(0); + cell.innerHTML = handleGericht(gericht.title.de); break; - case 7: + case "7": // Aktionsteller Vegan var row = tableBody3.insertRow(c); c++; + var cell = row.insertCell(0); + cell.innerHTML = handleGericht(gericht.title.de); break; - case 8: - var row = tableBody3.insertRow(c); - c++; + case "8": // Grillstation + var row = tableBody2.insertRow(b); + b++; + var cell = row.insertCell(0); + cell.innerHTML = handleGericht(gericht.title.de); + break; + case "16": // Beilagen + var beilagen = gericht.title.de.split(";"); + for (var j = 0; j < beilagen.length; j++) { + if(beilagen[j] != "") { + var row = tableBody4.insertRow(d); + d++; + var cell = row.insertCell(0); + cell.innerHTML = handleGericht(beilagen[j]); + } + } break; default: var row = tableBody3.insertRow(c); c++; + var cell = row.insertCell(0); + cell.innerHTML = handleGericht(gericht.title.de); } - var cell1 = row.insertCell(0); - cell1.innerHTML = gericht.shortText; } } diff --git a/panels/mensaPlan/simple_html_dom.php b/panels/mensaPlan/simple_html_dom.php deleted file mode 100755 index 93884dd8a395203cc6f2e20349b9127bd264de52..0000000000000000000000000000000000000000 --- a/panels/mensaPlan/simple_html_dom.php +++ /dev/null @@ -1,1742 +0,0 @@ -<?php -/** - * Website: http://sourceforge.net/projects/simplehtmldom/ - * Additional projects that may be used: http://sourceforge.net/projects/debugobject/ - * Acknowledge: Jose Solorzano (https://sourceforge.net/projects/php-html/) - * Contributions by: - * Yousuke Kumakura (Attribute filters) - * Vadim Voituk (Negative indexes supports of "find" method) - * Antcs (Constructor with automatically load contents either text or file/url) - * - * all affected sections have comments starting with "PaperG" - * - * Paperg - Added case insensitive testing of the value of the selector. - * Paperg - Added tag_start for the starting index of tags - NOTE: This works but not accurately. - * This tag_start gets counted AFTER \r\n have been crushed out, and after the remove_noice calls so it will not reflect the REAL position of the tag in the source, - * it will almost always be smaller by some amount. - * We use this to determine how far into the file the tag in question is. This "percentage will never be accurate as the $dom->size is the "real" number of bytes the dom was created from. - * but for most purposes, it's a really good estimation. - * Paperg - Added the forceTagsClosed to the dom constructor. Forcing tags closed is great for malformed html, but it CAN lead to parsing errors. - * Allow the user to tell us how much they trust the html. - * Paperg add the text and plaintext to the selectors for the find syntax. plaintext implies text in the innertext of a node. text implies that the tag is a text node. - * This allows for us to find tags based on the text they contain. - * Create find_ancestor_tag to see if a tag is - at any level - inside of another specific tag. - * Paperg: added parse_charset so that we know about the character set of the source document. - * NOTE: If the user's system has a routine called get_last_retrieve_url_contents_content_type availalbe, we will assume it's returning the content-type header from the - * last transfer or curl_exec, and we will parse that and use it in preference to any other method of charset detection. - * - * Found infinite loop in the case of broken html in restore_noise. Rewrote to protect from that. - * PaperG (John Schlick) Added get_display_size for "IMG" tags. - * - * Licensed under The MIT License - * Redistributions of files must retain the above copyright notice. - * - * @author S.C. Chen <me578022@gmail.com> - * @author John Schlick - * @author Rus Carroll - * @version 1.5 ($Rev: 210 $) - * @package PlaceLocalInclude - * @subpackage simple_html_dom - */ - -/** - * All of the Defines for the classes below. - * @author S.C. Chen <me578022@gmail.com> - */ -define('HDOM_TYPE_ELEMENT', 1); -define('HDOM_TYPE_COMMENT', 2); -define('HDOM_TYPE_TEXT', 3); -define('HDOM_TYPE_ENDTAG', 4); -define('HDOM_TYPE_ROOT', 5); -define('HDOM_TYPE_UNKNOWN', 6); -define('HDOM_QUOTE_DOUBLE', 0); -define('HDOM_QUOTE_SINGLE', 1); -define('HDOM_QUOTE_NO', 3); -define('HDOM_INFO_BEGIN', 0); -define('HDOM_INFO_END', 1); -define('HDOM_INFO_QUOTE', 2); -define('HDOM_INFO_SPACE', 3); -define('HDOM_INFO_TEXT', 4); -define('HDOM_INFO_INNER', 5); -define('HDOM_INFO_OUTER', 6); -define('HDOM_INFO_ENDSPACE',7); -define('DEFAULT_TARGET_CHARSET', 'UTF-8'); -define('DEFAULT_BR_TEXT', "\r\n"); -define('DEFAULT_SPAN_TEXT', " "); -define('MAX_FILE_SIZE', 600000); -// helper functions -// ----------------------------------------------------------------------------- -// get html dom from file -// $maxlen is defined in the code as PHP_STREAM_COPY_ALL which is defined as -1. -function file_get_html($url, $use_include_path = false, $context=null, $offset = -1, $maxLen=-1, $lowercase = true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT) -{ - // We DO force the tags to be terminated. - $dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText); - // For sourceforge users: uncomment the next line and comment the retreive_url_contents line 2 lines down if it is not already done. - $contents = file_get_contents($url, $use_include_path, $context, $offset); - // Paperg - use our own mechanism for getting the contents as we want to control the timeout. - //$contents = retrieve_url_contents($url); - if (empty($contents) || strlen($contents) > MAX_FILE_SIZE) - { - return false; - } - // The second parameter can force the selectors to all be lowercase. - $dom->load($contents, $lowercase, $stripRN); - return $dom; -} - -// get html dom from string -function str_get_html($str, $lowercase=true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT) -{ - $dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText); - if (empty($str) || strlen($str) > MAX_FILE_SIZE) - { - $dom->clear(); - return false; - } - $dom->load($str, $lowercase, $stripRN); - return $dom; -} - -// dump html dom tree -function dump_html_tree($node, $show_attr=true, $deep=0) -{ - $node->dump($node); -} - - -/** - * simple html dom node - * PaperG - added ability for "find" routine to lowercase the value of the selector. - * PaperG - added $tag_start to track the start position of the tag in the total byte index - * - * @package PlaceLocalInclude - */ -class simple_html_dom_node -{ - public $nodetype = HDOM_TYPE_TEXT; - public $tag = 'text'; - public $attr = array(); - public $children = array(); - public $nodes = array(); - public $parent = null; - // The "info" array - see HDOM_INFO_... for what each element contains. - public $_ = array(); - public $tag_start = 0; - private $dom = null; - - function __construct($dom) - { - $this->dom = $dom; - $dom->nodes[] = $this; - } - - function __destruct() - { - $this->clear(); - } - - function __toString() - { - return $this->outertext(); - } - - // clean up memory due to php5 circular references memory leak... - function clear() - { - $this->dom = null; - $this->nodes = null; - $this->parent = null; - $this->children = null; - } - - // dump node's tree - function dump($show_attr=true, $deep=0) - { - $lead = str_repeat(' ', $deep); - - echo $lead.$this->tag; - if ($show_attr && count($this->attr)>0) - { - echo '('; - foreach ($this->attr as $k=>$v) - echo "[$k]=>\"".$this->$k.'", '; - echo ')'; - } - echo "\n"; - - if ($this->nodes) - { - foreach ($this->nodes as $c) - { - $c->dump($show_attr, $deep+1); - } - } - } - - - // Debugging function to dump a single dom node with a bunch of information about it. - function dump_node($echo=true) - { - - $string = $this->tag; - if (count($this->attr)>0) - { - $string .= '('; - foreach ($this->attr as $k=>$v) - { - $string .= "[$k]=>\"".$this->$k.'", '; - } - $string .= ')'; - } - if (count($this->_)>0) - { - $string .= ' $_ ('; - foreach ($this->_ as $k=>$v) - { - if (is_array($v)) - { - $string .= "[$k]=>("; - foreach ($v as $k2=>$v2) - { - $string .= "[$k2]=>\"".$v2.'", '; - } - $string .= ")"; - } else { - $string .= "[$k]=>\"".$v.'", '; - } - } - $string .= ")"; - } - - if (isset($this->text)) - { - $string .= " text: (" . $this->text . ")"; - } - - $string .= " HDOM_INNER_INFO: '"; - if (isset($node->_[HDOM_INFO_INNER])) - { - $string .= $node->_[HDOM_INFO_INNER] . "'"; - } - else - { - $string .= ' NULL '; - } - - $string .= " children: " . count($this->children); - $string .= " nodes: " . count($this->nodes); - $string .= " tag_start: " . $this->tag_start; - $string .= "\n"; - - if ($echo) - { - echo $string; - return; - } - else - { - return $string; - } - } - - // returns the parent of node - // If a node is passed in, it will reset the parent of the current node to that one. - function parent($parent=null) - { - // I am SURE that this doesn't work properly. - // It fails to unset the current node from it's current parents nodes or children list first. - if ($parent !== null) - { - $this->parent = $parent; - $this->parent->nodes[] = $this; - $this->parent->children[] = $this; - } - - return $this->parent; - } - - // verify that node has children - function has_child() - { - return !empty($this->children); - } - - // returns children of node - function children($idx=-1) - { - if ($idx===-1) - { - return $this->children; - } - if (isset($this->children[$idx])) - { - return $this->children[$idx]; - } - return null; - } - - // returns the first child of node - function first_child() - { - if (count($this->children)>0) - { - return $this->children[0]; - } - return null; - } - - // returns the last child of node - function last_child() - { - if (($count=count($this->children))>0) - { - return $this->children[$count-1]; - } - return null; - } - - // returns the next sibling of node - function next_sibling() - { - if ($this->parent===null) - { - return null; - } - - $idx = 0; - $count = count($this->parent->children); - while ($idx<$count && $this!==$this->parent->children[$idx]) - { - ++$idx; - } - if (++$idx>=$count) - { - return null; - } - return $this->parent->children[$idx]; - } - - // returns the previous sibling of node - function prev_sibling() - { - if ($this->parent===null) return null; - $idx = 0; - $count = count($this->parent->children); - while ($idx<$count && $this!==$this->parent->children[$idx]) - ++$idx; - if (--$idx<0) return null; - return $this->parent->children[$idx]; - } - - // function to locate a specific ancestor tag in the path to the root. - function find_ancestor_tag($tag) - { - global $debug_object; - if (is_object($debug_object)) { $debug_object->debug_log_entry(1); } - - // Start by including ourselves in the comparison. - $returnDom = $this; - - while (!is_null($returnDom)) - { - if (is_object($debug_object)) { $debug_object->debug_log(2, "Current tag is: " . $returnDom->tag); } - - if ($returnDom->tag == $tag) - { - break; - } - $returnDom = $returnDom->parent; - } - return $returnDom; - } - - // get dom node's inner html - function innertext() - { - if (isset($this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER]; - if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); - - $ret = ''; - foreach ($this->nodes as $n) - $ret .= $n->outertext(); - return $ret; - } - - // get dom node's outer text (with tag) - function outertext() - { - global $debug_object; - if (is_object($debug_object)) - { - $text = ''; - if ($this->tag == 'text') - { - if (!empty($this->text)) - { - $text = " with text: " . $this->text; - } - } - $debug_object->debug_log(1, 'Innertext of tag: ' . $this->tag . $text); - } - - if ($this->tag==='root') return $this->innertext(); - - // trigger callback - if ($this->dom && $this->dom->callback!==null) - { - call_user_func_array($this->dom->callback, array($this)); - } - - if (isset($this->_[HDOM_INFO_OUTER])) return $this->_[HDOM_INFO_OUTER]; - if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); - - // render begin tag - if ($this->dom && $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]]) - { - $ret = $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]]->makeup(); - } else { - $ret = ""; - } - - // render inner text - if (isset($this->_[HDOM_INFO_INNER])) - { - // If it's a br tag... don't return the HDOM_INNER_INFO that we may or may not have added. - if ($this->tag != "br") - { - $ret .= $this->_[HDOM_INFO_INNER]; - } - } else { - if ($this->nodes) - { - foreach ($this->nodes as $n) - { - $ret .= $this->convert_text($n->outertext()); - } - } - } - - // render end tag - if (isset($this->_[HDOM_INFO_END]) && $this->_[HDOM_INFO_END]!=0) - $ret .= '</'.$this->tag.'>'; - return $ret; - } - - // get dom node's plain text - function text() - { - if (isset($this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER]; - switch ($this->nodetype) - { - case HDOM_TYPE_TEXT: return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); - case HDOM_TYPE_COMMENT: return ''; - case HDOM_TYPE_UNKNOWN: return ''; - } - if (strcasecmp($this->tag, 'script')===0) return ''; - if (strcasecmp($this->tag, 'style')===0) return ''; - - $ret = ''; - // In rare cases, (always node type 1 or HDOM_TYPE_ELEMENT - observed for some span tags, and some p tags) $this->nodes is set to NULL. - // NOTE: This indicates that there is a problem where it's set to NULL without a clear happening. - // WHY is this happening? - if (!is_null($this->nodes)) - { - foreach ($this->nodes as $n) - { - $ret .= $this->convert_text($n->text()); - } - - // If this node is a span... add a space at the end of it so multiple spans don't run into each other. This is plaintext after all. - if ($this->tag == "span") - { - $ret .= $this->dom->default_span_text; - } - - - } - return $ret; - } - - function xmltext() - { - $ret = $this->innertext(); - $ret = str_ireplace('<![CDATA[', '', $ret); - $ret = str_replace(']]>', '', $ret); - return $ret; - } - - // build node's text with tag - function makeup() - { - // text, comment, unknown - if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); - - $ret = '<'.$this->tag; - $i = -1; - - foreach ($this->attr as $key=>$val) - { - ++$i; - - // skip removed attribute - if ($val===null || $val===false) - continue; - - $ret .= $this->_[HDOM_INFO_SPACE][$i][0]; - //no value attr: nowrap, checked selected... - if ($val===true) - $ret .= $key; - else { - switch ($this->_[HDOM_INFO_QUOTE][$i]) - { - case HDOM_QUOTE_DOUBLE: $quote = '"'; break; - case HDOM_QUOTE_SINGLE: $quote = '\''; break; - default: $quote = ''; - } - $ret .= $key.$this->_[HDOM_INFO_SPACE][$i][1].'='.$this->_[HDOM_INFO_SPACE][$i][2].$quote.$val.$quote; - } - } - $ret = $this->dom->restore_noise($ret); - return $ret . $this->_[HDOM_INFO_ENDSPACE] . '>'; - } - - // find elements by css selector - //PaperG - added ability for find to lowercase the value of the selector. - function find($selector, $idx=null, $lowercase=false) - { - $selectors = $this->parse_selector($selector); - if (($count=count($selectors))===0) return array(); - $found_keys = array(); - - // find each selector - for ($c=0; $c<$count; ++$c) - { - // The change on the below line was documented on the sourceforge code tracker id 2788009 - // used to be: if (($levle=count($selectors[0]))===0) return array(); - if (($levle=count($selectors[$c]))===0) return array(); - if (!isset($this->_[HDOM_INFO_BEGIN])) return array(); - - $head = array($this->_[HDOM_INFO_BEGIN]=>1); - - // handle descendant selectors, no recursive! - for ($l=0; $l<$levle; ++$l) - { - $ret = array(); - foreach ($head as $k=>$v) - { - $n = ($k===-1) ? $this->dom->root : $this->dom->nodes[$k]; - //PaperG - Pass this optional parameter on to the seek function. - $n->seek($selectors[$c][$l], $ret, $lowercase); - } - $head = $ret; - } - - foreach ($head as $k=>$v) - { - if (!isset($found_keys[$k])) - { - $found_keys[$k] = 1; - } - } - } - - // sort keys - ksort($found_keys); - - $found = array(); - foreach ($found_keys as $k=>$v) - $found[] = $this->dom->nodes[$k]; - - // return nth-element or array - if (is_null($idx)) return $found; - else if ($idx<0) $idx = count($found) + $idx; - return (isset($found[$idx])) ? $found[$idx] : null; - } - - // seek for given conditions - // PaperG - added parameter to allow for case insensitive testing of the value of a selector. - protected function seek($selector, &$ret, $lowercase=false) - { - global $debug_object; - if (is_object($debug_object)) { $debug_object->debug_log_entry(1); } - - list($tag, $key, $val, $exp, $no_key) = $selector; - - // xpath index - if ($tag && $key && is_numeric($key)) - { - $count = 0; - foreach ($this->children as $c) - { - if ($tag==='*' || $tag===$c->tag) { - if (++$count==$key) { - $ret[$c->_[HDOM_INFO_BEGIN]] = 1; - return; - } - } - } - return; - } - - $end = (!empty($this->_[HDOM_INFO_END])) ? $this->_[HDOM_INFO_END] : 0; - if ($end==0) { - $parent = $this->parent; - while (!isset($parent->_[HDOM_INFO_END]) && $parent!==null) { - $end -= 1; - $parent = $parent->parent; - } - $end += $parent->_[HDOM_INFO_END]; - } - - for ($i=$this->_[HDOM_INFO_BEGIN]+1; $i<$end; ++$i) { - $node = $this->dom->nodes[$i]; - - $pass = true; - - if ($tag==='*' && !$key) { - if (in_array($node, $this->children, true)) - $ret[$i] = 1; - continue; - } - - // compare tag - if ($tag && $tag!=$node->tag && $tag!=='*') {$pass=false;} - // compare key - if ($pass && $key) { - if ($no_key) { - if (isset($node->attr[$key])) $pass=false; - } else { - if (($key != "plaintext") && !isset($node->attr[$key])) $pass=false; - } - } - // compare value - if ($pass && $key && $val && $val!=='*') { - // If they have told us that this is a "plaintext" search then we want the plaintext of the node - right? - if ($key == "plaintext") { - // $node->plaintext actually returns $node->text(); - $nodeKeyValue = $node->text(); - } else { - // this is a normal search, we want the value of that attribute of the tag. - $nodeKeyValue = $node->attr[$key]; - } - if (is_object($debug_object)) {$debug_object->debug_log(2, "testing node: " . $node->tag . " for attribute: " . $key . $exp . $val . " where nodes value is: " . $nodeKeyValue);} - - //PaperG - If lowercase is set, do a case insensitive test of the value of the selector. - if ($lowercase) { - $check = $this->match($exp, strtolower($val), strtolower($nodeKeyValue)); - } else { - $check = $this->match($exp, $val, $nodeKeyValue); - } - if (is_object($debug_object)) {$debug_object->debug_log(2, "after match: " . ($check ? "true" : "false"));} - - // handle multiple class - if (!$check && strcasecmp($key, 'class')===0) { - foreach (explode(' ',$node->attr[$key]) as $k) { - // Without this, there were cases where leading, trailing, or double spaces lead to our comparing blanks - bad form. - if (!empty($k)) { - if ($lowercase) { - $check = $this->match($exp, strtolower($val), strtolower($k)); - } else { - $check = $this->match($exp, $val, $k); - } - if ($check) break; - } - } - } - if (!$check) $pass = false; - } - if ($pass) $ret[$i] = 1; - unset($node); - } - // It's passed by reference so this is actually what this function returns. - if (is_object($debug_object)) {$debug_object->debug_log(1, "EXIT - ret: ", $ret);} - } - - protected function match($exp, $pattern, $value) { - global $debug_object; - if (is_object($debug_object)) {$debug_object->debug_log_entry(1);} - - switch ($exp) { - case '=': - return ($value===$pattern); - case '!=': - return ($value!==$pattern); - case '^=': - return preg_match("/^".preg_quote($pattern,'/')."/", $value); - case '$=': - return preg_match("/".preg_quote($pattern,'/')."$/", $value); - case '*=': - if ($pattern[0]=='/') { - return preg_match($pattern, $value); - } - return preg_match("/".$pattern."/i", $value); - } - return false; - } - - protected function parse_selector($selector_string) { - global $debug_object; - if (is_object($debug_object)) {$debug_object->debug_log_entry(1);} - - // pattern of CSS selectors, modified from mootools - // Paperg: Add the colon to the attrbute, so that it properly finds <tag attr:ibute="something" > like google does. - // Note: if you try to look at this attribute, yo MUST use getAttribute since $dom->x:y will fail the php syntax check. -// Notice the \[ starting the attbute? and the @? following? This implies that an attribute can begin with an @ sign that is not captured. -// This implies that an html attribute specifier may start with an @ sign that is NOT captured by the expression. -// farther study is required to determine of this should be documented or removed. -// $pattern = "/([\w-:\*]*)(?:\#([\w-]+)|\.([\w-]+))?(?:\[@?(!?[\w-]+)(?:([!*^$]?=)[\"']?(.*?)[\"']?)?\])?([\/, ]+)/is"; - $pattern = "/([\w-:\*]*)(?:\#([\w-]+)|\.([\w-]+))?(?:\[@?(!?[\w-:]+)(?:([!*^$]?=)[\"']?(.*?)[\"']?)?\])?([\/, ]+)/is"; - preg_match_all($pattern, trim($selector_string).' ', $matches, PREG_SET_ORDER); - if (is_object($debug_object)) {$debug_object->debug_log(2, "Matches Array: ", $matches);} - - $selectors = array(); - $result = array(); - //print_r($matches); - - foreach ($matches as $m) { - $m[0] = trim($m[0]); - if ($m[0]==='' || $m[0]==='/' || $m[0]==='//') continue; - // for browser generated xpath - if ($m[1]==='tbody') continue; - - list($tag, $key, $val, $exp, $no_key) = array($m[1], null, null, '=', false); - if (!empty($m[2])) {$key='id'; $val=$m[2];} - if (!empty($m[3])) {$key='class'; $val=$m[3];} - if (!empty($m[4])) {$key=$m[4];} - if (!empty($m[5])) {$exp=$m[5];} - if (!empty($m[6])) {$val=$m[6];} - - // convert to lowercase - if ($this->dom->lowercase) {$tag=strtolower($tag); $key=strtolower($key);} - //elements that do NOT have the specified attribute - if (isset($key[0]) && $key[0]==='!') {$key=substr($key, 1); $no_key=true;} - - $result[] = array($tag, $key, $val, $exp, $no_key); - if (trim($m[7])===',') { - $selectors[] = $result; - $result = array(); - } - } - if (count($result)>0) - $selectors[] = $result; - return $selectors; - } - - function __get($name) - { - if (isset($this->attr[$name])) - { - return $this->convert_text($this->attr[$name]); - } - switch ($name) - { - case 'outertext': return $this->outertext(); - case 'innertext': return $this->innertext(); - case 'plaintext': return $this->text(); - case 'xmltext': return $this->xmltext(); - default: return array_key_exists($name, $this->attr); - } - } - - function __set($name, $value) - { - global $debug_object; - if (is_object($debug_object)) {$debug_object->debug_log_entry(1);} - - switch ($name) - { - case 'outertext': return $this->_[HDOM_INFO_OUTER] = $value; - case 'innertext': - if (isset($this->_[HDOM_INFO_TEXT])) return $this->_[HDOM_INFO_TEXT] = $value; - return $this->_[HDOM_INFO_INNER] = $value; - } - if (!isset($this->attr[$name])) - { - $this->_[HDOM_INFO_SPACE][] = array(' ', '', ''); - $this->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE; - } - $this->attr[$name] = $value; - } - - function __isset($name) - { - switch ($name) - { - case 'outertext': return true; - case 'innertext': return true; - case 'plaintext': return true; - } - //no value attr: nowrap, checked selected... - return (array_key_exists($name, $this->attr)) ? true : isset($this->attr[$name]); - } - - function __unset($name) { - if (isset($this->attr[$name])) - unset($this->attr[$name]); - } - - // PaperG - Function to convert the text from one character set to another if the two sets are not the same. - function convert_text($text) - { - global $debug_object; - if (is_object($debug_object)) {$debug_object->debug_log_entry(1);} - - $converted_text = $text; - - $sourceCharset = ""; - $targetCharset = ""; - - if ($this->dom) - { - $sourceCharset = strtoupper($this->dom->_charset); - $targetCharset = strtoupper($this->dom->_target_charset); - } - if (is_object($debug_object)) {$debug_object->debug_log(3, "source charset: " . $sourceCharset . " target charaset: " . $targetCharset);} - - if (!empty($sourceCharset) && !empty($targetCharset) && (strcasecmp($sourceCharset, $targetCharset) != 0)) - { - // Check if the reported encoding could have been incorrect and the text is actually already UTF-8 - if ((strcasecmp($targetCharset, 'UTF-8') == 0) && ($this->is_utf8($text))) - { - $converted_text = $text; - } - else - { - $converted_text = iconv($sourceCharset, $targetCharset, $text); - } - } - - // Lets make sure that we don't have that silly BOM issue with any of the utf-8 text we output. - if ($targetCharset == 'UTF-8') - { - if (substr($converted_text, 0, 3) == "\xef\xbb\xbf") - { - $converted_text = substr($converted_text, 3); - } - if (substr($converted_text, -3) == "\xef\xbb\xbf") - { - $converted_text = substr($converted_text, 0, -3); - } - } - - return $converted_text; - } - - /** - * Returns true if $string is valid UTF-8 and false otherwise. - * - * @param mixed $str String to be tested - * @return boolean - */ - static function is_utf8($str) - { - $c=0; $b=0; - $bits=0; - $len=strlen($str); - for($i=0; $i<$len; $i++) - { - $c=ord($str[$i]); - if($c > 128) - { - if(($c >= 254)) return false; - elseif($c >= 252) $bits=6; - elseif($c >= 248) $bits=5; - elseif($c >= 240) $bits=4; - elseif($c >= 224) $bits=3; - elseif($c >= 192) $bits=2; - else return false; - if(($i+$bits) > $len) return false; - while($bits > 1) - { - $i++; - $b=ord($str[$i]); - if($b < 128 || $b > 191) return false; - $bits--; - } - } - } - return true; - } - /* - function is_utf8($string) - { - //this is buggy - return (utf8_encode(utf8_decode($string)) == $string); - } - */ - - /** - * Function to try a few tricks to determine the displayed size of an img on the page. - * NOTE: This will ONLY work on an IMG tag. Returns FALSE on all other tag types. - * - * @author John Schlick - * @version April 19 2012 - * @return array an array containing the 'height' and 'width' of the image on the page or -1 if we can't figure it out. - */ - function get_display_size() - { - global $debug_object; - - $width = -1; - $height = -1; - - if ($this->tag !== 'img') - { - return false; - } - - // See if there is aheight or width attribute in the tag itself. - if (isset($this->attr['width'])) - { - $width = $this->attr['width']; - } - - if (isset($this->attr['height'])) - { - $height = $this->attr['height']; - } - - // Now look for an inline style. - if (isset($this->attr['style'])) - { - // Thanks to user gnarf from stackoverflow for this regular expression. - $attributes = array(); - preg_match_all("/([\w-]+)\s*:\s*([^;]+)\s*;?/", $this->attr['style'], $matches, PREG_SET_ORDER); - foreach ($matches as $match) { - $attributes[$match[1]] = $match[2]; - } - - // If there is a width in the style attributes: - if (isset($attributes['width']) && $width == -1) - { - // check that the last two characters are px (pixels) - if (strtolower(substr($attributes['width'], -2)) == 'px') - { - $proposed_width = substr($attributes['width'], 0, -2); - // Now make sure that it's an integer and not something stupid. - if (filter_var($proposed_width, FILTER_VALIDATE_INT)) - { - $width = $proposed_width; - } - } - } - - // If there is a width in the style attributes: - if (isset($attributes['height']) && $height == -1) - { - // check that the last two characters are px (pixels) - if (strtolower(substr($attributes['height'], -2)) == 'px') - { - $proposed_height = substr($attributes['height'], 0, -2); - // Now make sure that it's an integer and not something stupid. - if (filter_var($proposed_height, FILTER_VALIDATE_INT)) - { - $height = $proposed_height; - } - } - } - - } - - // Future enhancement: - // Look in the tag to see if there is a class or id specified that has a height or width attribute to it. - - // Far future enhancement - // Look at all the parent tags of this image to see if they specify a class or id that has an img selector that specifies a height or width - // Note that in this case, the class or id will have the img subselector for it to apply to the image. - - // ridiculously far future development - // If the class or id is specified in a SEPARATE css file thats not on the page, go get it and do what we were just doing for the ones on the page. - - $result = array('height' => $height, - 'width' => $width); - return $result; - } - - // camel naming conventions - function getAllAttributes() {return $this->attr;} - function getAttribute($name) {return $this->__get($name);} - function setAttribute($name, $value) {$this->__set($name, $value);} - function hasAttribute($name) {return $this->__isset($name);} - function removeAttribute($name) {$this->__set($name, null);} - function getElementById($id) {return $this->find("#$id", 0);} - function getElementsById($id, $idx=null) {return $this->find("#$id", $idx);} - function getElementByTagName($name) {return $this->find($name, 0);} - function getElementsByTagName($name, $idx=null) {return $this->find($name, $idx);} - function parentNode() {return $this->parent();} - function childNodes($idx=-1) {return $this->children($idx);} - function firstChild() {return $this->first_child();} - function lastChild() {return $this->last_child();} - function nextSibling() {return $this->next_sibling();} - function previousSibling() {return $this->prev_sibling();} - function hasChildNodes() {return $this->has_child();} - function nodeName() {return $this->tag;} - function appendChild($node) {$node->parent($this); return $node;} - -} - -/** - * simple html dom parser - * Paperg - in the find routine: allow us to specify that we want case insensitive testing of the value of the selector. - * Paperg - change $size from protected to public so we can easily access it - * Paperg - added ForceTagsClosed in the constructor which tells us whether we trust the html or not. Default is to NOT trust it. - * - * @package PlaceLocalInclude - */ -class simple_html_dom -{ - public $root = null; - public $nodes = array(); - public $callback = null; - public $lowercase = false; - // Used to keep track of how large the text was when we started. - public $original_size; - public $size; - protected $pos; - protected $doc; - protected $char; - protected $cursor; - protected $parent; - protected $noise = array(); - protected $token_blank = " \t\r\n"; - protected $token_equal = ' =/>'; - protected $token_slash = " />\r\n\t"; - protected $token_attr = ' >'; - // Note that this is referenced by a child node, and so it needs to be public for that node to see this information. - public $_charset = ''; - public $_target_charset = ''; - protected $default_br_text = ""; - public $default_span_text = ""; - - // use isset instead of in_array, performance boost about 30%... - protected $self_closing_tags = array('img'=>1, 'br'=>1, 'input'=>1, 'meta'=>1, 'link'=>1, 'hr'=>1, 'base'=>1, 'embed'=>1, 'spacer'=>1); - protected $block_tags = array('root'=>1, 'body'=>1, 'form'=>1, 'div'=>1, 'span'=>1, 'table'=>1); - // Known sourceforge issue #2977341 - // B tags that are not closed cause us to return everything to the end of the document. - protected $optional_closing_tags = array( - 'tr'=>array('tr'=>1, 'td'=>1, 'th'=>1), - 'th'=>array('th'=>1), - 'td'=>array('td'=>1), - 'li'=>array('li'=>1), - 'dt'=>array('dt'=>1, 'dd'=>1), - 'dd'=>array('dd'=>1, 'dt'=>1), - 'dl'=>array('dd'=>1, 'dt'=>1), - 'p'=>array('p'=>1), - 'nobr'=>array('nobr'=>1), - 'b'=>array('b'=>1), - 'option'=>array('option'=>1), - ); - - function __construct($str=null, $lowercase=true, $forceTagsClosed=true, $target_charset=DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT) - { - if ($str) - { - if (preg_match("/^http:\/\//i",$str) || is_file($str)) - { - $this->load_file($str); - } - else - { - $this->load($str, $lowercase, $stripRN, $defaultBRText, $defaultSpanText); - } - } - // Forcing tags to be closed implies that we don't trust the html, but it can lead to parsing errors if we SHOULD trust the html. - if (!$forceTagsClosed) { - $this->optional_closing_array=array(); - } - $this->_target_charset = $target_charset; - } - - function __destruct() - { - $this->clear(); - } - - // load html from string - function load($str, $lowercase=true, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT) - { - global $debug_object; - - // prepare - $this->prepare($str, $lowercase, $stripRN, $defaultBRText, $defaultSpanText); - // strip out cdata - $this->remove_noise("'<!\[CDATA\[(.*?)\]\]>'is", true); - // strip out comments - $this->remove_noise("'<!--(.*?)-->'is"); - // Per sourceforge http://sourceforge.net/tracker/?func=detail&aid=2949097&group_id=218559&atid=1044037 - // Script tags removal now preceeds style tag removal. - // strip out <script> tags - $this->remove_noise("'<\s*script[^>]*[^/]>(.*?)<\s*/\s*script\s*>'is"); - $this->remove_noise("'<\s*script\s*>(.*?)<\s*/\s*script\s*>'is"); - // strip out <style> tags - $this->remove_noise("'<\s*style[^>]*[^/]>(.*?)<\s*/\s*style\s*>'is"); - $this->remove_noise("'<\s*style\s*>(.*?)<\s*/\s*style\s*>'is"); - // strip out preformatted tags - $this->remove_noise("'<\s*(?:code)[^>]*>(.*?)<\s*/\s*(?:code)\s*>'is"); - // strip out server side scripts - $this->remove_noise("'(<\?)(.*?)(\?>)'s", true); - // strip smarty scripts - $this->remove_noise("'(\{\w)(.*?)(\})'s", true); - - // parsing - while ($this->parse()); - // end - $this->root->_[HDOM_INFO_END] = $this->cursor; - $this->parse_charset(); - - // make load function chainable - return $this; - - } - - // load html from file - function load_file() - { - $args = func_get_args(); - $this->load(call_user_func_array('file_get_contents', $args), true); - // Throw an error if we can't properly load the dom. - if (($error=error_get_last())!==null) { - $this->clear(); - return false; - } - } - - // set callback function - function set_callback($function_name) - { - $this->callback = $function_name; - } - - // remove callback function - function remove_callback() - { - $this->callback = null; - } - - // save dom as string - function save($filepath='') - { - $ret = $this->root->innertext(); - if ($filepath!=='') file_put_contents($filepath, $ret, LOCK_EX); - return $ret; - } - - // find dom node by css selector - // Paperg - allow us to specify that we want case insensitive testing of the value of the selector. - function find($selector, $idx=null, $lowercase=false) - { - return $this->root->find($selector, $idx, $lowercase); - } - - // clean up memory due to php5 circular references memory leak... - function clear() - { - foreach ($this->nodes as $n) {$n->clear(); $n = null;} - // This add next line is documented in the sourceforge repository. 2977248 as a fix for ongoing memory leaks that occur even with the use of clear. - if (isset($this->children)) foreach ($this->children as $n) {$n->clear(); $n = null;} - if (isset($this->parent)) {$this->parent->clear(); unset($this->parent);} - if (isset($this->root)) {$this->root->clear(); unset($this->root);} - unset($this->doc); - unset($this->noise); - } - - function dump($show_attr=true) - { - $this->root->dump($show_attr); - } - - // prepare HTML data and init everything - protected function prepare($str, $lowercase=true, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT) - { - $this->clear(); - - // set the length of content before we do anything to it. - $this->size = strlen($str); - // Save the original size of the html that we got in. It might be useful to someone. - $this->original_size = $this->size; - - //before we save the string as the doc... strip out the \r \n's if we are told to. - if ($stripRN) { - $str = str_replace("\r", " ", $str); - $str = str_replace("\n", " ", $str); - - // set the length of content since we have changed it. - $this->size = strlen($str); - } - - $this->doc = $str; - $this->pos = 0; - $this->cursor = 1; - $this->noise = array(); - $this->nodes = array(); - $this->lowercase = $lowercase; - $this->default_br_text = $defaultBRText; - $this->default_span_text = $defaultSpanText; - $this->root = new simple_html_dom_node($this); - $this->root->tag = 'root'; - $this->root->_[HDOM_INFO_BEGIN] = -1; - $this->root->nodetype = HDOM_TYPE_ROOT; - $this->parent = $this->root; - if ($this->size>0) $this->char = $this->doc[0]; - } - - // parse html content - protected function parse() - { - if (($s = $this->copy_until_char('<'))==='') - { - return $this->read_tag(); - } - - // text - $node = new simple_html_dom_node($this); - ++$this->cursor; - $node->_[HDOM_INFO_TEXT] = $s; - $this->link_nodes($node, false); - return true; - } - - // PAPERG - dkchou - added this to try to identify the character set of the page we have just parsed so we know better how to spit it out later. - // NOTE: IF you provide a routine called get_last_retrieve_url_contents_content_type which returns the CURLINFO_CONTENT_TYPE from the last curl_exec - // (or the content_type header from the last transfer), we will parse THAT, and if a charset is specified, we will use it over any other mechanism. - protected function parse_charset() - { - global $debug_object; - - $charset = null; - - if (function_exists('get_last_retrieve_url_contents_content_type')) - { - $contentTypeHeader = get_last_retrieve_url_contents_content_type(); - $success = preg_match('/charset=(.+)/', $contentTypeHeader, $matches); - if ($success) - { - $charset = $matches[1]; - if (is_object($debug_object)) {$debug_object->debug_log(2, 'header content-type found charset of: ' . $charset);} - } - - } - - if (empty($charset)) - { - $el = $this->root->find('meta[http-equiv=Content-Type]',0, true); - if (!empty($el)) - { - $fullvalue = $el->content; - if (is_object($debug_object)) {$debug_object->debug_log(2, 'meta content-type tag found' . $fullvalue);} - - if (!empty($fullvalue)) - { - $success = preg_match('/charset=(.+)/i', $fullvalue, $matches); - if ($success) - { - $charset = $matches[1]; - } - else - { - // If there is a meta tag, and they don't specify the character set, research says that it's typically ISO-8859-1 - if (is_object($debug_object)) {$debug_object->debug_log(2, 'meta content-type tag couldn\'t be parsed. using iso-8859 default.');} - $charset = 'ISO-8859-1'; - } - } - } - } - - // If we couldn't find a charset above, then lets try to detect one based on the text we got... - if (empty($charset)) - { - // Use this in case mb_detect_charset isn't installed/loaded on this machine. - $charset = false; - if (function_exists('mb_detect_encoding')) - { - // Have php try to detect the encoding from the text given to us. - $charset = mb_detect_encoding($this->root->plaintext . "ascii", $encoding_list = array( "UTF-8", "CP1252" ) ); - if (is_object($debug_object)) {$debug_object->debug_log(2, 'mb_detect found: ' . $charset);} - } - - // and if this doesn't work... then we need to just wrongheadedly assume it's UTF-8 so that we can move on - cause this will usually give us most of what we need... - if ($charset === false) - { - if (is_object($debug_object)) {$debug_object->debug_log(2, 'since mb_detect failed - using default of utf-8');} - $charset = 'UTF-8'; - } - } - - // Since CP1252 is a superset, if we get one of it's subsets, we want it instead. - if ((strtolower($charset) == strtolower('ISO-8859-1')) || (strtolower($charset) == strtolower('Latin1')) || (strtolower($charset) == strtolower('Latin-1'))) - { - if (is_object($debug_object)) {$debug_object->debug_log(2, 'replacing ' . $charset . ' with CP1252 as its a superset');} - $charset = 'CP1252'; - } - - if (is_object($debug_object)) {$debug_object->debug_log(1, 'EXIT - ' . $charset);} - - return $this->_charset = $charset; - } - - // read tag info - protected function read_tag() - { - if ($this->char!=='<') - { - $this->root->_[HDOM_INFO_END] = $this->cursor; - return false; - } - $begin_tag_pos = $this->pos; - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - - // end tag - if ($this->char==='/') - { - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - // This represents the change in the simple_html_dom trunk from revision 180 to 181. - // $this->skip($this->token_blank_t); - $this->skip($this->token_blank); - $tag = $this->copy_until_char('>'); - - // skip attributes in end tag - if (($pos = strpos($tag, ' '))!==false) - $tag = substr($tag, 0, $pos); - - $parent_lower = strtolower($this->parent->tag); - $tag_lower = strtolower($tag); - - if ($parent_lower!==$tag_lower) - { - if (isset($this->optional_closing_tags[$parent_lower]) && isset($this->block_tags[$tag_lower])) - { - $this->parent->_[HDOM_INFO_END] = 0; - $org_parent = $this->parent; - - while (($this->parent->parent) && strtolower($this->parent->tag)!==$tag_lower) - $this->parent = $this->parent->parent; - - if (strtolower($this->parent->tag)!==$tag_lower) { - $this->parent = $org_parent; // restore origonal parent - if ($this->parent->parent) $this->parent = $this->parent->parent; - $this->parent->_[HDOM_INFO_END] = $this->cursor; - return $this->as_text_node($tag); - } - } - else if (($this->parent->parent) && isset($this->block_tags[$tag_lower])) - { - $this->parent->_[HDOM_INFO_END] = 0; - $org_parent = $this->parent; - - while (($this->parent->parent) && strtolower($this->parent->tag)!==$tag_lower) - $this->parent = $this->parent->parent; - - if (strtolower($this->parent->tag)!==$tag_lower) - { - $this->parent = $org_parent; // restore origonal parent - $this->parent->_[HDOM_INFO_END] = $this->cursor; - return $this->as_text_node($tag); - } - } - else if (($this->parent->parent) && strtolower($this->parent->parent->tag)===$tag_lower) - { - $this->parent->_[HDOM_INFO_END] = 0; - $this->parent = $this->parent->parent; - } - else - return $this->as_text_node($tag); - } - - $this->parent->_[HDOM_INFO_END] = $this->cursor; - if ($this->parent->parent) $this->parent = $this->parent->parent; - - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - return true; - } - - $node = new simple_html_dom_node($this); - $node->_[HDOM_INFO_BEGIN] = $this->cursor; - ++$this->cursor; - $tag = $this->copy_until($this->token_slash); - $node->tag_start = $begin_tag_pos; - - // doctype, cdata & comments... - if (isset($tag[0]) && $tag[0]==='!') { - $node->_[HDOM_INFO_TEXT] = '<' . $tag . $this->copy_until_char('>'); - - if (isset($tag[2]) && $tag[1]==='-' && $tag[2]==='-') { - $node->nodetype = HDOM_TYPE_COMMENT; - $node->tag = 'comment'; - } else { - $node->nodetype = HDOM_TYPE_UNKNOWN; - $node->tag = 'unknown'; - } - if ($this->char==='>') $node->_[HDOM_INFO_TEXT].='>'; - $this->link_nodes($node, true); - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - return true; - } - - // text - if ($pos=strpos($tag, '<')!==false) { - $tag = '<' . substr($tag, 0, -1); - $node->_[HDOM_INFO_TEXT] = $tag; - $this->link_nodes($node, false); - $this->char = $this->doc[--$this->pos]; // prev - return true; - } - - if (!preg_match("/^[\w-:]+$/", $tag)) { - $node->_[HDOM_INFO_TEXT] = '<' . $tag . $this->copy_until('<>'); - if ($this->char==='<') { - $this->link_nodes($node, false); - return true; - } - - if ($this->char==='>') $node->_[HDOM_INFO_TEXT].='>'; - $this->link_nodes($node, false); - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - return true; - } - - // begin tag - $node->nodetype = HDOM_TYPE_ELEMENT; - $tag_lower = strtolower($tag); - $node->tag = ($this->lowercase) ? $tag_lower : $tag; - - // handle optional closing tags - if (isset($this->optional_closing_tags[$tag_lower]) ) - { - while (isset($this->optional_closing_tags[$tag_lower][strtolower($this->parent->tag)])) - { - $this->parent->_[HDOM_INFO_END] = 0; - $this->parent = $this->parent->parent; - } - $node->parent = $this->parent; - } - - $guard = 0; // prevent infinity loop - $space = array($this->copy_skip($this->token_blank), '', ''); - - // attributes - do - { - if ($this->char!==null && $space[0]==='') - { - break; - } - $name = $this->copy_until($this->token_equal); - if ($guard===$this->pos) - { - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - continue; - } - $guard = $this->pos; - - // handle endless '<' - if ($this->pos>=$this->size-1 && $this->char!=='>') { - $node->nodetype = HDOM_TYPE_TEXT; - $node->_[HDOM_INFO_END] = 0; - $node->_[HDOM_INFO_TEXT] = '<'.$tag . $space[0] . $name; - $node->tag = 'text'; - $this->link_nodes($node, false); - return true; - } - - // handle mismatch '<' - if ($this->doc[$this->pos-1]=='<') { - $node->nodetype = HDOM_TYPE_TEXT; - $node->tag = 'text'; - $node->attr = array(); - $node->_[HDOM_INFO_END] = 0; - $node->_[HDOM_INFO_TEXT] = substr($this->doc, $begin_tag_pos, $this->pos-$begin_tag_pos-1); - $this->pos -= 2; - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - $this->link_nodes($node, false); - return true; - } - - if ($name!=='/' && $name!=='') { - $space[1] = $this->copy_skip($this->token_blank); - $name = $this->restore_noise($name); - if ($this->lowercase) $name = strtolower($name); - if ($this->char==='=') { - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - $this->parse_attr($node, $name, $space); - } - else { - //no value attr: nowrap, checked selected... - $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_NO; - $node->attr[$name] = true; - if ($this->char!='>') $this->char = $this->doc[--$this->pos]; // prev - } - $node->_[HDOM_INFO_SPACE][] = $space; - $space = array($this->copy_skip($this->token_blank), '', ''); - } - else - break; - } while ($this->char!=='>' && $this->char!=='/'); - - $this->link_nodes($node, true); - $node->_[HDOM_INFO_ENDSPACE] = $space[0]; - - // check self closing - if ($this->copy_until_char_escape('>')==='/') - { - $node->_[HDOM_INFO_ENDSPACE] .= '/'; - $node->_[HDOM_INFO_END] = 0; - } - else - { - // reset parent - if (!isset($this->self_closing_tags[strtolower($node->tag)])) $this->parent = $node; - } - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - - // If it's a BR tag, we need to set it's text to the default text. - // This way when we see it in plaintext, we can generate formatting that the user wants. - // since a br tag never has sub nodes, this works well. - if ($node->tag == "br") - { - $node->_[HDOM_INFO_INNER] = $this->default_br_text; - } - - return true; - } - - // parse attributes - protected function parse_attr($node, $name, &$space) - { - // Per sourceforge: http://sourceforge.net/tracker/?func=detail&aid=3061408&group_id=218559&atid=1044037 - // If the attribute is already defined inside a tag, only pay atetntion to the first one as opposed to the last one. - if (isset($node->attr[$name])) - { - return; - } - - $space[2] = $this->copy_skip($this->token_blank); - switch ($this->char) { - case '"': - $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE; - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - $node->attr[$name] = $this->restore_noise($this->copy_until_char_escape('"')); - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - break; - case '\'': - $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_SINGLE; - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - $node->attr[$name] = $this->restore_noise($this->copy_until_char_escape('\'')); - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - break; - default: - $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_NO; - $node->attr[$name] = $this->restore_noise($this->copy_until($this->token_attr)); - } - // PaperG: Attributes should not have \r or \n in them, that counts as html whitespace. - $node->attr[$name] = str_replace("\r", "", $node->attr[$name]); - $node->attr[$name] = str_replace("\n", "", $node->attr[$name]); - // PaperG: If this is a "class" selector, lets get rid of the preceeding and trailing space since some people leave it in the multi class case. - if ($name == "class") { - $node->attr[$name] = trim($node->attr[$name]); - } - } - - // link node's parent - protected function link_nodes(&$node, $is_child) - { - $node->parent = $this->parent; - $this->parent->nodes[] = $node; - if ($is_child) - { - $this->parent->children[] = $node; - } - } - - // as a text node - protected function as_text_node($tag) - { - $node = new simple_html_dom_node($this); - ++$this->cursor; - $node->_[HDOM_INFO_TEXT] = '</' . $tag . '>'; - $this->link_nodes($node, false); - $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - return true; - } - - protected function skip($chars) - { - $this->pos += strspn($this->doc, $chars, $this->pos); - $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - } - - protected function copy_skip($chars) - { - $pos = $this->pos; - $len = strspn($this->doc, $chars, $pos); - $this->pos += $len; - $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - if ($len===0) return ''; - return substr($this->doc, $pos, $len); - } - - protected function copy_until($chars) - { - $pos = $this->pos; - $len = strcspn($this->doc, $chars, $pos); - $this->pos += $len; - $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next - return substr($this->doc, $pos, $len); - } - - protected function copy_until_char($char) - { - if ($this->char===null) return ''; - - if (($pos = strpos($this->doc, $char, $this->pos))===false) { - $ret = substr($this->doc, $this->pos, $this->size-$this->pos); - $this->char = null; - $this->pos = $this->size; - return $ret; - } - - if ($pos===$this->pos) return ''; - $pos_old = $this->pos; - $this->char = $this->doc[$pos]; - $this->pos = $pos; - return substr($this->doc, $pos_old, $pos-$pos_old); - } - - protected function copy_until_char_escape($char) - { - if ($this->char===null) return ''; - - $start = $this->pos; - while (1) - { - if (($pos = strpos($this->doc, $char, $start))===false) - { - $ret = substr($this->doc, $this->pos, $this->size-$this->pos); - $this->char = null; - $this->pos = $this->size; - return $ret; - } - - if ($pos===$this->pos) return ''; - - if ($this->doc[$pos-1]==='\\') { - $start = $pos+1; - continue; - } - - $pos_old = $this->pos; - $this->char = $this->doc[$pos]; - $this->pos = $pos; - return substr($this->doc, $pos_old, $pos-$pos_old); - } - } - - // remove noise from html content - // save the noise in the $this->noise array. - protected function remove_noise($pattern, $remove_tag=false) - { - global $debug_object; - if (is_object($debug_object)) { $debug_object->debug_log_entry(1); } - - $count = preg_match_all($pattern, $this->doc, $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE); - - for ($i=$count-1; $i>-1; --$i) - { - $key = '___noise___'.sprintf('% 5d', count($this->noise)+1000); - if (is_object($debug_object)) { $debug_object->debug_log(2, 'key is: ' . $key); } - $idx = ($remove_tag) ? 0 : 1; - $this->noise[$key] = $matches[$i][$idx][0]; - $this->doc = substr_replace($this->doc, $key, $matches[$i][$idx][1], strlen($matches[$i][$idx][0])); - } - - // reset the length of content - $this->size = strlen($this->doc); - if ($this->size>0) - { - $this->char = $this->doc[0]; - } - } - - // restore noise to html content - function restore_noise($text) - { - global $debug_object; - if (is_object($debug_object)) { $debug_object->debug_log_entry(1); } - - while (($pos=strpos($text, '___noise___'))!==false) - { - // Sometimes there is a broken piece of markup, and we don't GET the pos+11 etc... token which indicates a problem outside of us... - if (strlen($text) > $pos+15) - { - $key = '___noise___'.$text[$pos+11].$text[$pos+12].$text[$pos+13].$text[$pos+14].$text[$pos+15]; - if (is_object($debug_object)) { $debug_object->debug_log(2, 'located key of: ' . $key); } - - if (isset($this->noise[$key])) - { - $text = substr($text, 0, $pos).$this->noise[$key].substr($text, $pos+16); - } - else - { - // do this to prevent an infinite loop. - $text = substr($text, 0, $pos).'UNDEFINED NOISE FOR KEY: '.$key . substr($text, $pos+16); - } - } - else - { - // There is no valid key being given back to us... We must get rid of the ___noise___ or we will have a problem. - $text = substr($text, 0, $pos).'NO NUMERIC NOISE KEY' . substr($text, $pos+11); - } - } - return $text; - } - - // Sometimes we NEED one of the noise elements. - function search_noise($text) - { - global $debug_object; - if (is_object($debug_object)) { $debug_object->debug_log_entry(1); } - - foreach($this->noise as $noiseElement) - { - if (strpos($noiseElement, $text)!==false) - { - return $noiseElement; - } - } - } - function __toString() - { - return $this->root->innertext(); - } - - function __get($name) - { - switch ($name) - { - case 'outertext': - return $this->root->innertext(); - case 'innertext': - return $this->root->innertext(); - case 'plaintext': - return $this->root->text(); - case 'charset': - return $this->_charset; - case 'target_charset': - return $this->_target_charset; - } - } - - // camel naming conventions - function childNodes($idx=-1) {return $this->root->childNodes($idx);} - function firstChild() {return $this->root->first_child();} - function lastChild() {return $this->root->last_child();} - function createElement($name, $value=null) {return @str_get_html("<$name>$value</$name>")->first_child();} - function createTextNode($value) {return @end(str_get_html($value)->nodes);} - function getElementById($id) {return $this->find("#$id", 0);} - function getElementsById($id, $idx=null) {return $this->find("#$id", $idx);} - function getElementByTagName($name) {return $this->find($name, 0);} - function getElementsByTagName($name, $idx=-1) {return $this->find($name, $idx);} - function loadFile() {$args = func_get_args();$this->load_file($args);} -} - -?> \ No newline at end of file diff --git a/panels/mensaPlan/tag.php b/panels/mensaPlan/tag.php deleted file mode 100755 index 4bfc63ceae69d2a43475704343f93fc47396ce20..0000000000000000000000000000000000000000 --- a/panels/mensaPlan/tag.php +++ /dev/null @@ -1,89 +0,0 @@ -<?php -class TAG { - private $nr = 0; - private $name = 0; - private $gerichte = array (); - private $date = ""; - function __construct($name, $date) { - $this->name = $name; - $this->date = $date; - switch ($name) { - case "montag" : - $this->nr = 1; - break; - case "dienstag" : - $this->nr = 2; - break; - case "mittwoch" : - $this->nr = 3; - break; - case "donnertag" : - $this->nr = 4; - break; - case "freitag" : - $this->nr = 5; - break; - case "samstag" : - $this->nr = 6; - break; - case "sonntag" : - $this->nr = 7; - breakM; - } - } - public function getNr() { - return $this->nr; - } - public function getName() { - return $this->name; - } - public function getGerichte() { - return $this->gerichte; - } - public function getDate() { - return $this->date; - } - public function setNr($nr) { - $this->nr = $nr; - } - public function setName($name) { - $this->name = $name; - } - public function setGerichte($gerichte) { - $this->gerichte = $gerichte; - } - public function setDate() { - $this->date = $date; - } - public function addGericht($gericht) { - array_push ( $this->gerichte, $gericht ); - } - public function addGerichte($gerichte) { - foreach ( $gerichte as $gericht ) { - array_push ( $this->gerichte, $gericht ); - } - } - public function toJson($inc_nr = true, $inc_original = true, $inc_short = true, $inc_art = true, $inc_kind = true, $inc_counter = true, $inc_stoffe = true, $inc_date = true) { - $kommata = false; - $json = '"' . $this->name . '":['; - foreach ( $this->gerichte as $gericht ) { - if ($kommata) { - $json .= ','; - } else { - $kommata = true; - } - $json .= $gericht->toJson ( $inc_nr,$inc_original, $inc_short, $inc_art, $inc_kind, $inc_counter, $inc_stoffe, $inc_date ); - } - $json .= ']'; - return $json; - } - public function __toString() { - $string = "Nr: " . $this->nr . ", Name: " . $this->name . ", Gerichte: "; - foreach ( $this->gerichte as $gericht ) { - $string .= $gericht; - } - $string .= ", Date: " . $this->date; - return $string; - } -} -?> \ No newline at end of file diff --git a/panels/mensaPlan/template.html b/panels/mensaPlan/template.html index cae871626af3982e77d94ebd9b77961a9785f98f..ebfd6c2ca4b1cfa9a775946b11d842fd5320df33 100755 --- a/panels/mensaPlan/template.html +++ b/panels/mensaPlan/template.html @@ -4,6 +4,7 @@ <li><a href="#tab-1">Normale Counter</a></li> <li><a href="#tab-2">Grill Counter</a></li> <li><a href="#tab-3">Sonstige Counter</a></li> + <li><a href="#tab-4">Beilagen</a></li> </ul> <div id="tab-1"> <table id="mensaPlanTable1" style="width:100%;height:100%"> @@ -23,4 +24,10 @@ </tbody> </table> </div> + <div id="tab-4"> + <table id="mensaPlanTable4" style="width:100%;height:100%"> + <tbody id="mensaPlanTable4Body"> + </tbody> + </table> + </div> </div> diff --git a/panels/werbung/img/OpenSourceInfoscreen.jpg b/panels/werbung/img/OpenSourceInfoscreen.jpg new file mode 100755 index 0000000000000000000000000000000000000000..7b7d5ed992b86e50ae5904a6150a5ee174332fd7 Binary files /dev/null and b/panels/werbung/img/OpenSourceInfoscreen.jpg differ diff --git a/panels/werbung/script.js b/panels/werbung/script.js index 2e98c0ede1d7fb55eb956150c9859f7fd78648e9..6f1beed5777be112c7829f512750be4408331ea1 100755 --- a/panels/werbung/script.js +++ b/panels/werbung/script.js @@ -2,15 +2,18 @@ var nextWerbung=0; var werbung_config = null; var werbung_img_display = null; var werbung_panel = null; + this.loaded=function(panel,config) { werbung_panel = panel; - werbung_config = config + werbung_config = config; } function setNextWerbung() { if(nextWerbung+1<werbung_config.files.length) { - nextWerbung += 1; + console.log("Werbung: SETNEXT - (" + nextWerbung + " + 1)"); + nextWerbung += 1; } else { + console.log("Werbung: SETNEXT - (0)"); nextWerbung = 0; } } @@ -26,23 +29,45 @@ this.resize=function() { this.hide = function() { } -this.checkShowCondition = function() { - var werbungOriginalNext = nextWerbung; - var enddateEl = werbung_config.files[nextWerbung].enddate.split("."); - if(Date.now() <= Date.UTC(enddateEl[2], enddateEl[1], enddateEl[0])) { - return 20; +function isOverDate(day, month, year){ + console.log("DEBUG: input"+day +" "+ month+" "+year); + + + var d = new Date(); + if((d.getFullYear() > year) || (d.getFullYear() == year && d.getMonth() > month) || (d.getFullYear() == year && d.getMonth() == month && d.getDate() > day)){ + return true; } else { - console.log("Werbung: Skipped - Out Of Date"); - setNextWerbung() + return false; } - while(nextWerbung != werbungOriginalNext){ - enddateEl = werbung_config.files[nextWerbung].enddate.split("."); - if(Date.now() <= Date.UTC(enddateEl[2], enddateEl[1], enddateEl[0])) { - return 20; +} + +this.checkShowCondition = function() { + var werbungOriginalNext = nextWerbung; + var firstNotDone = true + while(nextWerbung != werbungOriginalNext || firstNotDone){ + if(werbung_config.files[nextWerbung].startdate == "NEVER") { + var skipStartTest = true; + } else { + var skipStartTest = false; + } + if(werbung_config.files[nextWerbung].enddate == "NEVER") { + var skipEndTest = true; + } else { + var skipEndTest = false; + } + if( skipStartTest || isOverDate(werbung_config.files[nextWerbung].startdate.split(".")[0], werbung_config.files[nextWerbung].startdate.split(".")[1], werbung_config.files[nextWerbung].startdate.split(".")[2])) { // did it start + if( skipEndTest || !isOverDate(werbung_config.files[nextWerbung].enddate.split(".")[0], werbung_config.files[nextWerbung].enddate.split(".")[1], werbung_config.files[nextWerbung].enddate.split(".")[2])) { // did it end + console.log("Werbung: CurrentWerbung = " + nextWerbung); + return 20; + } else { + console.log("Werbung: Skipped - Out Of Date - (" + nextWerbung + ")"); + setNextWerbung(); + } } else { - console.log("Werbung: Skipped - Out Of Date"); - setNextWerbung() + console.log("Werbung: Skipped - Not Started - (" + nextWerbung + ")"); + setNextWerbung(); } + firstDone = false; } return 0; } diff --git a/test b/test old mode 100644 new mode 100755