From: <ru...@us...> - 2009-06-04 13:29:28
|
Revision: 6889 http://phpwiki.svn.sourceforge.net/phpwiki/?rev=6889&view=rev Author: rurban Date: 2009-06-04 13:29:25 +0000 (Thu, 04 Jun 2009) Log Message: ----------- DynamicIncludePage and AJAX support - we need a DOCTYPE for unescaped entities without !CDATA[] - MSIE still has issues with those Modified Paths: -------------- trunk/lib/display.php Added Paths: ----------- trunk/lib/plugin/DynamicIncludePage.php trunk/themes/default/ajax.js Modified: trunk/lib/display.php =================================================================== --- trunk/lib/display.php 2009-06-04 13:01:12 UTC (rev 6888) +++ trunk/lib/display.php 2009-06-04 13:29:25 UTC (rev 6889) @@ -208,12 +208,14 @@ $format = $request->getArg('format'); if ($format == 'xml') { // fast ajax: include page content asynchronously global $charset; - //header("Content-Type: application/xhtml+xml; charset=$charset"); header("Content-Type: text/xml"); + echo "<","?xml version=\"1.0\" encoding=\"$charset\"?", ">\n"; + // DOCTYPE html needed to allow unencoded entities like without !CDATA[] + echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'; if ($page->exists()) { header("Last-Modified: " . Rfc1123DateTime($revision->get('mtime'))); $request->cacheControl(); - echo "<","?xml version=\"1.0\" encoding=\"$charset\"?", ">\n"; $page_content = $revision->getTransformedContent(); $page_content->printXML(); $request->finish(); Added: trunk/lib/plugin/DynamicIncludePage.php =================================================================== --- trunk/lib/plugin/DynamicIncludePage.php (rev 0) +++ trunk/lib/plugin/DynamicIncludePage.php 2009-06-04 13:29:25 UTC (rev 6889) @@ -0,0 +1,109 @@ +<?php // -*-php-*- +rcs_id('$Id: DynamicIncludePage.php 6547 2009-02-24 15:42:01Z vargenau $'); +/* + Copyright 2009 $ThePhpWikiProgrammingTeam + + This file is part of PhpWiki. + + PhpWiki is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + PhpWiki is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with PhpWiki; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/** + * DynamicIncludePage - Include wikipage asynchronously. Icon to show/hide. + * Usage: <?plugin DynamicIncludePage page=OtherPage state=true ...?> + * Author: Reini Urban + */ + +require_once('lib/plugin/IncludePage.php'); + +class WikiPlugin_DynamicIncludePage +extends WikiPlugin_IncludePage +{ + function getName() { + return _("DynamicIncludePage"); + } + + function getDescription() { + return _("Dynamicly include text from another wiki page."); + } + + function getVersion() { + return preg_replace("/[Revision: $]/", '', + "\$Revision: 6547 $"); + } + + function getDefaultArguments() { + return array_merge + (WikiPlugin_IncludePage::getDefaultArguments(), + array( + 'state' => false, // initial state: false <=> [+], true <=> [-] + )); + } + + function run($dbi, $argstr, &$request, $basepage) { + global $WikiTheme; + $args = $this->getArgs($argstr, $request, false); + $page =& $args['page']; + if (ENABLE_AJAX) { + if ($args['state']) + $html = WikiPlugin_IncludePage::run($dbi, $argstr, $request, $basepage); + else + $html = HTML(HTML::p(array('class' => 'transclusion-title'), + fmt(" %s :", WikiLink($page))), + HTML::div(array('class' => 'transclusion'), '')); + $ajaxuri = WikiURL($page, array('format' => 'xml')); + } else { + $html = WikiPlugin_IncludePage::run($dbi, $argstr, $request, $basepage); + } + $header = $html->_content[0]; + $body = $html->_content[1]; + $id = 'DynInc-'.MangleXmlIdentifier($page); + $body->setAttr('id', $id.'-body'); + $png = $WikiTheme->_findData('images/folderArrow'. + ($args['state'] ? 'Open' : 'Closed'). + '.png'); + $icon = HTML::img(array('id' => $id.'-img', + 'src' => $png, + 'onClick' => ENABLE_AJAX + ? "showHideAsync('".$ajaxuri."','$id')" + : "showHideFolder('$id')", + 'border' => 0, + 'title' => _("Click to hide/show"))); + $header = HTML::p(array('class' => 'transclusion-title', + 'style' => "text-decoration: none;"), + $icon, + fmt(" %s :", WikiLink($page))); + if ($args['state']) { // show base + $body->setAttr('style', 'display:block'); + return HTML($header, $body); + } else { // do not show base + $body->setAttr('style', 'display:none'); + if (ENABLE_AJAX) + return HTML($header, $body); // async (load in background and insert) + else + return HTML($header, $body); // sync (load but display:none) + } + } +}; + +// For emacs users +// Local Variables: +// mode: php +// tab-width: 8 +// c-basic-offset: 4 +// c-hanging-comment-ender-p: nil +// indent-tabs-mode: nil +// End: +?> Added: trunk/themes/default/ajax.js =================================================================== --- trunk/themes/default/ajax.js (rev 0) +++ trunk/themes/default/ajax.js 2009-06-04 13:29:25 UTC (rev 6889) @@ -0,0 +1,120 @@ +// Ajax Javascript support functions, based on moacdropdown +// $Id: ajax.js 6521 2009-02-20 16:20:24Z vargenau $ + +function showHide( id ) { + this.init( id ) +} + +showHide.prototype.onXmlHttpLoad = function( ) { + if( this.hXMLHttp.readyState == 4 ) { + var hError = this.hXMLHttp.parseError; + var img = document.getElementById(this.id+'-img'); + if( hError && hError.errorCode != 0 ) { + alert( hError.reason ); + } else { + // insert external, same-domain XML tree into id-body as HTML + var body = document.getElementById(this.id+'-body'); + var newbody = this.hXMLHttp.responseXML; + if (newbody != null) { + // msie: newbody = document, newbody.firstChild.nodeName = xml + if (newbody.firstChild && newbody.firstChild.nodeName == 'xml') + newbody = newbody.firstChild.nextSibling.nextSibling; + // gecko + chrome: skip firstChild = DOCTYPE html + if (newbody.firstChild && newbody.firstChild.nodeName == 'html') + newbody = newbody.childNodes[1]; + if (newbody == null) { + alert("showHideDone "+this.id+"\nno xml children from "+this.hXMLHttp.responseText); + } + var hContainer = CreateHtmlFromXml(newbody); + hContainer.className = 'wikitext'; + body.appendChild( hContainer ); + body.style.display = 'block'; + } else { + alert("showHideDone "+this.id+"\nerror no xml from "+this.hXMLHttp.responseText); + } + } + if (img) + img.src = stylepath + 'images/folderArrowOpen.png'; + } +} + +showHide.prototype.init = function (id) { + this.id = id; + this.hXMLHttp = XmlHttp.create() + var hAC = this + this.hXMLHttp.onreadystatechange = function() { hAC.onXmlHttpLoad() } +} + +var cShowHide; + +function CreateHtmlFromXml (xml) { + if (xml == null) { + return document.createElement('xml'); + } + var xmltype = xml.nodeName; + var html; + if (xmltype == '#text') { + html = document.createTextNode( xml.nodeValue ); + html.nodeValue = xml.nodeValue; + if (xml.attributes && (xml.attributes != null)) + for (var i=0; i < xml.attributes.length; i++) { + html.setAttribute( xml.attributes[i].name, xml.attributes[i].value ); + } + } else { + html = document.createElement( xmltype ); + if (xml.nodeValue) + html.nodeValue = xml.nodeValue; + if (xml.attributes && (xml.attributes != null)) + for (var i=0; i < xml.attributes.length; i++) { + html.setAttribute( xml.attributes[i].name, xml.attributes[i].value ); + } + if (xml.hasChildNodes()) + for (var i=0; i < xml.childNodes.length; i++) { + html.appendChild( CreateHtmlFromXml(xml.childNodes[i]) ); + } + } + return html; +} + +// if body is empty, load page in background into id+"-body" and show/hide id +function showHideAsync(uri, id) { + var body = document.getElementById(id+'-body'); + if (!body) { + alert("Error: id="+id+'-body'+" missing."); + return; + } + if (body.hasChildNodes()) { + //alert("showHideAsync "+uri+" "+id+"\nalready loaded"); + showHideFolder(id); + } + else { + //alert("showHideAsync "+uri+" "+id+"\nloading..."); + var img = document.getElementById(id+'-img'); + if (img) + img.src = stylepath + 'images/folderArrowLoading.gif'; + cShowHide = new showHide(id) + cShowHide.hXMLHttp.open( 'GET', uri, true ) + cShowHide.hXMLHttp.send( null ) + } +} + +function showHideDone(id) { + // insert tree into id-body + var body = document.getElementById(id+'-body'); + body.parentNode.replaceChild(cShowHide.hXMLHttp.responseText, body); + alert("showHideDone "+id+"\ngot "+cShowHide.hXMLHttp.responseText); + showHideFolder(id); +} + +// hide after 0.4 secs +function showHideDelayed(id) { + window.setTimeout("doshowHide("+id+")",400); +} + +function doshowHide(id) { + document.getElementById(id).style.display = "none"; + var highlight = document.getElementById("LSHighlight"); + if (highlight) { + highlight.removeAttribute("id"); + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |