Re: [cowiki-dev] Extension to coWiki text formatting -- Unhappy news
PAUL HANCHETT <[email protected]>
| Newsgroups | gmane.comp.php.cowiki.devel |
|---|---|
| Message-ID | <[email protected]> |
BTW, Thanks for making the effort! How hard do you think it is to deal
with this sort of issue?
Paul
PAUL HANCHETT wrote:
> Archie,
>
> Rather than report this as a bug I'm just going to say it isn't ready
> yet! You can cut and paste the attached files and see what I mean.
> They don't display correctly and the reverse parser seems to loose
> text. I also noticed that the output html seems to retain the
> internal XML properties.
>
> Also, Paragraph.txt seems to never save.
>
> I've checked in the test files I have to misc/development/tests
>
> I'll keep working on test files.
>
> Paul
>
>
>
> Archie Campbell wrote:
>
>> It wasn't very difficult to put in the origin code; unbalanced
>> emphasis is *not* supported. #195 DONE.
>>
>> I slotted paragraphs back in. Comment probably best heard from those
>> who do a lot of writing with coWiki; Sy maybe the best to condemn the
>> status quo, I for one shan't be writing much until we've maths and
>> images.
>>
>>
>> Oh, and I've changed XmlPrettyHtmlPrinter to use the xml_parser with
>> handlers, not the parse_into_struct function. It's neater, though
>> I've kept the old getPretty renamed to old_getPretty, in case I've
>> swallowed anything without noticing.
>>
>> Todays shipment includes WikiParser, WikiReverseParser,
>> FrontHTMLTransformer, XmlPrettyHtmlPrinter. These are the four files
>> I'd change from 0.3.4 to now. Once someone (anyone!) has peeked and
>> poked and found good words, I'll risk cvs.
>>
>> I'd like to bug colorizeQuote in Utility.php. It's failing to find
>> Registry keys and is code that I'm unfamiliar with. I'm likely,
>> however, to run up against similar stuff when I'm coding the Math
>> plugin, but sometimes it's easier to be told. Can't find
>> COLOR_QUOTE_LEVEL (which is there in the tpl.conf) and the function
>> does nothing.
>>
>> Regards,
>>
>> Archie
>>
>> ------------------------------------------------------------------------
>>
>> so we can mail * you a copy immediately. * *
>>
>> * Helping hands: Matt Ho
>> *
>>
>> * * @package parse * @subpackage class * @access public * * @author
>> Daniel T. Gorski, * @copyright (C) Daniel T. Gorski, {@link
>> http://www.develnet.org} * @license
>> http://www.gnu.org/licenses/gpl.html * @version $Revision: 1.36 $ *
>> */ /** * coWiki - Wiki parser class * * @package parse * @subpackage
>> class * @access public * * @author Daniel T. Gorski, * @since coWiki
>> 0.3.0 * @author Archie Campbell * @since coWiki 0.3.5 */ class
>> WikiParser extends Object { protected static $Instance = null;
>> protected $aToc = array(), $aRows = array(), $iRow = 0; protected
>> $aEmph = array(); protected $RefNodes = null; private $snug = 0; //
>> --------------------------------------------------------------------
>> /** * Collect referenced nodes to where the document is linking to *
>> * @access protected * * @author Daniel T. Gorski, * @since coWiki
>> 0.3.0 */ protected function addReferencedNode($Obj) {
>> $this->RefNodes->add($Obj); } //
>> --------------------------------------------------------------------
>> /** * Get referenced nodes * * @access public * * @author Daniel T.
>> Gorski, * @since coWiki 0.3.0 */ public function getReferencedNodes()
>> { return $this->RefNodes; } /** * Get instance * * @access public * *
>> @author Daniel T. Gorski, * @since coWiki 0.3.0 */ public function
>> getInstance() { if (!self::$Instance) { self::$Instance = new
>> WikiParser; } return self::$Instance; } //
>> --------------------------------------------------------------------
>> /** * @access protected * * @author Daniel T. Gorski, * @since coWiki
>> 0.3.0 */ protected function __construct() { $this->resetEmphasis(); }
>> // --- Helper methods
>> ------------------------------------------------- /** * @access
>> protected * * @author Daniel T. Gorski, * @since coWiki 0.3.0 */
>> protected function restoreTokens($sStr){ return $sStr; } /** *
>> Generate "toc" (Document Table of Contents) * * @access protected * *
>> @author Daniel T. Gorski, * @since coWiki 0.3.0 */ protected function
>> buildToc(&$i, &$nDepth) { $sStr = ''; // Iterate though all
>> toc-entries while (isset($this->aToc[$i]['DEPTH']) &&
>> $this->aToc[$i]['DEPTH'] == $nDepth) { $sAlias =
>> # $this->aToc[$i]['TEXT']; $sStr .= ''; $sStr .= ' '.$sAlias.''; $i++;
>> // Recurse (indent) if toc-entry is nested if
>> (isset($this->aToc[$i]['DEPTH'])) { if ($this->aToc[$i]['DEPTH'] >
>> $nDepth) { $sStr .= '
>>
>> '; $sStr .= $this->buildToc($i, $this->aToc[$i]['DEPTH']);
>> $sStr .= '
>>
>> '; } } $sStr .= '
>> '; } return $sStr; } //
>> --------------------------------------------------------------------
>> /** * parse * * @access public * @param string The wiki source string
>> * @return string Wiki XML * * @author Archie Campbell * @since coWiki
>> 0.3.5 */ public function parse($sStr) { $sRet = ''; $sContent = '';
>> $bList = false; $bTable = false; $bBegin = false; $aList = array();
>> $aTable = array(); // {{{ DEBUG }}} Logger::info('Start parsing wiki
>> document.'); // Init reference collection $this->RefNodes = new
>> Vector; $this->resetEmphasis(); // --- $sStr = trim(escape($sStr));
>> // Replace possible tabulators $sStr = str_replace("\t", ' ', $sStr);
>> // Replace possible \r\n or \n\r with \n $sStr = str_replace("\r\n",
>> "\n", $sStr); $sStr = str_replace("\n\r", "\n", $sStr); $this->aRows
>> = explode( "\n",$sStr."\n" ); $this->iRow = 0; $sRow =
>> $this->aRows[$this->iRow]; $bBegin = true; $t = 0; $l = -1; while(
>> true ) { $sContent = ''; $aMatches = array(); //table of contents
>> alone ^$ if( $bBegin && preg_match( '=^<toc(/?)>$=', $sRow, $aMatches
>> )) { $sRet .= "\n\t\t\n"; //plugins }else if( $bBegin && preg_match(
>> '=^<plugin +([A-Za-z0-9_.]+)( +([^&]*))?(/?)>=i', $sRow, $aMatches ))
>> { if(isset($aMatches[3])){ $sRet .= ''; }else{ $sRet .= ''; }
>> //headings }else if( $bBegin && preg_match( '=^(\+{1,})\s*(.*)$=s',
>> $sRow, $aMatches )) { $sContent =
>> $this->processContent($aMatches[2]); if( preg_match( '= ([^<]*)=USx',
>> $sContent, $aLinkMatches ) ) { $sAlias = !empty($aLinkMatches[2]) ?
>> $aLinkMatches[2] : $aLinkMatches[1] ; } else { $sAlias = $sContent; }
>> $i = sizeof($this->aToc); $this->aToc[$i]['TEXT'] = $sAlias;
>> $this->aToc[$i]['DEPTH'] = strlen( $aMatches[1] ); $sTag =
>> 'h'.strlen($aMatches[1]); $sRet .= '<'. $sTag .'>'. $sContent . '';
>> //end of table } else if( $bBegin && ($t > 0) && preg_match(
>> '=^</table>=i', $sRow, $aMatches )) { $sParam = trim($aTable[$t][0]);
>> if( $sParam == '') { $sRet .= "\n".'
>> '.$this->buildTable($aTable[$t]). '
>>
>> '."\n"; } else { $sRet .= "\n".'
>> '. $this->buildTable($aTable[$t]).'
>>
>> '."\n"; } if( --$t == 0 ){ $bTable = false; } //beginning of table }
>> else if( $bBegin && preg_match( '=^<table([^>]*)>$=Ui', $sRow,
>> $aMatches )) { $bTable = true; $aTable[++$t] = array(); array_push(
>> $aTable[$t], $aMatches[1] ); //beginning of list } else if( $bBegin
>> && preg_match( '=^([\s*#]{0,}[*#]) ([^\n]*)$=', $sRow, $aMatches )) {
>> $bList = true; $aList[++$l] = array(); $aList[$l]['TEXT'] =
>> $this->processContent( $aMatches[2] ); $aList[$l]['DEPTH'] = strlen(
>> $aMatches[1] ); $aList[$l]['TYPE'] = (substr($aMatches[1],-1)=='*'?
>> 'ul':'ol'); //horizontal rule } else if ($bBegin && preg_match(
>> '=^-{3,}(\s|$)=', $sRow, $aMatches ) ) { $sRet .= '
>> ------------------------------------------------------------------------
>> '."\n"; /* //noop } else if (preg_match( '=((.*)<noop>)=i', $sRow,
>> $aMatches )) { $sContent = $this->processContent( $aMatches[2], false
>> ) . ''; $sRow = substr( $sRow, strlen($aMatches[1]) ); do { if
>> (preg_match( '=(.*)</noop>=' , $sRow, $aMatches )) { $sContent .=
>> $aMatches[1] . ''; break; } else { $sContent .= $sRow; }
>> if(++$this->iRowaRows)){ $sRow = $this->aRows[$this->iRow]; } else {
>> break; } } while(true); $sRet .= $sContent; */ } else { //end of list
>> if($bList) { $d = 0; $sListType = $aList[$d]['TYPE']; $nDepth =
>> $aList[$d]['DEPTH']; $sContent .= "\n".''. '<'.$sListType.'>'.
>> $this->buildList($d,$nDepth,$aList). ''. ''."\n"; $bList = false;
>> $aList = array(); $l = -1; if($bTable){ array_push( $aTable[$t],
>> $sContent ); }else{ $sRet .= $sContent; } //more table }else
>> if($bTable) { array_push( $aTable[$t], $sRow ); $sRow = ''; //non
>> table/list row }else{ $sContent = $this->processContent( $sRow ); if(
>> $sContent != '' ){ $sRet .= '
>>
>> '.$sContent.'
>>
>> '; } $sRow = ''; } } if(isset($aMatches[0])) { $sRow = substr( $sRow,
>> strlen( $aMatches[0] ) ); $bBegin = false; } if ( trim($sRow) == '' )
>> { if( ++$this->iRow < sizeof($this->aRows) ) { $sRow =
>> $this->aRows[$this->iRow]; $bBegin = true; } else { break; } } } if(
>> preg_match( '=^(.*)\n\t\t\n(.*)$=s', $sRet, $aMatches )) { $t = 0; if
>> (sizeof($this->aToc) > 0) { $sToc = $this->buildToc($t,
>> $this->aToc[$t]['DEPTH']); if ($sToc != '') { $sToc = '
>>
>> ' . $sToc . '
>>
>> '; } else { $sToc = ''; } } return $aMatches[1] . $sToc .
>> $aMatches[2]; } // {{{ DEBUG }}} Logger::info('Finished parsing wiki
>> document.'); return $sRet; } /** * reset Emphasis * * @access
>> protected * * @author Archie Campbell * @since coWiki 0.3.5 */
>> protected function resetEmphasis() { $this->aEmph = array( "b" =>
>> false, "u" => false, "i" => false, "f" => false, "s" => false, "j" =>
>> '', "p" => '' ); } /** * processContent * * @access protected *
>> @return string * * @author Archie Campbell * @since coWiki 0.3.5 */
>> protected function processContent( $sStr ) { $sRet = ''; $aMatches =
>> array(); $this->resetEmphasis(); $sStr = ltrim( $sStr ); while( trim(
>> $sStr ) != '' ) { //noop if (preg_match( '=^<noop>=is', $sStr,
>> $aMatches )) { //greedily munch all until $sStr = substr( $sStr,
>> strlen( $aMatches[0] ) ); $sContent = ''; while( !preg_match(
>> '=^</noop>=is', $sStr, $aMatches ) ) { preg_match(
>> '=([^&]|(\&(?![lg])))*=is', $sStr, $aMatches ); $sContent .=
>> $aMatches[0]; $sStr = substr( $sStr, strlen( $aMatches[0] ) ); if (
>> $sStr == "\n" ) { if ( ++$this->iRow < sizeof($this->aRows) ) { $sStr
>> = $this->aRows[$this->iRow]; } else { $sStr = ''; break; } } } $sRet
>> .= '' . $sContent . ''; //justification } else if( preg_match(
>> '=^<(/?)(left|center|right)>=i', $sStr, $aMatches )) { $sRet .=
>> '<'.$aMatches[1].$aMatches[2].'>'; /* if( $aMatches[1] == '/' &&
>> $this->aEmph['j'] == $aMatches[2]{0} ) { $sRet .= '';
>> $this->aEmph['j'] = ''; } else if ( $aMatches[1] == '' &&
>> $this->aEmph['j'] == '' ) { $sRet .= '<'. $aMatches[2] .'>';
>> $this->aEmph['j'] = $aMatches[2]{0}; } */ //pre code posting q start
>> at BOL, are greedy until // closing tag anywhere on a line } else if
>> (preg_match( '=^<(pre|code|posting|q|rem)>=i', $sStr, $aMatch ) ) {
>> $sStr = substr( $sStr, strlen($aMatch[0]) ); do { if (preg_match(
>> '=(.*)</'.$aMatch[1].'>=i', $sStr, $aMatches )) { $sRet .=
>> '<'.$aMatch[1].'>'.$sContent . $aMatches[1].''; break; } else {
>> $sContent .= $sStr ."\n"; } if( ++$this->iRow < sizeof($this->aRows)
>> ){ $sStr = $this->aRows[$this->iRow]; }else{ break; } } while(true);
>> if( $this->iRow == sizeof($this->aRows) ) { $sRet .=
>> '<'.$aMatch[1].'>'. $sContent . ''; break; } //line-break }else if(
>> preg_match( '=^<br([ /]+)>=is', $sStr, $aMatches )) { $sRet .= '
>> '; //variables }else if( preg_match( '=^%([A-Z0-9_]+)%=U', $sStr,
>> $aMatches )) { $sRet .= ''; //links (()()) & [[][]] }else if(
>> preg_match( '=^\(\(([^\(\)]+|[^\(\)]+' . '\([^\(\)]+\)[^\(\)]*|' .
>> '[^\(\)]+\)\([^\(\)]+)\)\)=Usx', $sStr, $aMatches )) { $sRet .=
>> $this->createLinkElement( $aMatches[1] ); /* $aLink = explode( ')(',
>> $aMatches[1] ); $aLink[0] = str_replace( '|', '¦', $aLink[0] ); $sRet
>> .= ' '; if ( isset( $aLink[1]) ) { $sRet .= trim($aLink[1]); } else {
>> $sRet .= trim($aLink[0]); } $sRet .= ''; */ /* //WikiWords }else if(
>> preg_match( '=^([A-Z][a-z]+([A-Z][a-z]+)+)=s', $sStr, $aMatches )) {
>> $sLink = trim(preg_replace( '=([A-Z])=', ' \1', $aMatches[1] ));
>> $sRet .= ' ' . $sLink . ''; */ /* //urls }else if( preg_match(
>> '=^<url(\s+)( (http://|https://|ftp://|mailto:|news:) ([-_A-Z0-9\S]*)
>> (\*\s|\=\s|"|<|>|<|>|\(|\)|\s|$)?? )>=six', $sStr, $aMatches ) ) { */
>> //URIs }else if( preg_match(
>> '=^(http://|https://|ftp://|mailto:|news:) ([-_A-Z0-9\S]*)
>> (\*\s|\=\s|"|<|>|<|>|\(|\)|\s|$)?? =six', $sStr, $aMatches )) { $sRet
>> .= ''; //subscript, superscript }else if( preg_match(
>> '=^<(/??)(sub|sup)>=is', $sStr, $aMatches ) ) { if( $aMatches[1] ==
>> '/' && $this->aEmph['p'] == $aMatches[2] ) { $sRet .= '';
>> $this->aEmph['p'] = ''; }else if ( $aMatches[1] == '' &&
>> $this->aEmph['p'] == '' ) { $sRet .= '<' . $aMatches[2] . '>';
>> $this->aEmph['p'] = $aMatches[2]; } //emphasis }else if( preg_match(
>> '#^<(/??)(strike|tt|b|u|i)>#is', $sStr, $aMatches ) ) { $sEmph = '';
>> switch($aMatches[2]{0}){ case 's':
>> $sEmph=($this->aEmph["s"]?'/':'').'strike'; $this->aEmph["s"] =
>> !$this->aEmph["s"]; break; case 't':
>> $sEmph=($this->aEmph["f"]?'/':'').'tt'; $this->aEmph["f"] =
>> !$this->aEmph["f"]; break; case 'b':
>> $sEmph=($this->aEmph["b"]?'/':'').'b'; $this->aEmph["b"] =
>> !$this->aEmph["b"]; break; case 'u':
>> $sEmph=($this->aEmph["u"]?'/':'').'u'; $this->aEmph["u"] =
>> !$this->aEmph["u"]; break; case 'i':
>> $sEmph=($this->aEmph["i"]?'/':'').'i'; $this->aEmph["i"] =
>> !$this->aEmph["i"]; break; } $sRet .= '<'.$sEmph; if($sEmph{0}!='/'){
>> $sRet .= ' origin="html">'; } else { $sRet .= '>'; } //$sRet .=
>> '<'.$sEmph.'>'; //emphasis }else if( preg_match( '#^([-=\*_/]{2})#',
>> $sStr, $aMatches ) ) { $sEmph = ''; switch($aMatches[1]{0}){ case
>> '-': $sEmph=($this->aEmph["s"]?'/':'').'strike'; $this->aEmph["s"] =
>> !$this->aEmph["s"]; break; case '=':
>> $sEmph=($this->aEmph["f"]?'/':'').'tt'; $this->aEmph["f"] =
>> !$this->aEmph["f"]; break; case '*':
>> $sEmph=($this->aEmph["b"]?'/':'').'b'; $this->aEmph["b"] =
>> !$this->aEmph["b"]; break; case '_':
>> $sEmph=($this->aEmph["u"]?'/':'').'u'; $this->aEmph["u"] =
>> !$this->aEmph["u"]; break; case '/':
>> $sEmph=($this->aEmph["i"]?'/':'').'i'; $this->aEmph["i"] =
>> !$this->aEmph["i"]; break; } $sRet .= '<'.$sEmph; if($sEmph{0}!='/'){
>> $sRet .= ' origin="wiki">'; } else { $sRet .= '>'; } //$sRet .=
>> '<'.$sEmph.'>'; }else if( preg_match(
>> '#^((([-=\*_/]{1})(?!\3))|[^-=\*_/&]|(&(?![lg])))*#', $sStr,
>> $aMatches ) ) { $sRet .= $aMatches[0]; } if( isset($aMatches[0]) ) {
>> $sStr = substr( $sStr, strlen($aMatches[0]) ); } } return $sRet; }
>> /** * &build table * * @access protected * @return string * * @author
>> Archie Campbell * @since coWiki 0.3.5 */ protected function
>> buildTable( &$aTable ) { $sRet = ''; $sContent = ''; $sRow = '';
>> $bPriorRow = false; $aMatches = array(); $j = 0; $v =
>> sizeof($aTable); while( ++$j < $v ) { /* if
>> (!strlen(trim($aTable[$j]))) { return ''.$sStr.''; } */ //rows
>> expected to hold table syntax (pipes), may instead //make room for
>> ongoing content (tables, lists, etc) $sRow = $aTable[$j]; //find
>> table syntax within a (long?) row while( strlen($sRow) && preg_match(
>> '=^([\|!][-+]?)( {0,1}[^\|!\n]*)?=', $sRow, $aMatches) ) { //found
>> exploded row begins with pipe syntax, poss params $sRow = substr(
>> $sRow, strlen($aMatches[0]) ); $nType = 0; //tables made of cells,
>> headers, rows, caption if ($aMatches[1]=="|") { $sRet .= '\n";
>> continue 1; } //content can be large, room for it here $sContent =
>> ''; if (isset($aMatches[2]) && $aMatches[2]{0}==' ') { //left a space
>> to denote no params $sRet .= '>'; $sContent .=
>> substr($aMatches[2],1); //expect double pipe, bang or newline }
>> elseif (isset($aMatches[2])) { //got params. look for pipe syntax
>> that blocked last preg $sRet .= ' '.unescape($aMatches[2]).'>'; if
>> (preg_match('=^\|([^\|!\n]*)=',$sRow,$aMatches)) { //got rest of pipe
>> syntax (...|text) $sContent .= $aMatches[1]; $sRow = substr( $sRow,
>> strlen($aMatches[0]) ); } } else { $sRet .= '>'; } //look ahead now.
>> if (trim($sRow) == '') { //look ahead to close our content while(
>> ++$j<$v ){ $sRow = $aTable[$j]; //pipe syntax (will force $sContent)
>> to continue if ($sRow{0} == '|' || $sRow{0} == '!') { $sRet .=
>> $this->processContent($sContent); switch($nType){ case 1: $sRet .=
>> "\n"; break; case 2: $sRet .= "\n"; break; } --$j; continue 3; } else
>> { //non-pipe (ever-increasing) content $sContent .= $sRow; } } $j =
>> $v; $sRet .= $this->processContent($sContent); switch($nType){ case
>> 1: $sRet .= "\n"; break; case 2: $sRet .= "\n"; break; } continue 2;
>> } elseif ( ( $sRow{0} == "|" || $sRow{0} == "!") && ($sRow{1} == "|"
>> || $sRow{1} == "!") ) { $sRow = substr($sRow, 1); $sRet .=
>> $this->processContent($sContent); switch($nType){ case 1: $sRet .=
>> "\n"; break; case 2: $sRet .= "\n"; break; } continue 1; } } } if(
>> $bPriorRow ) { return $sRet.""; } else { return $sRet; } } /** *
>> &build list * * @access protected * @return string * * @author Archie
>> Campbell * @since coWiki 0.3.5 */ protected function buildList(&$i,
>> &$nDepth, &$aList) { $sStr = ''; // Iterate though all list-entries
>> while (isset($aList[$i]['DEPTH']) && $aList[$i]['DEPTH'] == $nDepth)
>> # { $sStr .= ''; $sStr .= $aList[$i]['TEXT']; $i++; // Recurse (indent)
>> if list-entry is nested if (isset($aList[$i]['DEPTH'])) { if
>> ($aList[$i]['DEPTH'] > $nDepth) { // Correct items that are indented
>> too deep $aList[$i]['DEPTH'] = $nDepth + 1; $sListType =
>> $aList[$i]['TYPE']; $sStr .= '<'.$sListType.'>'; $sStr .=
>> $this->buildList( $i, $aList[$i]['DEPTH'], $aList ); $sStr .= ''; } }
>> $sStr .= '
>> '; } return $sStr; } //
>> --------------------------------------------------------------------
>> } // of class /* Prospero: That cross you wear around your neck; is
>> it only a decoration, or are you a true Christian believer?
>> Francesca: Yes, I believe - truly. Prospero: Then I want you to
>> remove it at once! - and never to wear it within this castle again!
>> Do you know how a falcon is trained my dear? Her eyes are sown shut.
>> Blinded temporarily she suffers the whims of her God patiently, until
>> her will is submerged and she learns to serve - as your God taught
>> and blinded you with crosses. Francesca: You had me take off my cross
>> because it offended ... Prospero: It offended no-one. No - it simply
>> appears to me to be discourteous to ... to wear the symbol of a deity
>> long dead. My ancestors tried to find it. And to open the door that
>> seperates us from our Creator. Francesca: But you need no doors to
>> find God. If you believe ... Prospero: Believe?! If you believe you
>> are gullible. Can you look around this world and believe in the
>> goodness of a god who rules it? Famine, Pestilence, War, Disease and
>> Death! They rule this world. Francesca: There is also love and life
>> and hope. Prospero: Very little hope I assure you. No. If a god of
>> love and life ever did exist ... he is long since dead. Someone ...
>> something rules in his place. */ ?>
>> ------------------------------------------------------------------------
>>
>> so we can mail * you a copy immediately. * * @package parse *
>> @subpackage class * @access public * * @author Daniel T. Gorski, *
>> @copyright (C) Daniel T. Gorski, {@link http://www.develnet.org} *
>> @license http://www.gnu.org/licenses/gpl.html * @version $Revision:
>> 1.17 $ * */ /** * coWiki - Wiki reverse parser class * * @package
>> parse * @subpackage class * @access public * * @author Daniel T.
>> Gorski, * @since coWiki 0.3.0 * @author Archie Campbell * @since
>> coWiki 0.3.5 * * @todo [D11N] Complete documentation */ class
>> WikiReverseParser extends Object { protected static $Instance = null,
>> $Context = null, $DocDAO = null; private $rParser = null; private
>> $ignoreToc = false, $aList = array(), $nDepth = 0, $aType = array(),
>> $aTable = array(), // $nTable = null; $sLink = array(), $fLink =
>> array(), $aState = array(0), $sContent = '', $aRow = array(),
>> $nListIndent = null; //
>> --------------------------------------------------------------------
>> /** * Get instance * * @access public * @return mixed * * @author
>> Daniel T. Gorski, * @since coWiki 0.3.0 * * @todo [D11N] Check
>> description * @todo [D11N] Check return type */ public function
>> getInstance() { if (!self::$Instance) { self::$Instance = new
>> WikiReverseParser; } return self::$Instance; } //
>> --------------------------------------------------------------------
>> /** * Parse * * @access protected * @param string * @return void * *
>> @author Daniel T. Gorski, * @since coWiki 0.3.0 * * @todo [D11N]
>> Check description */ protected function __construct() {
>> $this->Context = RuntimeContext::getInstance(); $this->DocDAO =
>> $this->Context->getDocumentDAO(); } //
>> --------------------------------------------------------------------
>> // FIX: THIS METHOD DO NOT COVER ALL POSSIBLE OCCURANCES OF
>> DELIMITERS // YET! THIS HAS TO BE CHECKED AND FIXED. /** * If a
>> string reference contains delimiters, escape them with * * @access
>> protected * @param string * @return mixed * * @author Daniel T.
>> Gorski, * @since coWiki 0.3.0 * * @todo [D11N] Check return type */
>> protected function noopDelimiters(&$sStr) { // Escape leading
>> delimiters if (substr($sStr, 0, 2) == '()') { $sStr =
>> '<noop>()</noop>'.substr($sStr, 2); } else if (substr($sStr, 0, 1) ==
>> '(') { $sStr = '<noop>(</noop>'. substr($sStr, 1); } // Escape
>> trailing delimiters if (substr($sStr, -2) == '()') { $sStr =
>> substr($sStr, 0, -2).'<noop>()</noop>'; } else if (substr($sStr, -1)
>> == ')') { $sStr = substr($sStr, 0, -1).'<noop>)</noop>'; } // Escape
>> double closing $sStr = str_replace('))', '<noop>))</noop>', $sStr);
>> // Replace web/document delimiter return str_replace('¦', '|',
>> $sStr); } //
>> --------------------------------------------------------------------
>> /** * Helper functions * * @author Archie Campbell * @since coWiki
>> 0.3.5 * */ protected function appendRow($sStr){
>> array_push($this->aRow,$sStr); $this->clearContent(); } protected
>> function clearContent(){ $this->sContent = ''; } protected function
>> clearRow() { if($this->sContent!=''){
>> $this->appendRow($this->sContent); } } protected function
>> textListItem( $sData ) { $this->aList[sizeof($this->aList)-1]['TEXT']
>> .= $sData; } protected function pushTableItem( $sData ) {
>> array_push($this->aTable[sizeof($this->aTable)-1],$sData); } /** *
>> Parse * * @access public * @param string * @return mixed * * @author
>> Archie Campbell * @since coWiki 0.3.5 * */ public function
>> parse($sStr) { //return $this->dummy($sStr); if
>> (!function_exists('xml_parser_create')) { return false; }
>> $this->rParser = @xml_parser_create(); if (!$this->rParser) { return
>> false; } xml_parser_set_option($this->rParser,
>> XML_OPTION_CASE_FOLDING, 0); xml_parser_set_option($this->rParser,
>> XML_OPTION_SKIP_WHITE, 1); // Replace possible tabulators $sStr =
>> str_replace("\t", ' ', $sStr); // Replace possible \r\n or \n\r with
>> \n $sStr = str_replace("\r\n", "\n", $sStr); $sStr =
>> str_replace("\n\r", "\n", $sStr); // Prepare XML, add root element
>> $sStr = '' . $sStr . ''; xml_set_default_handler( $this->rParser,
>> array(&$this,'xml_default_handler') ); xml_set_element_handler(
>> $this->rParser, array(&$this,'xml_start_handler'),
>> array(&$this,'xml_end_handler') ); xml_set_character_data_handler(
>> $this->rParser, array(&$this,'xml_cdata_handler') ); if(!xml_parse(
>> $this->rParser, $sStr )){ echo
>> xml_error_string(xml_get_error_code($this->rParser)); } return
>> implode("\n",$this->aRow); } /** * xml element start handler * *
>> @access protected * * @author Archie Campbell * @since coWiki 0.3.5 *
>> */ protected function xml_start_handler( &$parser, $sName, $aAttrib )
>> { if($this->ignoreToc){ return; } switch($sName){ case 'document':
>> $this->aRow = array(); break; case 'toc': $this->clearRow();
>> $this->ignoreToc = true; break; case 'plugin': $this->clearRow();
>> $sStr = '1){ foreach($aAttrib as $attr => $value){ if($attr !=
>> 'name'){ $sStr .= ' '.$attr.'='.$value; } } } $sStr .= '>';
>> $this->appendRow($sStr); break; //table syntax case 'table':
>> $this->clearRow(); array_push($this->aState,6);/*WRP_TABL*/
>> array_push($this->aTable,array($aAttrib));//[][0] break; case
>> 'caption': array_push($this->aState,7);/*WRP_CAPN*/
>> $this->clearContent(); break; case 'tr':
>> array_push($this->aState,8);/*WRP_TROW*/ $sStr = '|-';
>> if(sizeof($aAttrib)){ foreach($aAttrib as $attr => $value){ $sStr .=
>> $attr.'="'.$value.'" '; } } $this->pushTableItem( $sStr ); break;
>> case 'th': array_push($this->aState,9);/*WRP_THED*/ $sStr = '!';
>> if(sizeof($aAttrib)){ foreach($aAttrib as $attr => $value){ $sStr .=
>> $attr.'="'.$value.'" '; } } $sStr .= ' '; $this->pushTableItem( $sStr
>> ); break; case 'td': array_push($this->aState,10);/*WRP_TCEL*/ $sStr
>> = '|'; if(sizeof($aAttrib)){ foreach($aAttrib as $attr => $value){
>> $sStr .= $attr.'="'.$value.'" '; } } $sStr .= ' ';
>> $this->pushTableItem( $sStr ); break; //list syntax case 'list':
>> $this->clearRow(); array_push($this->aState,1);/*WRP_LIST*/ break;
>> case 'ol': case 'ul': $this->nDepth++;
>> array_push($this->aType,$sName); break; case 'li':
>> switch(end($this->aState)){ case 1: if(strlen($this->sContent)){
>> $this->textListItem($this->sContent); } array_push( $this->aList,
>> array( 'DEPTH'=>$this->nDepth, 'TYPE'=>(end($this->aType)=='ol'?
>> "#":"*"), 'TEXT'=>'' )); break; default: echo $sName . "insanity";
>> exit; } $this->clearContent(); break; //paragraphs case 'p':
>> $this->clearRow(); break; //noop case 'noop': $this->sContent .= '';
>> array_push($this->aState,5); break; //justification case 'left': case
>> 'right': case 'center': $this->sContent .= '<'.$sName.'>'; break;
>> //pre, code, posting, quote case 'pre': case 'code': case 'posting':
>> case 'q': case 'rem': $this->clearRow(); array_push($this->aState,4);
>> break; //line-break case 'br': $this->clearRow(); break; //variables
>> case 'var': $this->sContent .= "%".$aAttrib['name']."%"; break;
>> //headings case 'h1': case 'h2': case 'h3': case 'h4': case 'h5':
>> case 'h6': array_push($this->aState,3); break; //wiki links case
>> 'uri': $this->sContent .= $aAttrib['strref']; break; case 'link':
>> array_push($this->aState,2); if( isset($aAttrib['strref']) ) {
>> $this->fLink = array(&$this, 'buildStrRefLink'); $this->sLink[1] =
>> $aAttrib['strref']; }else if( isset($aAttrib['href']) ) {
>> $this->fLink = array(&$this, 'buildHyperRefLink'); $this->sLink[1] =
>> $aAttrib['href']; }else if( isset($aAttrib['idref']) ) { $this->fLink
>> = array(&$this, 'buildIdRefLink'); $this->sLink[1] =
>> $aAttrib['idref']; } break; //subscript & superscript case 'sub':
>> case 'sup': $this->sContent .= '<'.$sName.'>'; break; //horizontal
>> rule case 'hr':break; //emphasis (strike,tt,b,u,i) //WRP_ST WRP_TT
>> WRP_B WRP_U WRP_I //11 12 13 14 15 case 'strike':
>> if(isset($aAttrib['origin']) && $aAttrib['origin']=='html'){
>> array_push($this->aState,11); $this->sContent .= ""; }else{
>> $this->sContent .= "--"; } break; case 'tt':
>> if(isset($aAttrib['origin']) && $aAttrib['origin']=='html'){
>> array_push($this->aState,12); $this->sContent .= ""; }else{
>> $this->sContent .= "=="; } break; case 'b':
>> if(isset($aAttrib['origin']) && $aAttrib['origin']=='html'){
>> array_push($this->aState,13); $this->sContent .= "*"; }else{
>> $this->sContent .= "**"; } break; case 'u':
>> if(isset($aAttrib['origin']) && $aAttrib['origin']=='html'){
>> array_push($this->aState,14); $this->sContent .= "_"; }else{
>> $this->sContent .= "__"; } break; case 'i':
>> if(isset($aAttrib['origin']) && $aAttrib['origin']=='html'){
>> array_push($this->aState,15); $this->sContent .= "/"; }else{
>> $this->sContent .= "//"; } break; default: echo $sName . " start" .
>> "\n"; } } /** * xml element end handler * * @access protected * *
>> @author Archie Campbell * @since coWiki 0.3.5 * */ protected function
>> xml_end_handler( &$parser, $sName ) { if($this->ignoreToc){ if($sName
>> == 'toc'){ $this->appendRow(""); $this->ignoreToc = false; return; }
>> } switch($sName){ case 'document': $this->clearRow(); break; case
>> 'plugin': break; //table syntax case 'table':
>> if(array_pop($this->aState)!=6) { echo "insanity in table"; exit; }
>> $aTable = array_pop($this->aTable); $sStr = '
>> $value ){ $sStr .= " ".$attr.'="'.$value.'"'; } $sStr .=
>> (sizeof($aTable)==1?'/>':'>'); $this->appendRow( $sStr ); for ($i =
>> 1; $i < sizeof($aTable) ; $i++){ $this->appendRow( $aTable[$i] ); }
>> $this->appendRow('
>>
>> '); break; //caption case 'caption': if(array_pop($this->aState)!=7)
>> { echo "insanity in caption"; exit; } $this->pushTableItem( "|+
>> ".$this->sContent ); $this->clearContent(); break; case 'tr':
>> if(array_pop($this->aState)!=8) { echo "insanity in trow"; exit; }
>> break; case 'th': if(array_pop($this->aState)!=9) { echo "insanity in
>> thead"; exit; } if($this->sContent != ''){
>> $this->pushTableItem($this->sContent); $this->clearContent(); }
>> break; case 'td': if(array_pop($this->aState)!=10) { echo "insanity
>> in tcell"; exit; } if($this->sContent != ''){
>> $this->pushTableItem($this->sContent); $this->clearContent(); }
>> break; //list syntax case 'list': if(array_pop($this->aState)!=1) {
>> echo "insanity in list"; exit; }; foreach($this->aList as $li){ $sStr
>> = str_repeat($li['TYPE'],$li['DEPTH']). " ".$li['TEXT'];
>> switch(end($this->aState)){ case 9: case 10: $this->pushTableItem(
>> $sStr ); break; default: $this->appendRow( $sStr ); } }
>> $this->clearContent(); $this->aList = array(); break; case 'ol': case
>> 'ul': $this->nDepth--; array_pop($this->aType); break; case 'li':
>> $this->textListItem($this->sContent); $this->clearContent(); break;
>> //paragraphs case 'p': $this->appendRow( $this->sContent ); break;
>> //noop case 'noop': $this->sContent .= '/_**_/';
>> array_pop($this->aState); break; //justification case 'left': case
>> 'right': case 'center': $this->sContent .= ''; break; //pre, code,
>> posting, quote case 'pre': case 'code': case 'posting': case 'q':
>> case 'rem': $this->sContent = '<'.$sName.'>'. $this->sContent. '';
>> array_pop($this->aState); if(end($this->aState)!=1){
>> $this->clearRow(); } break; //line-break case 'br': $this->appendRow( '
>> ' ); break; //variables case 'var': break; //headings case 'h1': case
>> 'h2': case 'h3': case 'h4': case 'h5': case 'h6': $this->appendRow(
>> str_repeat("+",substr($sName,1,1)). " ". $this->sContent); array_pop(
>> $this->aState ); break; //wiki links case 'uri': break; case 'link':
>> array_pop($this->aState); $sStr = call_user_func($this->fLink,
>> $this->sLink); $this->sContent .= $sStr; break; //subscript &
>> superscript case 'sub': case 'sup': $this->sContent .= ''; break;
>> //horizontal rule case 'hr': $this->appendRow("---"); break;
>> //emphasis (strike,tt,b,u,i) case 'strike':
>> if(end($this->aState)==11){ array_pop($this->aState); $this->sContent
>> .= "/_**_/"; } else { $this->sContent .= "--"; } break; case 'tt':
>> if(end($this->aState)==12){ array_pop($this->aState); $this->sContent
>> .= "/_**_/"; } else { $this->sContent .= "=="; } break; case 'b':
>> if(end($this->aState)==13){ array_pop($this->aState); $this->sContent
>> .= "/_*_/"; } else { $this->sContent .= "**"; } break; case 'u':
>> if(end($this->aState)==14){ array_pop($this->aState); $this->sContent
>> .= "/_/"; } else { $this->sContent .= "__"; } break; case 'i':
>> if(end($this->aState)==15){ array_pop($this->aState); $this->sContent
>> .= "/"; } else { $this->sContent .= "//"; } break; default: echo
>> $sName . " end" . "\n"; } } /** * xml element default handler * *
>> @access protected * * @author Archie Campbell * @since coWiki 0.3.5 *
>> */ protected function xml_default_handler( &$parser, $sData ) {
>> if(!$this->ignoreToc){ $this->sContent .= html_entity_decode($sData);
>> } } /** * xml cdata handler * * @access protected * * @author Archie
>> Campbell * @since coWiki 0.3.5 * */ protected function
>> xml_cdata_handler( &$parser, $sData ) { if($this->ignoreToc){ return;
>> } if( trim($sData) != '' ) { switch( end($this->aState) ){ case
>> 1:/*WRP_LIST*/ case 3:/*WRP_HEAD*/ case 4:/*WRP_PCPQ*/ case
>> 5:/*WRP_NOOP*/ case 7:/*WRP_CAPT*/ case 9:/*WRP_THED*/
>> $this->sContent .= $sData; break; case 2:/*WRP_LINK*/
>> $this->sLink[2]=trim($sData); break; default:/*text*/ $this->sContent
>> .= $sData; } } } //
>> --------------------------------------------------------------------
>> /** * Build str ref link * * @access protected * @param array *
>> @return mixed * * @author Daniel T. Gorski, * @since coWiki 0.3.0 * *
>> @todo [D11N] Check description */ protected function
>> buildStrRefLink(&$aMatches) { if ($aMatches[1] == $aMatches[2] ||
>> trim($aMatches[2]) == '') { return '((' .
>> $this->noopDelimiters($aMatches[1]) . '))'; } return '((' .
>> $this->noopDelimiters($aMatches[1]) . ')' .'(' . $aMatches[2] . '))';
>> } } // of class ?>
>> ------------------------------------------------------------------------
>>
>> so we can mail * you a copy immediately. * * @package render *
>> @subpackage class * @access public * * @author Daniel T. Gorski, *
>> @copyright (C) Daniel T. Gorski, {@link http://www.develnet.org} *
>> @license http://www.gnu.org/licenses/gpl.html * @version $Revision:
>> 1.39 $ * */ /** * The FrontHtmlTransformer is a low-end replacement
>> for a XSLT processor. * Its main purpose is to transform and render
>> the internal coWiki documents * (that are stored as simple XML) into
>> HTML. This class is a Singelton. * You can not instantiate this class
>> directly (with $foo = new class), but * have to get its instance: * *
>> Example: * | * // This won't work * $Trans = new
>> FrontHtmlTransformer(); * * // This is the right way * $Trans =
>> FrontHtmlTransformer::getInstance(); * | * * @package render *
>> @subpackage class * @access public * * @author Daniel T. Gorski, *
>> @since coWiki 0.3.0 */ class FrontHtmlTransformer extends Object {
>> protected static $Instance = null; protected $Context = null, $DocDAO
>> = null, $Response = null, $Registry = null, $Utility = null,
>> $nTopicCount = 0, $aNodeBackup = array(), $bChangedRef = false,
>> $bRepair = true; //
>> --------------------------------------------------------------------
>> /** * Get the unique instance of the class (This class is implemented
>> as * Singleton). * * @access public * @return Object The class
>> instance * * @author Daniel T. Gorski, * @since coWiki 0.3.0 */
>> public function getInstance() { if (!self::$Instance) {
>> self::$Instance = new FrontHtmlTransformer; } return self::$Instance;
>> } //
>> --------------------------------------------------------------------
>> /** * Class constructor * * @access protected * @return void * *
>> @author Daniel T. Gorski, * @since coWiki 0.3.0 */ protected function
>> __construct() { $this->Context = RuntimeContext::getInstance();
>> $this->DocDAO = $this->Context->getDocumentDAO(); $this->Response =
>> $this->Context->getResponse(); $this->Registry =
>> $this->Context->getRegistry(); $this->Utility =
>> $this->Context->getUtility(); } // --- Simple HTML transformer for
>> front page display ----------------- /** * Return the transformed
>> (converted) HTML * * @access public * @param object The node
>> (document object) you are working on * @param boolean Determines
>> whether to 'repair' and store document * references. Repairing means
>> lookup of new * documents by their name (title). * @return string The
>> transformed HTML * * @author Daniel T. Gorski, * @since coWiki 0.3.0
>> */ public function &transform($Node, $bRepair = true) {
>> $this->nTopicCount = 1; $this->bChangedRef = false; $this->bRepair =
>> $bRepair; // Set $this->Registry->set('META_KEYWORDS',
>> $Node->get('keywords')); $sStr = $Node->get('content'); // Look for
>> new and lost documents, gather the names of existing // ones $sStr =
>> preg_replace_callback( '= (.*)=Usi', array($this,
>> '_checkDocReferences'), $sStr ); // If we have found a new or lost
>> document, we have to save // the modified source if
>> ($this->bChangedRef && $this->bRepair) { $Node->set('content',
>> $sStr); // Store modified source
>> $this->Context->getDocumentDAO()->storeContentOnly($Node); } // ---
>> Now the transforming starts -------------------------------- //
>> Transform remarks $sStr = preg_replace_callback( '=(.*)=Usi',
>> array($this, '_transformRemark'), $sStr ); // Transform preformatted
>> text $sStr = preg_replace_callback( '=
>>
>>(.*)
>>
>> =Usi', array($this, '_transformPre'), $sStr ); // Transform code
>> $sStr = preg_replace_callback( '=|(.*)|=Usi', array($this,
>> '_transformCode'), $sStr ); // Transform posting $sStr =
>> preg_replace_callback( '=(.*)=Usi', array($this,
>> '_transformPosting'), $sStr ); // Transform missing document (link)
>> $sStr = preg_replace_callback( '= (.*)=Usi', array($this,
>> '_transformMissingDocument'), $sStr ); // Transform exisisting
>> document (link) $sStr = preg_replace_callback( '= (.*)=Usi',
>> array($this, '_transformExistingDocument'), $sStr ); // Transform
>> link with URI $sStr = preg_replace_callback( '= (.*)=Usi',
>> array($this, '_transformUri'), $sStr ); $sStr =
>> preg_replace_callback( '= (.*)=Usi', array($this, '_transformTopic'),
>> $sStr ); $sStr = preg_replace_callback( '==Usi', array($this,
>> '_transformUri'), $sStr ); $sStr = preg_replace_callback( '==Usi',
>> array($this, '_transformPlugin'), $sStr ); $sStr =
>> preg_replace_callback( '=(.*)=Usi', array($this,
>> '_transformHeading'), $sStr ); $sStr = preg_replace( '==Usi',
>> '{%\1%}', $sStr ); $sStr = preg_replace_callback( '="(.*)"=Usi',
>> array($this, '_transformQuote'), $sStr ); $sStr =
>> preg_replace_callback( '=<(left|center|right)>(.*)=Usi', array($this,
>> '_transformJustification'), $sStr ); // Get rid of remaining XML
>> elements $aArr = array( '', '', '', '', '', '', '', '' ); $sStr =
>> str_replace($aArr, '', $sStr); $sStr = $this->finish($sStr, $Node);
>> return $sStr; } //
>> --------------------------------------------------------------------
>> /** * Check document references callback. * * @access protected *
>> @param array RegEx matches defined in preg_replace_callback(). *
>> @return string Converted string. * * @author Daniel T. Gorski, *
>> @since coWiki 0.3.0 */ protected function
>> &_checkDocReferences(&$aMatches) { $sAlias = $aMatches[3]; // Remove
>> s if any $sRef = str_replace('', '', $aMatches[2]); $sRef =
>> str_replace('', '', $sRef); if ($aMatches[1] == 'strref') { // Check
>> if 'strref' is a reference to an other web. // Means:
>> "webname¦documentname" $aWebRef = explode('¦', $sRef); // Do we have
>> a reference to an other web? if (sizeof($aWebRef) > 1) {
>> $sGlobalStrRef = $this->_checkGlobalStrRef( $aWebRef[0], $aWebRef[1],
>> $sAlias ); return $sGlobalStrRef; } // If the reference does not
>> point to an other web $sLocalStrRef = $this->_checkLocalStrRef($sRef,
>> $sAlias); return $sLocalStrRef; } if ($aMatches[1] == 'idref') {
>> $Node = $this->DocDAO->getNodeById( $sRef, 'node_id, tree_id, name'
>> ); if (is_object($Node)) { // Save document node for further use
>> $this->aNodeBackup[$Node->get('id')] = $Node; $sStr = ' '; // Do we
>> have an alias? if ($Node->get('name') != $sAlias) { $sStr .= $sAlias;
>> } $sStr .= ''; } // Referenced document not found, try history if
>> (!is_object($Node)) { $Node = $this->DocDAO->getHistNodeForId($sRef,
>> 'name'); if (is_object($Node)) { $this->bChangedRef = true; $sStr = '
>> '; // Do we have an alias? if ($Node->get('name') != $sAlias) { $sStr
>> .= $sAlias; } $sStr .= ''; } } // "Deleted document" if
>> (!is_object($Node)) { $this->bChangedRef = true; $sStr =
>> '['.__('I18N_DOC_DELETED_DOCUMENT').']'; } } return $sStr; } //
>> --------------------------------------------------------------------
>> /** * Check references to an other web (global) callback. * * @access
>> protected * @return string Converted string. * * @author Daniel T.
>> Gorski, * @since coWiki 0.3.0 */ protected function
>> &_checkGlobalStrRef(&$sWeb, &$sRef, &$sAlias) { $sWebStr =
>> trim(unescape($sWeb)); $sRefStr = trim(unescape($sRef)); // Find web
>> node by its name $WebNode = $this->DocDAO->getWebByName($sWebStr); //
>> Found web if (is_object($WebNode)) { // Find document by its name (in
>> the referenced web) $Node = $this->DocDAO->getNodeByName( $sRefStr,
>> $WebNode->get('treeId'), 'node_id, name' ); // Found document if
>> (is_object($Node)) { // Save document node for further use
>> $this->bChangedRef = true; $this->aNodeBackup[$Node->get('id')] =
>> $Node; $sStr = ' '; // Do we have an alias? if ($Node->get('name') !=
>> $sAlias) { $sStr .= $sAlias; } $sStr .= ''; } } // Did not found web,
>> keep the link as it is if (!is_object($WebNode) || !is_object($Node))
>> { $sStr = ' '; $sStr .= $sAlias; $sStr .= ''; } return $sStr; } //
>> --------------------------------------------------------------------
>> /** * Check references within a web only (local) callback. * *
>> @access protected * @return string Converted string. * * @author
>> Daniel T. Gorski, * @since coWiki 0.3.0 */ protected function
>> &_checkLocalStrRef(&$sRef, &$sAlias) { // Get current
>> directory/document object $Node = $this->Context->getCurrentNode();
>> $sRefStr = trim(unescape($sRef)); $Node =
>> $this->DocDAO->getNodeByName( $sRefStr, $Node->get('treeId'),
>> 'node_id, tree_id, name' ); // Save document info for further use if
>> (is_object($Node)) { // Save document node for further use
>> $this->bChangedRef = true; $this->aNodeBackup[$Node->get('id')] =
>> $Node; $sStr = ' '; // Do we have an alias? if ($Node->get('name') !=
>> $sAlias) { $sStr .= $sAlias; } $sStr .= ''; } if (!is_object($Node))
>> { // Keep the link as it is $sStr = ' '; $sStr .= $sAlias; $sStr .=
>> ''; } return $sStr; } //
>> --------------------------------------------------------------------
>> /** * Act on missing documents callback. * * @access protected *
>> @return string Converted string. * * @author Daniel T. Gorski, *
>> @since coWiki 0.3.0 */ protected function
>> &_transformMissingDocument(&$aMatches) { // Get current
>> directory/document object $Node = $this->Context->getCurrentNode();
>> // Check if 'strref' is a reference to an other web. // Means:
>> "webname|documentname" $aWebRef = explode('|', $aMatches[1]); // Do
>> we have a reference to an other web? if (sizeof($aWebRef) > 1) {
>> $sStr = '['; $sStr .= __('I18N_DOC_UNRESOLVED_WEB_REFERENCE').': ';
>> $sStr .= $aMatches[1]; $sStr .= ']'; return $sStr; } // Remove s if
>> any $aMatches[1] = str_replace('', '', $aMatches[1]); $aMatches[1] =
>> str_replace('', '', $aMatches[1]); // Missing local document, provide
>> a link to edit $sQuery = 'cmd=' . CMD_NEWDOC . '&newdocname=' .
>> urlencode(unescape($aMatches[1])); if (is_object($Node)) { $sQuery .=
>> '&node=' . $Node->get('parentId') . '&refnode='.$Node->get('id'); }
>> $sStr = ''; // Do we have an alias? $sStr .= ($aMatches[2] == '') ?
>> $aMatches[1] : $aMatches[2]; $sStr .= '
>> <%27;%0A%20%20%20%20%20%20%20%20$sStr%20.=%20$this-%3EResponse-%3EgetControllerHref%28$sQuery%29;%0A%20%20%20%20%20%20%20%20$sStr%20.=%20%20%27>';
>> $sStr .= '*?*'; return $sStr; } //
>> --------------------------------------------------------------------
>> /** * Act on existing documents callback. * * @access protected *
>> @return string Converted string. * * @author Daniel T. Gorski, *
>> @since coWiki 0.3.0 */ protected function
>> &_transformExistingDocument(&$aMatches) { $sStr = ''; // Possible
>> alias if (isset($aMatches[2]) && $aMatches[2] != '') { $sStr .=
>> $aMatches[2]; } else { $sStr .=
>> escape($this->aNodeBackup[$aMatches[1]]->get('name')); } $sStr .= '
>> <%27;%0A%20%20%20%20%20%20%20%20$sStr%20.=%20%20%20%20$this-%3EResponse-%3EgetControllerHref%28%27node=%27.$aMatches%5B1%5D%29;%0A%20%20%20%20%20%20%20%20$sStr%20.=%20%20%27>';
>> return $sStr; } //
>> --------------------------------------------------------------------
>> /** * Act on remarks callback. * * @access protected * @return string
>> Converted string. * * @author Daniel T. Gorski, * @since coWiki 0.3.0
>> */ protected function &_transformRemark(&$aMatches) { $sStr = '';
>> return $sStr; } //
>> --------------------------------------------------------------------
>> /** * Act on preformatted text callback. * * @access protected *
>> @return string Converted string. * * @author Daniel T. Gorski, *
>> @since coWiki 0.3.0 */ protected function &_transformPre(&$aMatches)
>> { $sStr = '
>>
>>' . $aMatches[1] . '
>>
>> '; return $sStr; } //
>> --------------------------------------------------------------------
>> /** * Act on code callback. * * @access protected * @return string
>> Converted string. * * @author Daniel T. Gorski, * @since coWiki 0.3.0
>> */ protected function &_transformCode(&$aMatches) { if
>> ($this->Registry->get('COLOR_CODE_COLORIZE')) { return '
>>
>>'
>> .$this->Utility->colorizeCode($aMatches[1])
>> .'
>>
>> '; } $sStr = '
>>
>>' . $aMatches[1] . '
>>
>> '; return $sStr; } //
>> --------------------------------------------------------------------
>> /** * Act on posting callback. * * @access protected * @return string
>> Converted string. * * @author Daniel T. Gorski, * @since coWiki 0.3.0
>> */ protected function &_transformPosting(&$aMatches) { $sStr = '
>>
>>'
>> .$this->Utility->colorizeQuote($aMatches[1])
>> .'
>>
>> '; return $sStr; } //
>> --------------------------------------------------------------------
>> /** * Execute plugins callback. * * @access protected * @return
>> string Converted string. * * @author Daniel T. Gorski, * @since
>> coWiki 0.3.0 */ protected function &_transformPlugin(&$aMatches) { //
>> Reset Layouter attributes $this->Context->getLayouter()->init(); //
>> Set plugin parameters if (isset($aMatches[2]) && $aMatches[2] != '')
>> { $this->Context->setPluginParam($aMatches[2]); } // Load plugin
>> $sStr =
>> $this->Context->getPluginLoader()->load('Custom'.$aMatches[1]); //
>> Clean plugin data $this->Context->cleanPluginParams(); return $sStr;
>> } //
>> --------------------------------------------------------------------
>> /** * Created (URI) links and obfuscate them callback. * * @access
>> protected * @return string Converted string. * * @author Daniel T.
>> Gorski, * @since coWiki 0.3.0 */ protected function
>> &_transformUri(&$aMatches) { $sStr1 = $aMatches[1]; if
>> (isset($aMatches[2]) && $aMatches[2] != '') { $sStr2 = $aMatches[2];
>> } else { // Because extremely long URIs won't wrap in browser output
>> // and shred the output horizontally, we'll shorten them a bit. // If
>> you change it, also change the PrintHtmlTransformer. // FIX: This
>> behaviour might me toggleable or configureable in // length via the
>> core.conf file. $sStr2 = shortenUrl($aMatches[1]); } $sTarget = '
>> target="_blank"'; // No new window for mailto: URIs if
>> (substr($sStr1, 0, 7) == 'mailto:') { $sTarget = ''; } // obfuscate
>> email if set in config and if no ftp link if
>> ($this->Registry->get('RUNTIME_EMAIL_OBFUSCATE') && substr($sStr1, 0,
>> 7) == 'mailto:') { $sStr1 = obfuscateEmail($sStr1); $sStr2 =
>> obfuscateEmail($sStr2); } $sStr = ''.$sStr2.' <%27.$sStr1.%27>';
>> return $sStr; } //
>> --------------------------------------------------------------------
>> /** * Create a topic callback. * * @access protected * @return string
>> Converted string. * * @author Daniel T. Gorski, * @since coWiki 0.3.0
>> */ protected function &_transformTopic(&$aMatches) { $sUri =
>> $this->Response->getControllerAction(); $sStr = ''; $sStr .=
>> $aMatches[2]; $sStr .= '
>> <%27%20.%20$sUri%20.%20%27#A%27%20.%20$aMatches%5B1%5D%20.%20%27>';
>> return $sStr; } //
>> --------------------------------------------------------------------
>> /** * Create a header (title) callback. * * @access protected *
>> @return string Converted string. * * @author Daniel T. Gorski, *
>> @since coWiki 0.3.0 */ protected function
>> &_transformHeading(&$aMatches) { $sStr = ''; $sStr .=
>> ''.$aMatches[2].''; return $sStr; } //
>> --------------------------------------------------------------------
>> /** * Create an inteded text callback. * * @access protected *
>> @return string Converted string. * * @author Daniel T. Gorski, *
>> @since coWiki 0.3.0 */ protected function
>> &_transformQuote(&$aMatches) { $sStr = '
>>
>> '; $sStr .= $aMatches[1]; $sStr .= '
>>
>> '; return $sStr; } //
>> --------------------------------------------------------------------
>> protected function &_transformJustification(&$aMatches) { $sStr = '
>> '; $sStr .= $aMatches[2]; $sStr .= '
>> '; /* $sStr = '
>>
>> '; $sStr .= $aMatches[2]; $sStr .= '
>>
>> '; */ return $sStr; } //
>> --------------------------------------------------------------------
>> /** * Manipulate the finished string, if necessary * * @access
>> protected * @return string The manipulated string. * * @author Daniel
>> T. Gorski, * @since coWiki 0.3.0 */ protected function
>> &finish(&$sStr, $Node) { return $sStr; } } // of class /* Rachel: Do
>> you like our owl? Deckard: Is it artificial? Rachel: Of course it is.
>> Deckard: Must be expensive. Rachel: Very. Rachel: I'm Rachel.
>> Deckard: Deckard. Rachel: Its seems you feel our work is not a
>> benefit to the public. Deckard: Replicants are like any other
>> machines. They are either a benefit or a hazard. If they're a
>> benefit, it's not my problem. Rachel: May I ask you a personal
>> question? Deckard: Sure. Rachel: Have you ever retired a human, by
>> mistake? Deckard: No. Rachel: But in your position that is a risk?
>> Tyrell: Is this to be an empathy test? Capilary dilation of the so
>> called blush response ... fluctuation of the pupil ... involuntary
>> dilation of the iris ... Deckard: We call it Voight-Kampff for short.
>> Rachel: Mr. Deckard, Dr. Elden Tyrell. Tyrell: Demonstrate it. I want
>> to see it work. Deckard: Were is the subject? Tyrell: I want to see
>> it work on a person. I want to see a negative before I provide you
>> with a positive. Deckard: What's that gonna prove? Tyrell: Indulge
>> me. Deckard: On you? Tyrell: Try her. */ ?>
>> ------------------------------------------------------------------------
>>
>> so we can mail * you a copy immediately. * * @package render *
>> @subpackage class * @access public * * @author Daniel T. Gorski, *
>> @copyright (C) Daniel T. Gorski, {@link http://www.develnet.org} *
>> @license http://www.gnu.org/licenses/gpl.html * @version $Revision:
>> 1.7 $ * */ /** * coWiki - XML pretty HTML printer class * * @package
>> render * @subpackage class * @access public * * @author Daniel T.
>> Gorski, * @since coWiki 0.3.0 * * @todo [D11N] Complete documentation
>> */ class XmlPrettyHtmlPrinter extends Object { protected static
>> $Instance = null; private $rParser = null, $nIndent = null,
>> $sCDataColor = '#000000', $sRet = null, $sWordWrap = null; /** * Get
>> instance * * @access public * @return mixed * * @author Daniel T.
>> Gorski, * @since coWiki 0.3.0 * * @todo [D11N] Check description *
>> @todo [D11N] Check return type */ public function getInstance() { if
>> (!self::$Instance) { self::$Instance = new XmlPrettyHtmlPrinter; }
>> return self::$Instance; } /** * Init * * @access protected * @return
>> void * * @author Daniel T. Gorski, * @since coWiki 0.3.0 * * @todo
>> [D11N] Check description */ protected function __construct() {} /** *
>> Init * * @access public * @return mixed * * @author Daniel T. Gorski,
>> * @since coWiki 0.3.0 * * @todo [D11N] Check description */ public
>> function init() { if (!function_exists('xml_parser_create')) { return
>> false; } $this->rParser = @xml_parser_create(); if (!$this->rParser)
>> { return false; } xml_parser_set_option($this->rParser,
>> XML_OPTION_CASE_FOLDING, 0); xml_parser_set_option($this->rParser,
>> XML_OPTION_SKIP_WHITE, 0); return true; } public function
>> getPretty($sStr, $nWordWrap = 60) { // Check if init() was successful
>> if (!$this->rParser) { return false; } $this->sCDataColor =
>> RuntimeContext::getInstance()->
>> getRegistry()->get('COLOR_CODE_HTML'); $this->nWordWrap = $nWordWrap;
>> xml_set_default_handler( $this->rParser,
>> array(&$this,'xml_default_handler') ); xml_set_element_handler(
>> $this->rParser, array(&$this,'xml_start_handler'),
>> array(&$this,'xml_end_handler') ); xml_set_character_data_handler(
>> $this->rParser, array(&$this,'xml_cdata_handler') ); $this->sRet =
>> ''; if(!xml_parse( $this->rParser, $sStr )){ echo
>> xml_error_string(xml_get_error_code($this->rParser)); } return
>> $this->sRet; } protected function xml_default_handler( &$parser,
>> $sData ) { $this->sRet .= html_entity_decode($sData); } protected
>> function xml_cdata_handler( &$parser, $sData ) { $this->sRet .=
>> $this->_formatCData($sData) ."\n"; } protected function
>> xml_start_handler( &$parser, $sName, $aAttrib ){ $this->nIndent++;
>> $this->sRet .= $this->_getIndent(); $this->sRet .= '<'.$sName;
>> foreach($aAttrib as $attr => $value) { $this->sRet .= '
>> '.$attr.'="'.$value.'"'; } $this->sRet .= '>'."\n"; } protected
>> function xml_end_handler( &$parser, $sName ) { $this->sRet .=
>> $this->_getIndent(); $this->nIndent--; $this->sRet .=
>> '</'.$sName.'>'."\n"; } /** * Get pretty * * @access public * @param
>> string * @param integer * @return mixed * * @author Daniel T. Gorski,
>> * @since coWiki 0.3.0 * * @todo [D11N] Check description * @todo
>> [D11N] Check the parameter type of "$nWordWrap" */ private function
>> _old_getPretty($sStr, $nWordWrap = 60) { // Check if init() was
>> successful if (!$this->rParser) { return false; } $this->sCDataColor
>> = RuntimeContext::getInstance()->
>> getRegistry()->get('COLOR_CODE_HTML'); $this->nWordWrap = $nWordWrap;
>> xml_parse_into_struct($this->rParser, $sStr, $aVal, $aIndex); $sStr =
>> ''; for ($i=0, $n=sizeof($aVal); $i<$n; $i++) { $this->nIndent =
>> $aVal[$i]['level'] - 1; switch ($aVal[$i]['type']) { case 'open':
>> $sStr .= $this->_getIndent(); $sStr .= '<'; $sStr .=
>> $aVal[$i]['tag']; if (isset($aVal[$i]['attributes'])) { $sStr .=
>> $this->_getAttr($aVal[$i]['attributes']); } $sStr .= '>'; $sStr .=
>> "\n"; if (isset($aVal[$i]['value'])) { $sStr .=
>> $this->_formatCData($aVal[$i]['value']); $sStr .= "\n"; } break; case
>> 'close': $sStr .= $this->_getIndent(); $sStr .= '</'; $sStr .=
>> $aVal[$i]['tag']; $sStr .= '>'; $sStr .= "\n"; break; case 'cdata':
>> if (trim($aVal[$i]['value']) == '') { break; } $sStr .=
>> $this->_formatCData($aVal[$i]['value']); $sStr .= "\n"; break; case
>> 'complete': $sStr .= $this->_getIndent(); if
>> (isset($aVal[$i]['value'])) { $sStr .= '<'; $sStr .=
>> $aVal[$i]['tag']; if (isset($aVal[$i]['attributes'])) { $sStr .=
>> $this->_getAttr($aVal[$i]['attributes']); } $sStr .= '>'; $sStr .=
>> "\n"; $sStr .= $this->_formatCData($aVal[$i]['value']); $sStr .=
>> "\n"; $sStr .= $this->_getIndent(); $sStr .= '</'; $sStr .=
>> $aVal[$i]['tag']; $sStr .= '>'; $sStr .= "\n"; } else { $sStr .= '<';
>> $sStr .= $aVal[$i]['tag']; if (isset($aVal[$i]['attributes'])) {
>> $sStr .= $this->_getAttr($aVal[$i]['attributes']); } $sStr .= ' />';
>> $sStr .= "\n"; } break; } } return $sStr; } /** * _get attr * *
>> @access private * @param array * @return string * * @author Daniel T.
>> Gorski, * @since coWiki 0.3.0 * * @todo [D11N] Check description */
>> private function _getAttr($aAttr) { $sStr = ''; foreach ($aAttr as $k
>> => $v) { $sStr .= ' ' . $k . '="' . htmlentities(htmlentities($v)) .
>> '"'; } return $sStr; } /** * _get indent * * @access private *
>> @return mixed * * @author Daniel T. Gorski, * @since coWiki 0.3.0 * *
>> @todo [D11N] Check description * @todo [D11N] Check return type */
>> private function _getIndent() { return str_repeat(' ',
>> $this->nIndent); } /** * _format cdata * * @access private * @param
>> string * @return mixed * * @author Daniel T. Gorski, * @since coWiki
>> 0.3.0 * * @todo [D11N] Check description */ private function
>> _formatCData($sStr) { $aArr = explode("\n", trim($sStr)); $sStr = '';
>> for ($i=0, $n=sizeof($aArr); $i<$n; $i++) { $sData = wordwrap(
>> $aArr[$i], $this->nWordWrap, "\n" . $this->_getIndent() . ' ' );
>> $sStr .= $this->_getIndent(). ' '. $sData ."\n"; } $sStr =
>> rtrim($sStr); if ($sStr == '') { return ''; } $sNewStr = ''; $sNewStr
>> .= htmlentities(htmlentities($sStr)); $sNewStr .= ''; return
>> $sNewStr; } } // of class ?>
>>
>>------------------------------------------------------------------------
>>
>>---------------------------------------------------------------------
>>To unsubscribe, e-mail: [email protected]
>>For additional commands, e-mail: [email protected]
>>
>------------------------------------------------------------------------
>
>These preliminary tests check underscore:
>
>The word _underscored_ should NOT be underscored.
>
>The word __underscored__ should be underscored.
>
>Emphasis using __should not
>extend__ from one paragraph to the next!
>
>The word <u>underscored</u> should be underscored
>
>There should NOT be underscores around _underscored phrase_ in this text
>
>This should be a __underscored phrase__ in the midst of text
>
>This should be a <U>underscored phrase</U> in the midst of text
>
>Unmatched underscores _ should print
>
>Unmatched double underscores __ should also print
>
>Underscores inside_a_word should print
>
>Double Underscores inside__a__word should print
>
>A double underscore __ should be printed as a pair of underscores
>And should not__ continue to the next line!
>
>----
>
>When underscores don't balance they should all print _Three_underscores__ should print
>
>One underscore _ is unbalanced and should print
>Two underscores __ are unbalanced and should print two underscores (no ending emphasis)
>Three underscores ___ are unbalanced and should print three underscores (no ening emphasis)
>Four underscores ____ are balanced and should print two underscores
>Five underscores _____ are not balanced and should print two(?) underscores
>Six underscores ______ are not balanced and should print three(?) underscores
>
>
>------------------------------------------------------------------------
>
>These preliminary tests check bold face:
>
>The word *bold* should NOT be bold.
>
>The word **bold** should be bold.
>
>Emphasis using *should not
>extend* from one paragraph to the next!
>
>The word <b>bold</b> should be bold
>
>There should NOT be asterisks around *bolded phrase* in this text
>
>This should be a **bolded phrase** in the midst of text
>
>This should be a <B>bolded phrase</B> in the midst of text
>
>Unmatched asterisks * should print
>
>Asterisk inside*a*word should print
>
>A double asterisk ** should be printed as a single asterisk
>And should not** continue to the next line!
>
>----
>
>When asterisks don't balance they should all print *Three_asterisks** should print
>
>One asterisk * is unbalanced and should print
>Two asterisks ** are unbalanced and should print two asterisks (no ending emphasis)
>Three asterisks *** are unbalanced and should print three asterisks (no ening emphasis)
>Four asterisks **** are balanced and should print two asterisks
>Five asterisks ***** are not balanced and should print two(?) asterisks
>Six asterisks ****** are not balanced and should print three(?) asterisks
>
>
>------------------------------------------------------------------------
>
>Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between.
>
>Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between.
>
>Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between.
>
>Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between.
>
>Here are some paragraphs with NO blank line between. Here are some paragraphs with NO blank line between. Here are some paragraphs with NO blank line between. Here are some paragraphs with NO blank line between.
>Here are some paragraphs with NO blank line between. Here are some paragraphs with NO blank line between. Here are some paragraphs with NO blank line between. Here are some paragraphs with NO blank line between.
>Here are some paragraphs with NO blank line between. Here are some paragraphs with NO blank line between. Here are some paragraphs with NO blank line between. Here are some paragraphs with NO blank line between.
>
>Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between.
>
><p>Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between. <p>Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between.
>
><p>Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between. Here are some paragraphs with a blank line between.
>
><p>Here are some paragraphs with NO blank line between. Here are some paragraphs with NO blank line between. Here are some paragraphs with NO blank line between. Here are some paragraphs with NO blank line between.</p>
><p>Here are some paragraphs with NO blank line between. Here are some paragraphs with NO blank line between. Here are some paragraphs with NO blank line between. Here are some paragraphs with NO blank line between.</p>
><p>Here are some paragraphs with NO blank line between. Here are some paragraphs with NO blank line between. Here are some paragraphs with NO blank line between. Here are some paragraphs with NO blank line between. </p>
>
>
>
>
>------------------------------------------------------------------------
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: [email protected]
>For additional commands, e-mail: [email protected]
>