Re: [cowiki-dev] Extension to coWiki text formatting
PAUL HANCHETT <[email protected]>
| Newsgroups | gmane.comp.php.cowiki.devel |
|---|---|
| Message-ID | <[email protected]> |
Cool Archie. I've flagged this for me to look at tomorrow. Too late
right now...
Archie Campbell wrote:
> Hi there!
>
> I've refactored the WikiParser and the WikiReverseParser.
>
> The former parses through a progressive window, and the latter uses
> the php xml parser.
>
> It's quite noticeable how much more condensed the code is, now.
>
> I've included 'cowikitest.wiki' so that you can see what the parsers
> are used to thus far.
>
> Please break and comment endlessly.
>
> I'm still aiming to close issues, and here's a candid commentary...
>
> 152 - strikethrough markup. DONE
> 174 - underline markup. DONE
> 195 - add <b>, <i>, <u> tags to markup. ON-REQUEST
> (should be simple enough, if we tolerate <b> -> ** transformation
> as run-of-the-mill)
> 196 - justification markup. DONE
> (er, does <fill> exist in other than dreams?)
> 198 - lists within table cell. DONE
> 208 - monospace markup. DONE
>
> There are doubtless many things I've forgotten, and I know that
> handing over a test file is no excuse for documentation, but I'm not
> in the mood and it's time for bed. I'll document everything later.
>
> Oh, just one thing - colorizeQuote in class.Utility.php is failing to
> find the COLOR_QUOTE_LEVEL Registry keys, and as a result, <posting>
> doesn't do much.
>
> Regards and good-night.
>
> Archie
>
> ------------------------------------------------------------------------
>
> 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. * *
>
> * 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( '=[^&]*=s', $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)>=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(
> '#^([-=\*_/]{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.'>'; }else if(
> preg_match( '#^((([-=\*_/]{1})(?!\3))|[^-=\*_/\&])*#', $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.
> */ ?>
>
>------------------------------------------------------------------------
>
>+ Headings
>++ Headings
>++ **Bold**//heading//
>+++ <right>Right heading</right>
><right>+++ Wrong heading</right>
><br/>
>* <sub>subscript</sub><sup>superscript</sup>
>## http://www.sqlite.org
>* **H**yper//T//ext __T__ransfer **P**rotocol
>## ((Maple)(Mipple))
>* <right>asdf asdf</right>
>* <pre>$_SERVER['DOCUMENT_ROOT'] and '//includes//'</pre>
>* <code>$_SERVER['DOCUMENT_ROOT'] and '//includes//'</code>
><br/>
><pre>$_SERVER['DOCUMENT_ROOT'] and '//includes//'</pre>
><sub>**sub**script</sub><sup>//super//script</sup>
><plugin Example>
><br/>
>Double-emphatic, e.g. -- users must be careful.
><table>
>|+ Caption
>|-
>|
>multiline
>|-style="text-align:right"
>|
>td2
>|
>td3
></table>
>
>
>**emphasis** //italics// __underlined__ --struckout--
>
>**//emit//** //**item**//
>
>**__emun__** __**unem**__
>
><right>//__itun__// __//unit//__<br/>
>//**__itemun__**// //__**itunem**__//</right>
>
>**--__emstun__--** --//__stitun__//--
>
>--//**stitem**//-- --**//stemit//**--
>
>**blah blah blah set-piece blah blah malt-whiskey blah blah**
>
>**Emphasis<noop>**</noop>stillemphatic**
># **Li<noop>**</noop>st**
># List
>
><table irrelevant="true">
>|-
>| Cell 1, row 1
>|rowspan=2|
>* list
>* list2
>| Cell 3, row 1
>|-
>| content
>| Cell 3, row 2
></table>
>
>
><table border="1" cellpadding="2">
>|+Multiplication table
>|-
>! x !! 1 !! 2 !! 3
>|-
>! 1
>| 1 || 2 || 3
>|-
>! 2
>| 2 || 4 || 6
>|-
>! 3
>| 3 || 6 || 9
>|-
>! 4
>| 4 || 8 || 12
>|-
>! 5
>| 5 || 10 || 15
></table>
>
>
>
> ------------------------------------------------------------------------
>
> 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': $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': $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) case 'strike':
> $this->sContent .= "--"; break; case 'tt': $this->sContent .= "==";
> break; case 'b': $this->sContent .= "**"; break; case 'u':
> $this->sContent .= "__"; break; case 'i': $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':
> if($this->sContent!=''){ $this->appendRow($this->sContent); } 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( ); } } 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': $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': $this->sContent .= "--";
> break; case 'tt': $this->sContent .= "=="; break; case 'b':
> $this->sContent .= "**"; break; case 'u': $this->sContent .= "__";
> break; case 'i': $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){ echo "Don't Panic :" . $sData . "\n"; } } /** *
> 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 ?>
>
>------------------------------------------------------------------------
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: [email protected]
>For additional commands, e-mail: [email protected]
>