Difference between revisions of "Xmlwiki.php"

From Organic Design wiki
Line 32: Line 32:
  
 
# Ensure our xwskin is active
 
# Ensure our xwskin is active
$wgUser->setOption('skin', 'xwskin');
+
#$wgUser->setOption('skin', 'xwskin');
  
 
# Otherwise set up xmlWiki global environment ready for input and output processing
 
# Otherwise set up xmlWiki global environment ready for input and output processing
Line 95: Line 95:
 
# OUTPUT
 
# OUTPUT
  
# Generate new output to send back to browser
+
# Generate output to send back to client
# - if article is not XML, then wikiOut is used
+
# - if article is not XML, then wiki's parsed content is used
function xwProcessOutput(&$tmpl) {
+
function xwProcessOutput() {
  
global $wgOut, $wgUser;
 
 
global $xwArticle, $xwArticleXML, $xwArticleTitle, $xwReadable, $xwWritable;
 
global $xwArticle, $xwArticleXML, $xwArticleTitle, $xwReadable, $xwWritable;
global $xwView, $xwPreview, $xwSave, $xwRaw, $xwUserLinks, $xwArticleLinks;
+
global $xwTemplate, $xwView, $xwPreview, $xwSave, $xwRaw, $xwUserLinks, $xwArticleLinks;
  
xwDomificateWiki($tmpl);
 
return;
 
 
# If no read-access, clear output
 
# If no read-access, clear output
if (!$xwReadable) {
+
if ($xwReadable) {
$wikiOut = $xwArticle = '';
+
global $wgOut, $wgUser;
 +
$skin = $wgUser->getSkin();
 +
$wikiOut = &$wgOut->mBodytext;
 +
}
 +
else {
 +
$xwArticle = $wikiOut = '';
 
xwMessage('Unable to comply.', 'red');
 
xwMessage('Unable to comply.', 'red');
 
}
 
}
 
 
# If no write-access, remove edit link
 
# If no write-access, remove edit link
 
if (!$xwWritable) unset($xwArticleLinks['Edit']);
 
if (!$xwWritable) unset($xwArticleLinks['Edit']);
Line 116: Line 117:
 
# If Viewing,
 
# If Viewing,
 
# - if DOM, transform else extract marked-up content from wikiOut
 
# - if DOM, transform else extract marked-up content from wikiOut
# save-match: (preg_match('/^(.+<!-- start content -->\\s*<p>)(.+)(<\\/p>\\s*<!-- Saved.+<!-- end content -->.+)$/ms', $wikiOut, $m))
 
 
if ($xwView) {
 
if ($xwView) {
 
xwMessage('Viewing Page...');
 
xwMessage('Viewing Page...');
 
if (is_object($xwArticle)) xwTransformArticle($xwArticle);  
 
if (is_object($xwArticle)) xwTransformArticle($xwArticle);  
else if (preg_match('/^(.+<!-- start content -->)(.+)(<!-- end content -->.+)$/ms', $wikiOut, $m))
+
else $xwArticle = &$wikiOut;
$xwArticle = $m[2]; else xwMessage('xmlWiki couldn\'t match view-output!', 'red');
 
 
}
 
}
 
+
# If Previewing,
# If Previewing, we can get our raw content from inside the <textarea>
+
# - we can get our raw content to transform from inside the <textarea>
# old-match: (preg_match('/^(.+<!-- start content -->.+Remember.+saved!.+?<\\/p>)(.+?)(<br style="clear:both;" \\/>.+)(<!-- end content -->.+)$/s', $wikiOut, $m))
+
# - we still have to use matching/extracting here since its not in db (and I don't know where else to find it)
 
elseif ($xwPreview) {
 
elseif ($xwPreview) {
 
xwMessage('Previewing Page...');
 
xwMessage('Previewing Page...');
if (preg_match('/^.+(<!-- start content -->.+Remember.+saved!.+?<\\/p>)(.+?)(<br style="clear:both;" \\/>.+<textarea.+?>\\s*(.+)<\\/textarea>.+<!-- end content -->).+$/s', $wikiOut, $m)) {
+
if (preg_match('/^(.+Remember.+saved!.+?<\\/p>)(.+?)(<br style="clear:both;" \\/>.+<textarea.+?>\\s*(.+)<\\/textarea>.+)$/s', $wikiOut, $m)) {
 
xwDomificateArticle($xwArticle = html_entity_decode($m[4]));
 
xwDomificateArticle($xwArticle = html_entity_decode($m[4]));
 
if (is_object($xwArticle)) {
 
if (is_object($xwArticle)) {
 
xwTransformArticle($xwArticle);
 
xwTransformArticle($xwArticle);
 
$xwArticle = $m[1].$xwArticle.$m[3];
 
$xwArticle = $m[1].$xwArticle.$m[3];
} else $xwArticle = $m[1].$m[2].$m[3];
+
} else $xwArticle = &$wikiOut;
}
+
} else xwMessage('xmlWiki couldn\'t match preview-output!', 'red');
else xwMessage('xmlWiki couldn\'t match preview-output!', 'red');
 
 
}
 
}
  
Line 141: Line 139:
 
elseif ($xwSave) {
 
elseif ($xwSave) {
 
 
 +
# First transform the document as usual
 +
if (is_object($xwArticle)) xwTransformArticle($xwArticle);
 +
else $xwArticle = &$wikiOut;
 +
 
# Check publish-list and process if any
 
# Check publish-list and process if any
 
if (false) {
 
if (false) {
 
xwMessage('Publishing...');
 
xwMessage('Publishing...');
xwTransformArticle($xwArticle, $xwArticleTitle);
 
 
# Publish each item
 
# Publish each item
 
foreach ($xwArticlePublish as $url) {
 
foreach ($xwArticlePublish as $url) {
Line 164: Line 165:
 
# 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))
+
$xwArticle = $wikiOut;
$xwArticle = $m[2]; 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
 +
# - Article is always in string form by now
 
if (!$xwRaw) {
 
if (!$xwRaw) {
xwTransformWikiMarkup();
+
xwTransformWikiMarkup(); # Adds wiki markup to result
xwTransformGeshi();
+
xwTransformGeshi(); # Does geshi based on article-name and content
xwTransformAddMessages();
+
xwTransformAddMessages(); # Adds raw messages to output
xwTransformPageLayout();
+
xwTransformPageLayout(); # Uses xwTemplate to build xmlwiki-site structure around content
xwTransformPageStyle();
+
xwTransformPageStyle(); # Adds colour/font/proportions etc
 
}
 
}
  
Line 264: Line 265:
 
# Transform an article object
 
# Transform an article object
 
# - Article must be an xmlwiki:* DOM object to be transformable
 
# - Article must be an xmlwiki:* DOM object to be transformable
# - Article is undomificated if DOM but not xmlwiki:*
+
# - Article is undomificated on exit
 
# - Article remains unchanged if not DOM
 
# - Article remains unchanged if not DOM
 
function xwTransformArticle(&$article) {
 
function xwTransformArticle(&$article) {
 
  
 
# Get doc info or exit if not one of ours
 
# Get doc info or exit if not one of ours
Line 311: Line 311:
 
}
 
}
  
# If article is still a DOM object, stringify it again
+
# If article is still a DOM object, stringify it once and for all
 
xwUndomificateArticle($article);  
 
xwUndomificateArticle($article);  
  
Line 324: Line 324:
 
# Do wiki markup on content
 
# Do wiki markup on content
 
function xwTransformWikiMarkup() {
 
function xwTransformWikiMarkup() {
 +
global $wgOut, $wgUser;
 +
$skin = $wgUser->getSkin();
 +
$wikiOut = &$wgOut->mBodytext;
 
}
 
}
 
 
Line 331: Line 334:
 
function xwTransformGeshi() {
 
function xwTransformGeshi() {
 
return;
 
return;
+
 
global $xwArticle, $xwArticleTitle;
+
global $wgOut, $wgUser;
 +
global $xwTemplate, $xwArticle, $xwArticleTitle;
 +
 
 +
$skin = $wgUser->getSkin();
 +
$wikiOut = &$wgOut->mBodytext;
 +
 
 
# First check for entire article highlighting
 
# First check for entire article highlighting
 
# Highlight entire article if xwLang has been set
 
# Highlight entire article if xwLang has been set
Line 363: Line 371:
 
function xwTransformPageLayout() {
 
function xwTransformPageLayout() {
 
global $xwArticle, $xwArticleTitle, $xwUserLinks, $xwArticleLinks;
 
global $xwArticle, $xwArticleTitle, $xwUserLinks, $xwArticleLinks;
xwMessage("Hi defaultTransform here :-)");
 
 
$xwArticle = "<html><head><title>xmlWiki - $xwArticleTitle</title></head><body bgcolor=#cccccc>
 
$xwArticle = "<html><head><title>xmlWiki - $xwArticleTitle</title></head><body bgcolor=#cccccc>
 
<table border=1 width=100% cellpadding=0 cellspacing=0>
 
<table border=1 width=100% cellpadding=0 cellspacing=0>
Line 468: Line 475:
  
  
function xwDomificateWiki(&$tmpl) {
+
function xwDomificateWiki() {
 +
global $xwTemplate;
 
#$doc = domxml_new_doc("1.0");
 
#$doc = domxml_new_doc("1.0");
 
#$root = $doc->add_root("xmkwiki");
 
#$root = $doc->add_root("xmkwiki");
Line 477: Line 485:
 
 
 
# This returns the monobook template built from string parts
 
# This returns the monobook template built from string parts
function xwMonoBook(&$tmpl) {
+
function xwMonoBook() {
  
$data = &$tmpl->data;
+
global $xwTemplate;
 +
$data = &$xwTemplate->data;
 
$doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
 
$doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
 
$html = '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="'.htmlspecialchars($data['lang']).'" lang="'.htmlspecialchars($data['lang']).'" dir="'.htmlspecialchars($data['dir']).'">';
 
$html = '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="'.htmlspecialchars($data['lang']).'" lang="'.htmlspecialchars($data['lang']).'" dir="'.htmlspecialchars($data['dir']).'">';
Line 520: Line 529:
 
if ($data['catlinks']) $content .= '<div id="catlinks">'.$data['catlinks'].'</div>';
 
if ($data['catlinks']) $content .= '<div id="catlinks">'.$data['catlinks'].'</div>';
 
$content .= '<!-- end content --><div class="visualClear"></div>';
 
$content .= '<!-- end content --><div class="visualClear"></div>';
$content .= '</div>'; # bodyContent
+
$content .= '</div></div></div>';
$content .= '</div>'; # content
 
$content .= '</div>'; # column-content
 
  
 
# Action-links
 
# Action-links

Revision as of 00:53, 11 June 2005

<php> <?php

  1. xmlWiki - MediaWiki XML Hack
  2. Nad - 2005-05-18
  3. TODO:
  4. - Move xwskin.php into xmlwiki dir, and make admin copy it into skins dir
  5. Security:
  6. - xml:article - holds article perms, it doesn't have perms of its own (owner, read-groups, write-groups)
  7. - xml:user - r/w by user, not currently used, but for xmlWiki prefs etc
  8. - sys:user - r/w by admin only, holds users groups and other system info like stats
  9. Publish:
  10. - xml:article - holds article publish-list
  11. Transforms:
  12. - xml:article - now transforms are in here (main article is now like <body>)
  13. - so we don't do the "its one of ours" thing anymore
  14. Raw as Default:
  15. - Need to mod the article-link so it has action=view
  1. LATER:
  2. - allow XIncludes to build large docs from others
  3. - allow docBook and DSSSL content
  4. - Maybe only use XML transforms and use PHP via PI's
  1. ---------------------------------------------------------------------------------------------------------------------- #
  2. INIT
  1. Exit if not included from index.php

defined('MEDIAWIKI') or die('xmlwiki.php must be included from MediaWiki\'s index.php!');

  1. TODO?: ensure $_REQUEST['action'] is valid, unset if not
  2. otherwise, our hooks are bypassed
  1. Ensure our xwskin is active
  2. $wgUser->setOption('skin', 'xwskin');
  1. Otherwise set up xmlWiki global environment ready for input and output processing

$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']); $xwUserName = $wgUser->mName; $xwArticleTitle = $wgTitle->getPrefixedURL(); $xwArticleCache = array(); $xwArticleLinks = array(); $xwUserLinks = array(); $xwMessages = array();

  1. Get articles and attempt to Domificate

if ($xwArticle = $wgArticle->getContent(false)) xwDomificateArticle($xwArticle, $xwArticleTitle); if ($xwArticleXML = xwArticleContent("xml:$xwArticleTitle")) xwDomificateArticle($xwArticleXML, "xml:$xwArticleTitle"); if ($xwUserXML = xwArticleContent("xml:$xwUserName")) xwDomificateArticle($xwUserXML, "xml:$xwUserName"); if ($xwUserSYS = xwArticleContent("sys:$xwUserName")) xwDomificateArticle($xwUserSYS, "sys:$xwUserName");

  1. Security

if (ereg('^xml:(.+)$', $xwArticleTitle)) { # This is an xml-pseudo-namespace # - get perms from associated article/user } elseif (ereg('^sys:(.+)$', $xwArticleTitle)) { # This is an sys-pseudo-namespace # - only admin can read/write sys: } elseif (is_object($xwArticleXML)) { # Get perms from xml:article } else $xwReadable = $xwWritable = true;

  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, $xwReadable, $xwWritable; global $xwSave;

# If article is being updated, if ($xwSave) { #global $_POST; if (!$xwReadable || !$xwWritable) { # Not writable, change action to view xwMessage("I'm sorry Dave, I'm afraid I can't do that.", 'red'); global $action; $action='view'; } }

}

  1. ---------------------------------------------------------------------------------------------------------------------- #
  2. OUTPUT
  1. Generate output to send back to client
  2. - if article is not XML, then wiki's parsed content is used

function xwProcessOutput() {

global $xwArticle, $xwArticleXML, $xwArticleTitle, $xwReadable, $xwWritable; global $xwTemplate, $xwView, $xwPreview, $xwSave, $xwRaw, $xwUserLinks, $xwArticleLinks;

# If no read-access, clear output if ($xwReadable) { global $wgOut, $wgUser; $skin = $wgUser->getSkin(); $wikiOut = &$wgOut->mBodytext; } else { $xwArticle = $wikiOut = ; xwMessage('Unable to comply.', 'red'); } # If no write-access, remove edit link if (!$xwWritable) unset($xwArticleLinks['Edit']);

# If Viewing, # - if DOM, transform else extract marked-up content from wikiOut if ($xwView) { xwMessage('Viewing Page...'); if (is_object($xwArticle)) xwTransformArticle($xwArticle); else $xwArticle = &$wikiOut; } # If Previewing, # - we can get our raw content to transform from inside the <textarea> # - we still have to use matching/extracting here since its not in db (and I don't know where else to find it) elseif ($xwPreview) { xwMessage('Previewing Page...'); if (preg_match('/^(.+Remember.+saved!.+?<\\/p>)(.+?)(
.+<textarea.+?>\\s*(.+)<\\/textarea>.+)$/s', $wikiOut, $m)) { xwDomificateArticle($xwArticle = html_entity_decode($m[4])); if (is_object($xwArticle)) { xwTransformArticle($xwArticle); $xwArticle = $m[1].$xwArticle.$m[3]; } else $xwArticle = &$wikiOut; } else xwMessage('xmlWiki couldn\'t match preview-output!', 'red'); }

# If saving, check the publishing list elseif ($xwSave) {

# First transform the document as usual if (is_object($xwArticle)) xwTransformArticle($xwArticle); else $xwArticle = &$wikiOut;

# Check publish-list and process if any if (false) { xwMessage('Publishing...'); # 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'); } }

# Check mirror-list and process if any if (false) { xwMessage('Mirroring...'); } }

else { # This is probably a special page # - we'll just extract the content and leave as-is $xwArticle = $wikiOut; }

# Apply xmlwiki-environment-transforms to output unless 'raw' requested # - Article is always in string form by now if (!$xwRaw) { xwTransformWikiMarkup(); # Adds wiki markup to result xwTransformGeshi(); # Does geshi based on article-name and content xwTransformAddMessages(); # Adds raw messages to output xwTransformPageLayout(); # Uses xwTemplate to build xmlwiki-site structure around content xwTransformPageStyle(); # Adds colour/font/proportions etc }

# 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

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 if still an object if (is_object($article)) $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) { xwMessage('Processing 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)) $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 on exit
  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; # this must change to meta article 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 once and for all 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. Do wiki markup on content

function xwTransformWikiMarkup() { global $wgOut, $wgUser; $skin = $wgUser->getSkin(); $wikiOut = &$wgOut->mBodytext; }

  1. Include Geshi syntax highlighting
  2. NOTE: Geshi can be installed the normal way too now!
  3. because transforms don't use wikiOut

function xwTransformGeshi() { return;

global $wgOut, $wgUser; global $xwTemplate, $xwArticle, $xwArticleTitle;

$skin = $wgUser->getSkin(); $wikiOut = &$wgOut->mBodytext;

# 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; $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); $hrefs = array();

for ($i = 0; $i < count($match[0]); $i++) $hrefs[$match[2][$i]] = $match[1][$i]; return $hrefs; }

  1. Add message to queue

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

return $xwMessages[] = "

$msg

\n";

}


function xwDomificateWiki() { global $xwTemplate; #$doc = domxml_new_doc("1.0"); #$root = $doc->add_root("xmkwiki"); #$head = $root->new_child("head", ""); #$head->new_child("title", "untitiled"); #htmlentities($doc->dump_mem()); }

  1. This returns the monobook template built from string parts

function xwMonoBook() {

global $xwTemplate; $data = &$xwTemplate->data; $doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'; $html = ''; # Head $head = ''; $head .= $data['headlinks']; $head .= ''.htmlspecialchars($data['pagetitle']).''; $head .= ''; $head .= ''; $head .= ''; $head .= ''; $head .= ''; $head .= ''; if ($data['jsvarurl']) $head .= ''; $head .= ''; if ($data['usercss']) $head .= ''; if ($data['userjs']) $head .= ''; $head .= ''; # Body tag $body = ''; $content .= '

'.htmlspecialchars($data['title']).'

'; $content .= '

'; $content .= '

'.htmlspecialchars($tmpl->translator->translate('tagline')).'

'; $content .= '
'.$data['subtitle'].'
'; if ($data['undelete']) $content .= '
'.$data['undelete'].'
'; if ($data['newtalk']) $content .= '
'.$data['newtalk'].'
'; $content .= ''.$data['bodytext']; if ($data['catlinks']) $content .= ''; $content .= '
'; $content .= '

'; # Action-links $actions = '

Views
    '; foreach ($data['content_actions'] as $key => $action) { $actions .= '
  • '.htmlspecialchars($action['text']).''; $actions .= ">$href
  • "; } $actions .= '

'; # Personal-links $personal = '

'; $personal .= '
'.htmlspecialchars($tmpl->translator->translate('personaltools')).'
'; $personal .= '

"; # Logo $logo = '

MastodonRSSCodeEmail

'; $logo .= '

'; # Navigation $nav = '

'; $nav .= '
'.htmlspecialchars($tmpl->translator->translate('navigation')).'
'; $nav .= '

'; # Search $search = '

'; # Toolbox $toolbox = '

'; $toolbox = '
'.htmlspecialchars($tmpl->translator->translate('toolbox')).'
'; $toolbox .= '

'; # Language $language = ''; if ($data['language_urls']) { $language .= '

'; $language .= '
'.htmlspecialchars($tmpl->translator->translate('otherlanguages')).'
'; $language .= '
    '; foreach ($data['language_urls'] as $langlink) { $href = ''.$langlink['text'].''; $language .= "
  • $href
  • "; } $language .= '

'; } # Footer $footer = '

'; # Build parts into a whole page and return return " $doctype $html $head $body

$content
$actions $personal $logo $nav $search $toolbox $language
$footer

"; }

?> </php>