Difference between revisions of "Xmlwiki.php"

From Organic Design wiki
Line 91: Line 91:
  
 
# Try to convert articles to DOM objects
 
# Try to convert articles to DOM objects
xwDomificateArticle($xwArticle);
+
xwDomificateArticle($xwArticle, $xwArticleTitle);
xwDomificateArticle($xwArticleMeta);
+
xwDomificateArticle($xwArticleMeta, "xmlwiki:$xwArticleTitle");
xwDomificateArticle($xwUserMeta);
+
xwDomificateArticle($xwUserMeta, "xmlwiki:$xwUserName");
  
# If successful, get security info
+
# Security
if (is_object($xwArticle)) {
+
if (is_object($xwArticleMeta)) {
 
#$xwUserGroups[] = $xwUserName;
 
#$xwUserGroups[] = $xwUserName;
 
# can't write to xmlwiki:security unless admin
 
# can't write to xmlwiki:security unless admin
Line 146: Line 146:
 
$wgOut->output();
 
$wgOut->output();
 
$wikiOut = ob_get_contents();
 
$wikiOut = ob_get_contents();
$xwUserLinks = preg_match('/id="p-personal"(.+?)<\/div>/s', $out, $m) ? xwExtractHrefs($m[1]) : array();
+
$xwUserLinks = preg_match('/id="p-personal"(.+?)<\/div>/s', $wikiOut, $m) ? xwExtractHrefs($m[1]) : array();
$xwArticleLinks = preg_match('/id="p-cactions"(.+?)<\/div>/s', $out, $m) ? xwExtractHrefs($m[1]) : array();
+
$xwArticleLinks = preg_match('/id="p-cactions"(.+?)<\/div>/s', $wikiOut, $m) ? xwExtractHrefs($m[1]) : array();
 
ob_end_clean();
 
ob_end_clean();
  
Line 158: Line 158:
 
}
 
}
  
# If normal or raw, transform current article
+
# If view, extract the content to transform from the wiki-output
if ($xwRaw || $xwView) xwTransformArticle($xwArticle);
+
if ($xwView) xwTransformArticle($xwArticle);
 +
# if (preg_match('/^(.+<!-- start content -->\\s*<p>)(.+)(<\\/p>\\s*<!-- Saved.+<!-- end content -->.+)$/ms', $wikiOut, $m)) {
 +
# if (preg_match('/^(.+<!-- start content -->)(.+)(<!-- end content -->.+)$/ms', $wikiOut, $m)) {
 +
# $xwArticle = html_entity_decode($m[2]);
 +
# xwDomificateArticle($xwArticle, $xwArticleTitle);
 +
# xwTransformArticle($xwArticle);
 +
# } else xwMessage('xmlWiki couldn\'t match view-output!', 'red');
 +
# }
  
 
# If preview, extract the content to transform from the wiki-output
 
# If preview, extract the content to transform from the wiki-output
 
elseif ($xwPreview) {
 
elseif ($xwPreview) {
 
if (preg_match('/^(.+<!-- start content -->.+Remember.+saved!.+?<\\/p>.+?<p>)(.+?)(<\\/p>.+<!-- end content -->.+)$/s', $wikiOut, $m)) {
 
if (preg_match('/^(.+<!-- start content -->.+Remember.+saved!.+?<\\/p>.+?<p>)(.+?)(<\\/p>.+<!-- end content -->.+)$/s', $wikiOut, $m)) {
# We have to transform the content in wikiOutput not the article itself
 
 
$xwArticle = html_entity_decode($m[2]);
 
$xwArticle = html_entity_decode($m[2]);
xwDomificateArticle($xwArticle);
+
xwDomificateArticle($xwArticle, $xwArticleTitle);
 
xwTransformArticle($xwArticle);
 
xwTransformArticle($xwArticle);
 
} else xwMessage('xmlWiki couldn\'t match preview-output!', 'red');
 
} else xwMessage('xmlWiki couldn\'t match preview-output!', 'red');
Line 175: Line 181:
 
elseif (false && $xwSave && count($xwArticlePublish)) {
 
elseif (false && $xwSave && count($xwArticlePublish)) {
 
xwMessage('Publishing...', 'purple');
 
xwMessage('Publishing...', 'purple');
xwTransformArticle($xwArticle);
+
xwTransformArticle($xwArticle, $xwArticleTitle);
 
# Publish each item
 
# Publish each item
 
foreach ($xwArticlePublish as $url) {
 
foreach ($xwArticlePublish as $url) {
Line 189: Line 195:
 
# This is probably a special page
 
# This is probably a special page
 
# - we'll just extract the content and leave as-is
 
# - we'll just extract the content and leave as-is
if (preg_match('/^(.+<!-- start content -->)(.+)(<!-- end content -->.+)$/ms', $wikiOut, $m))
+
if (preg_match('/^(.+<!-- start content -->)(.+)(<!-- end content -->.+)$/ms', $wikiOut, $m)) {
 
$xwArticle = $m[2];
 
$xwArticle = $m[2];
else xwMessage('xmlWiki couldn\'t match special-output!', 'red');
+
} else xwMessage('xmlWiki couldn\'t match special-output!', 'red');
 
}
 
}
  
 
# Apply xmlwiki-environment-transforms to output unless 'raw' requested
 
# Apply xmlwiki-environment-transforms to output unless 'raw' requested
 
if (!$xwRaw) {
 
if (!$xwRaw) {
$xwArticle = xwTransformGeshi();
+
xwTransformGeshi();
$xwArticle = xwTransformAddMessages();
+
xwTransformAddMessages();
$xwArticle = xwTransformPageLayout();
+
xwTransformPageLayout();
$xwArticle = xwTransformPageStyle();
+
xwTransformPageStyle();
 
}
 
}
  
Line 242: Line 248:
 
# Convert passed article to a DOM object
 
# Convert passed article to a DOM object
 
# - Article is unchanged if not valid XML
 
# - Article is unchanged if not valid XML
function xwDomificateArticle(&$article) {
+
function xwDomificateArticle(&$article, $id = '') {
 +
xwMessage("Domificating $id");
 
ob_start();
 
ob_start();
 
if ($dom = domxml_open_mem($article)) $article = $dom; else {
 
if ($dom = domxml_open_mem($article)) $article = $dom; else {
 
# Could not convert, extract error messages from output
 
# Could not convert, extract error messages from output
xwMessage("Domification failed:", 'red');
+
xwMessage("&nbsp;&nbsp;&nbsp;Failed :-(", 'red');
 
$err = preg_replace("/<.+?>/", "", ob_get_contents());
 
$err = preg_replace("/<.+?>/", "", ob_get_contents());
 
$err = preg_replace('/ in .+? on line.+?[0-9]+/', '', $err);
 
$err = preg_replace('/ in .+? on line.+?[0-9]+/', '', $err);
 
$err = preg_replace('/Warning.+?\\(\\): /', '', $err);
 
$err = preg_replace('/Warning.+?\\(\\): /', '', $err);
foreach (split("\n", $err) as $msg) if ($msg) xwMessage($msg, 'red');
+
foreach (split("\n", $err) as $msg) if ($msg) xwMessage("&nbsp;&nbsp;&nbsp;$msg", 'red');
 
}
 
}
 
ob_end_clean();
 
ob_end_clean();
Line 257: Line 264:
 
# Reduce article to a string if it's a DOM object
 
# Reduce article to a string if it's a DOM object
 
# - ie if all xslt's had xml-output-method, or it was a non-xmlwiki:* dtd
 
# - ie if all xslt's had xml-output-method, or it was a non-xmlwiki:* dtd
function xwUndomificateArticle(&$article) {
+
function xwUndomificateArticle(&$article, $id = '') {
 
if (!is_object($article)) return false;
 
if (!is_object($article)) return false;
xwMessage('Undomificating');
+
xwMessage("Undomificating $id");
 
# Validate, report errors
 
# Validate, report errors
 
# xwApplyXSLT($article, $xslt) if xml referrs one
 
# xwApplyXSLT($article, $xslt) if xml referrs one
Line 270: Line 277:
 
# - if output-method is html, article will get stringified
 
# - if output-method is html, article will get stringified
 
function xwApplyXSLT(&$article, &$xslt) {
 
function xwApplyXSLT(&$article, &$xslt) {
# - should probably trap output same as domify
+
ob_start();
 
$tObject = domxml_xslt_stylesheet($xslt);
 
$tObject = domxml_xslt_stylesheet($xslt);
 
$tResult = $tObject->process($article);
 
$tResult = $tObject->process($article);
Line 276: Line 283:
 
if (preg_match('/<xsl:output +?method *= *"html"/i', $xslt)) {
 
if (preg_match('/<xsl:output +?method *= *"html"/i', $xslt)) {
 
xwMessage('xwApplyXSLT() is htmlifying');
 
xwMessage('xwApplyXSLT() is htmlifying');
xwMessage("NOTE! Messages are not content - they can only be transformed by CSS!", 'purple');
+
xwMessage("&nbsp;&nbsp;&nbsp;NOTE! Messages are not content - they can only be transformed by CSS!", 'purple');
 
$tResult = $tObject->result_dump_mem($tResult);
 
$tResult = $tObject->result_dump_mem($tResult);
 
}
 
}
 +
$err = preg_replace("/<.+?>/", "", ob_get_contents());
 +
$err = preg_replace('/ in .+? on line.+?[0-9]+/', '', $err);
 +
$err = preg_replace('/Warning.+?\\(\\): /', '', $err);
 +
foreach (split("\n", $err) as $msg) if ($msg) xwMessage("&nbsp;&nbsp;&nbsp;$msg", 'red');
 +
ob_end_clean();
 
if ($tResult) $article = $tResult; else return false;
 
if ($tResult) $article = $tResult; else return false;
 
return true;
 
return true;
Line 298: Line 310:
  
 
# Loop thru transforms applying each
 
# Loop thru transforms applying each
xwMessage('Applying object\'s transforms...');
 
 
foreach ($aRoot->get_elements_by_tagname('transform') as $tElement) {
 
foreach ($aRoot->get_elements_by_tagname('transform') as $tElement) {
 
$tName = $tElement->get_content();
 
$tName = $tElement->get_content();
Line 306: Line 317:
 
$tName = $m[1];
 
$tName = $m[1];
 
if ($tResult = @call_user_func("xwTransform_$tName", $article)) $article = $tResult;
 
if ($tResult = @call_user_func("xwTransform_$tName", $article)) $article = $tResult;
else xwMessage("Unknown transform \"$tName\"!", 'red');
+
else xwMessage("&nbsp;&nbsp;&nbsp;Unknown transform \"$tName\"!", 'red');
 
}
 
}
 
else {
 
else {
Line 328: Line 339:
 
}
 
}
 
}
 
}
else xwMessage("No such transform-article \"$tName\"!", 'red');
+
else xwMessage("&nbsp;&nbsp;&nbsp;No such transform-article \"$tName\"!", 'red');
 
}
 
}
 
}
 
}
Line 389: Line 400:
 
<b><font size=5 color=white face=helvetica>$xwArticleTitle</font></b>
 
<b><font size=5 color=white face=helvetica>$xwArticleTitle</font></b>
 
<tr><td>
 
<tr><td>
<!-- start content -->
+
<!-- xmlwiki:start-content -->
 
$xwArticle
 
$xwArticle
<!-- end content -->
+
<!-- xmlwiki:end-content -->
 
</table></table></body></html>";
 
</table></table></body></html>";
 
}
 
}
Line 398: Line 409:
 
function xwTransformPageStyle() {
 
function xwTransformPageStyle() {
 
global $xwArticle;
 
global $xwArticle;
$xwArticle = preg_replace("/(<p class=\"xwMessage\">)(.+?)(<\\/p>)/", '<table><tr><td bgcolor="#cccccc">$2</table>', $xwArticle);
+
$xwArticle = preg_replace("/(<p class=\"xwMessage\">)(.+?)(<\\/p>)/", '<table cellpadding=1 cellspacing=1><tr><td bgcolor=white><b><font face=tahoma size=1>&nbsp;&nbsp;&nbsp;$2&nbsp;&nbsp;&nbsp;</font></b></table>', $xwArticle);
 
}
 
}
  

Revision as of 04:09, 8 June 2005

<php> <?php

  1. xmlWiki - MediaWiki XML Hack
  2. Nad - 2005-05-18
  1. Maybe only use XML transforms
  2. - use PHP via processing instructions
  1. DTD's
  2. - using xmlwiki:document, xmlwiki:image etc is for validation purposes
  3. - xwTransformArticle is generic and cares only for xmlwiki:*
  1. CSS STYLES
  2. the are accessed via http, so their article url can be referred to locally in the html
  3. - maybe make the default request 'raw' and must specifically request 'view'
  4. - the default CSS's should deal with geshi colour/tab etc
  1. LATER:
  2. allow XIncludes to build large docs from others
  3. allow docBook and DSSSL content
  1. ---------------------------------------------------------------------------------------------------------------------- #
  2. SCRIPT CONTENTS
  1. INIT
  2. - do admin and exit if running directly
  3. - include geshi
  4. - get wiki & request environment
  5. - get article (as an object if possible)
  6. - get user-info
  7. - get object-specific info (perms, doc-root, doc-type)
  8. - build env (if action=raw, env is empty)
  9. INPUT
  10. - deny access if !writable
  11. - currently not doing anything else
  12. OUTPUT
  13. - trap MediaWiki output
  14. - extract links (not used yet)
  15. - apply security
  16. - transform for raw, view, preview
  17. - if saving, do publishing
  18. - render output & messages
  19. ARTICLE FUNCTIONS
  20. - get article content
  21. - get article type
  22. - domificate article
  23. - transform article
  24. TRANSFORMS (Temp - will be separare articles)
  25. - document transforms
  26. - image transforms
  27. - layout transforms
  28. - database table transforms
  29. - transform object to php-nav-tree
  30. - geshi syntax highlighting
  31. FUNCTIONS
  32. - etxract hrefs from text
  33. - message/log
  1. ---------------------------------------------------------------------------------------------------------------------- #
  2. INIT
  1. Exit if not included from index.php

if (!eregi("index\\.php", $_SERVER['SCRIPT_NAME'])) die('xmlwiki.php must be included from index.php!');

  1. Geshi syntax highlighting is now called from xmlWiki and should be removed from LocalSettings.php

require_once("extensions/GeshiSyntaxHighlight.php");

  1. Otherwise set up xmlWiki global environment ready for input and output processing

$xwMessages = array(); $xwArticleCache = array();

$xwEdit = isset($_REQUEST['action']) && ($_REQUEST['action'] == 'edit'); $xwView = (!isset($_REQUEST['action']) || (isset($_REQUEST['action']) && ($_REQUEST['action'] == 'view'))); $xwRaw = isset($_REQUEST['action']) && ($_REQUEST['action'] == 'raw'); $xwPreview = isset($_REQUEST['wpPreview']); $xwSave = isset($_REQUEST['wpSave']); $xwUserLinks = array(); $xwArticleLinks = array();

$xwArticleTitle = $wgTitle->getPrefixedURL(); $xwArticle = $wgArticle->getContent(false); $xwArticleMeta = xwArticleContent("xmlwiki:$wgTitle"); $xwArticlePublish = null;

$xwUserName = $wgUser->mName; $xwUserMeta = xwArticleContent("xmlwiki:$xwUserName");

$xwSecurity = xwArticleContent("xmlwiki:Security"); # holds group membership info $xwReadable = true; $xwWritable = true;

  1. Try to convert articles to DOM objects

xwDomificateArticle($xwArticle, $xwArticleTitle); xwDomificateArticle($xwArticleMeta, "xmlwiki:$xwArticleTitle"); xwDomificateArticle($xwUserMeta, "xmlwiki:$xwUserName");

  1. Security

if (is_object($xwArticleMeta)) { #$xwUserGroups[] = $xwUserName; # can't write to xmlwiki:security unless admin #$xwReadable = null; #$xwWritable = null;

# Get publish list #$root = $xwArticle->document_element(); #$publist = $root->get_elements_by_tagname('publish'); #if (count($publist)) $publist = $publist[0]->dump_mem(true); #$publist = split(',', $publist);

}

  1. ---------------------------------------------------------------------------------------------------------------------- #
  2. INPUT
  1. No input processing for now
  2. - used later for custom edit forms (database table article will need it)
  1. Parse and process input from forms

function xwProcessInput() {

global $xwArticle, $xwArticleTitle; global $xwReadable, $xwWritable, $xwMessages; global $xwSave;

# If article is being updated, if ($xwSave) { #global $_POST; #if (!$xwReadable || !$xwWritable) die("I'm sorry Dave, I'm afraid I can't do that."); }

}

  1. ---------------------------------------------------------------------------------------------------------------------- #
  2. OUTPUT
  1. Generate new output to send back to browser

function xwProcessOutput() {

global $wgOut; global $xwArticle, $xwArticleTitle, $xwArticlePublish; global $xwView, $xwPreview, $xwSave, $xwRaw, $xwUserLinks, $xwArticleLinks; global $xwUserName, $xwUserMeta, $xwReadable, $xwWritable, $xwMessages;

# First trap Wiki output and extract content and links (should use $ver like Admin Page) ob_start(); $wgOut->output(); $wikiOut = ob_get_contents(); $xwUserLinks = preg_match('/id="p-personal"(.+?)<\/div>/s', $wikiOut, $m) ? xwExtractHrefs($m[1]) : array(); $xwArticleLinks = preg_match('/id="p-cactions"(.+?)<\/div>/s', $wikiOut, $m) ? xwExtractHrefs($m[1]) : array(); ob_end_clean();

# Security if (!$xwReadable) { # change output to access denied message if !readable } if (!$xwWritable) { # remove edit link }

# If view, extract the content to transform from the wiki-output if ($xwView) xwTransformArticle($xwArticle);

  1. if (preg_match('/^(.+\\s*

    )(.+)(<\\/p>\\s*.+)$/ms', $wikiOut, $m)) {

  2. if (preg_match('/^(.+)(.+)(.+)$/ms', $wikiOut, $m)) {
  3. $xwArticle = html_entity_decode($m[2]);
  4. xwDomificateArticle($xwArticle, $xwArticleTitle);
  5. xwTransformArticle($xwArticle);
  6. } else xwMessage('xmlWiki couldn\'t match view-output!', 'red');
  7. }

# If preview, extract the content to transform from the wiki-output elseif ($xwPreview) {

if (preg_match('/^(.+.+Remember.+saved!.+?<\\/p>.+?

)(.+?)(<\\/p>.+.+)$/s', $wikiOut, $m)) { $xwArticle = html_entity_decode($m[2]); xwDomificateArticle($xwArticle, $xwArticleTitle); xwTransformArticle($xwArticle); } else xwMessage('xmlWiki couldn\'t match preview-output!', 'red'); } # If saving, check the publishing list # - pblish info should be in $articleMeta elseif (false && $xwSave && count($xwArticlePublish)) { xwMessage('Publishing...', 'purple'); xwTransformArticle($xwArticle, $xwArticleTitle); # Publish each item foreach ($xwArticlePublish as $url) { if ($FH = fopen($url, 'a')) { fwrite($FH, $xwArticle); fclose($FH); xwMessage("Article published to $url"); } else xwMessage("Failed to publish to $url", 'red'); } } else { # This is probably a special page # - we'll just extract the content and leave as-is if (preg_match('/^(.+)(.+)(.+)$/ms', $wikiOut, $m)) { $xwArticle = $m[2]; } else xwMessage('xmlWiki couldn\'t match special-output!', 'red'); } # Apply xmlwiki-environment-transforms to output unless 'raw' requested if (!$xwRaw) { xwTransformGeshi(); xwTransformAddMessages(); xwTransformPageLayout(); xwTransformPageStyle(); } # And finally, output the sunovabitch print $xwArticle; }

  1. ---------------------------------------------------------------------------------------------------------------------- #
  2. ARTICLE FUNCTIONS
  1. Retreive wiki-article as raw text

function xwArticleContent($articleTitle) { # Return with results if already cached global $xwArticleCache; if (isset($xwArticleCache[$articleTitle])) return $xwArticleCache[$articleTitle]; # Get wiki article content (or use global if no article passed) if ($article = new Article(Title::newFromText($articleTitle))) $article = $article->getContent(false); if ($article == '(There is currently no text in this page)') return false; if ($articleTitle) $xwArticleCache[$articleTitle] = $article; return $article; }

  1. Decide kind of article from content and title

function xwArticleType($title, $article) { # Name based matches if (ereg('\\.php$', $title)) return 'php'; if (ereg('\\.css$', $title)) return 'css'; if (ereg('\\.as$', $title)) return 'actionscript'; if (ereg('\\.py$', $title)) return 'python'; if (ereg('\\.java$', $title)) return 'java'; if (ereg('\\.(cpp)|(h)$', $title)) return 'cpp'; if (ereg('\\.js$', $title)) return 'javascript'; if (ereg('\\.css$', $title)) return 'css'; # Content based matches if (preg_match('/^<\\?xml.+?\\?>\\s*<xsl:stylesheet/', $article)) return 'xslt'; if (ereg('^<\\?xml', $article)) return 'xml'; if (ereg('^<\\?html', $article)) return 'html4strict'; if (ereg('^#![/a-zA-Z0-9]+\\/perl', $article)) return 'perl'; if (ereg('^#![/a-zA-Z0-9]+sh', $article)) return 'bash'; }

  1. Convert passed article to a DOM object
  2. - Article is unchanged if not valid XML

function xwDomificateArticle(&$article, $id = ) { xwMessage("Domificating $id"); ob_start(); if ($dom = domxml_open_mem($article)) $article = $dom; else { # Could not convert, extract error messages from output xwMessage("   Failed :-(", 'red'); $err = preg_replace("/<.+?>/", "", ob_get_contents()); $err = preg_replace('/ in .+? on line.+?[0-9]+/', , $err); $err = preg_replace('/Warning.+?\\(\\): /', , $err); foreach (split("\n", $err) as $msg) if ($msg) xwMessage("   $msg", 'red'); } ob_end_clean(); }

  1. Reduce article to a string if it's a DOM object
  2. - ie if all xslt's had xml-output-method, or it was a non-xmlwiki:* dtd

function xwUndomificateArticle(&$article, $id = ) { if (!is_object($article)) return false; xwMessage("Undomificating $id"); # Validate, report errors # xwApplyXSLT($article, $xslt) if xml referrs one # Convert DOM back to XML $article = $article->dump_mem(true); return true; }

  1. Apply XSLT to article-dom
  2. - if output-method is html, article will get stringified

function xwApplyXSLT(&$article, &$xslt) { ob_start(); $tObject = domxml_xslt_stylesheet($xslt); $tResult = $tObject->process($article); # If output-method is html, use XSLT's dump_mem to create an html-string if (preg_match('/<xsl:output +?method *= *"html"/i', $xslt)) { xwMessage('xwApplyXSLT() is htmlifying'); xwMessage("   NOTE! Messages are not content - they can only be transformed by CSS!", 'purple'); $tResult = $tObject->result_dump_mem($tResult); } $err = preg_replace("/<.+?>/", "", ob_get_contents()); $err = preg_replace('/ in .+? on line.+?[0-9]+/', , $err); $err = preg_replace('/Warning.+?\\(\\): /', , $err); foreach (split("\n", $err) as $msg) if ($msg) xwMessage("   $msg", 'red'); ob_end_clean(); if ($tResult) $article = $tResult; else return false; return true; }

  1. Transform an article object
  2. - Article must be an xmlwiki:* DOM object to be transformable
  3. - Article is undomificated if DOM but not xmlwiki:*
  4. - Article remains unchanged if not DOM

function xwTransformArticle(&$article) { # Get doc info or exit if not one of ours if (!is_object($article)) return false; $aType = $article->doctype(); $aType = $aType->name; $aRoot = $article->document_element(); if (!ereg('^xmlwiki:', $aType)) return false; xwMessage("Transforming doctype \"$aType\""); # Loop thru transforms applying each foreach ($aRoot->get_elements_by_tagname('transform') as $tElement) { $tName = $tElement->get_content(); if (ereg('^(.+)\\(\\)$', $tName, $m)) { # Transform is "name()" format, try to execute from a local function declaration # - probably this is not needed soon, only accept article-transforms $tName = $m[1]; if ($tResult = @call_user_func("xwTransform_$tName", $article)) $article = $tResult; else xwMessage("   Unknown transform \"$tName\"!", 'red'); } else { # Get transform-article and apply to $article if ($tText = xwArticleContent($tName)) { # Get transform type $tType = xwArticleType($tName, $tText); if ($tType == 'xslt') xwApplyXSLT($article, $tText); elseif ($tType == 'php') { # php, check perms and execute (trapping errors for reporting - unless fatal) if ($perms_check_out_ok) { ob_start(); eval($tText); $err = preg_replace("/<.+?>/", "", ob_get_contents()); foreach (split("\n", $err) as $msg) if ($msg) xwMessage($msg, 'red'); ob_end_clean(); } } elseif ($tType == 'css') { # include CSS ref in content } } else xwMessage("   No such transform-article \"$tName\"!", 'red'); } } # If article is still a DOM object, stringify it again xwUndomificateArticle($article); return true; }

  1. ---------------------------------------------------------------------------------------------------------------------- #
  2. TRANSFORMS
  3. - these transforms are only temporarily here - they should be articles
  4. - we should use DTD's for each kind: document, image, layout, table
  1. Include Geshi syntax highlighting
  2. - Remember, Geshi should be removed from LocalSettings.php

function xwTransformGeshi() { xwMessage("Hi, Geshi here, sorry I'm not currently functional."); return; global $xwArticle, $xwArticleTitle; # First check for entire article highlighting # Highlight entire article if xwLang has been set if ($xwLang) { $xwGeshi = new GeSHi($xwArticle, $xwLang, "extensions/geshi/geshi"); $xwGeshi->set_tab_width(4); $geshi->set_keywords_style(1, 'font-weight: 100;', true); #$geshi->set_comments_style #$geshi->set_escape_char_style #$geshi->set_brackets_style #$geshi->set_strings_style #$geshi->set_numbers_style #$geshi->set_methods_style #$geshi->set_symbols_style #$geshi->set_regexps_style #$geshi->set_script_style #$xwArticle = $xwGeshi->parse_code(); } }

  1. Append messages to content

function xwTransformAddMessages() { global $xwArticle, $xwMessages; $xwArticle .= join("\n", $xwMessages); }

  1. This is the default postTransform which surrounds the page
  2. - most transforms do not reference the global-current-article like this one
  3. - this is a special transform, because it affects all pages, even special pages

function xwTransformPageLayout() { global $xwArticle, $xwArticleTitle, $xwUserLinks, $xwArticleLinks; xwMessage("Hi defaultTransform here :-)"); $xwArticle = "

xmlWiki - $xwArticleTitle
".join('
',$xwArticleLinks)."
\"xmlWiki\"
$xwArticleTitle
$xwArticle

"; }

  1. Apply styling to page

function xwTransformPageStyle() { global $xwArticle; $xwArticle = preg_replace("/(

)(.+?)(<\\/p>)/", '

   $2   

', $xwArticle);

}

function xwTransform_document_xxx() { # documents are built from parts, # the parts are a tree in its body # includes 'edit' link for each (like section, and also like table) }

  1. A document object is finalised by transforming it to its body's text

function xwTransform_document_render() { global $xwArticle; $root = $xwArticle->document_element(); $body = $root->get_elements_by_tagname('body'); if (count($body)) $xwArticle = $body[0]->dump_mem(true); }

function xwTransform_layout_xxx() { # for layout container style article }

function xwTransform_image_xxx() { # object contains properties for loading and transforming an image # image needs no body # Get the global image on which imageTransforms work global $xwArticleImage; }

  1. Converts the in-memory-working image into article content

function xwTransform_image_render() { global $xwArticle, $xwArticleTitle, $xwArticleImage, $xwRaw; if ($xwRaw) { # render article directly if 'raw' request imagePng($xwArticleImage); # Clear article or it will render as xml $xwArticle = ; # set header to image header("Content-type: image/png"); }

else { # the raw image is not being requested, render image in-page with info instead $xwArticle = "<img src=\"$xwArticleTitle?action=raw\" alt=\"$xwArticleTitle\"/>"; } }

  1. A table object is an interface to a database table
  2. - this can't be implimented fully until the 'edit' hook is done
  3. - the query result is a list in document body, so any normal document transforms can follow it

function xwTransform_table_xxx() { # - view lists the table/result with links to edit each (like a normal composition-doc) # - also form for create/edit/edlete # - result rows are in document body (just like a content-tree in a document would be)

# NODE-LIKE-DB

# - if all tables have GUID for pri-key, # - and all have time/duration (or cycle?), # - and we have master list of cols-to-table # - then we could create a meta-query (resulting in pri-key-list of all matches)

}

  1. Transform the body content to a xtml/javascript tree

function xwTransform_tree() { # import php-tree-component }

  1. ---------------------------------------------------------------------------------------------------------------------- #
  2. UTILITY FUNCTIONS
  1. Return a list of the hrefs found in the passed content

function xwExtractHrefs($content) { preg_match_all('/(<a.+?<\/a>)/', $content, $match); return $match[1]; }

  1. Add message to queue

function xwMessage($msg, $col = 'blue') { global $xwMessages;

return $xwMessages[] = "

$msg

\n";

}

?> </php>