HTML Handler
This is the development page for the HTML handler.
This handler generates "standalone" HTML, without the header/footer/menu items.
Dependency
None.The code
Copy css/wikka.css to css/html.css, then add the following line to the top of html.css:Create handlers/page/html.php (version <=1.1.6.3) or handlers/html/html.php (version >=1.1.7):
<?php
if ($this->HasAccess("read") && $this->page) {
// display page
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title><?php echo $this->GetPageTag(); ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<style type="text/css">
<?php include("css/html.css") ?>
</style>
</head>
<body>
<div id="content">
<?php
$this->config['external_link_tail'] = '';
print($this->Format($this->page["body"], "html"));
}
?>
</div>
</body>
</html>
if ($this->HasAccess("read") && $this->page) {
// display page
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title><?php echo $this->GetPageTag(); ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<style type="text/css">
<?php include("css/html.css") ?>
</style>
</head>
<body>
<div id="content">
<?php
$this->config['external_link_tail'] = '';
print($this->Format($this->page["body"], "html"));
}
?>
</div>
</body>
</html>
Add the following after about line 1109 (version < 1.1.6.2) or line 1030 (version 1.1.6.2/1.1.6.3) in wikka.php (just before the final else statement):
elseif ($this->method == "html")
{
print($this->Method($this->method));
}
{
print($this->Method($this->method));
}
Add the code above after about line 2183 (version 1.2) in libs/Wakka.class.php (just before the final else statement).
Add the following after about line 2879 (version = 1.1.7) in libs/Wakka.class.php :
// Handler to generate html
elseif ($this->handler == 'html')
{
print($this->Handler($this->handler));
}
elseif ($this->handler == 'html')
{
print($this->Handler($this->handler));
}
The Wikka parsing engine doesn't differentiate between relative URIs and absolute URIs (the default is to prepend any "unidentified" URIs with http:). To enable relative URIs, copy formatters/wakka.php to formatters/html.php, then make the following changes starting at around line 240 (version < 1.1.6.2), line 284 (version 1.1.6.2/1.1.6.3), or line 527 (version >= 1.1.7):
// forced links
// \S : any character that is not a whitespace character
// \s : any whitespace character
--->change start<---
// Hack to pick up leading . and / characters in URI
else if (preg_match("/^\[\[([\S|\.|\/]*)(\s+(.+))?\]\]$/s", $thing, $matches)) # recognize forced links across lines
{
--->change end<---
list (, $url, , $text) = $matches;
if ($url)
{
//if ($url!=($url=(preg_replace("/@@|££||\[\[/","",$url))))$result="</span>";
if (!$text) $text = $url;
//$text=preg_replace("/@@|££|\[\[/","",$text);
--->change start<---
$link = $wakka->Link($url, "", $text);
// Hack to handle relative URIs (i.e., links to files
// in the same directory)
if(strstr($link, "http://.") || strstr($link, "http:///"))
$link = preg_replace("/^(.*)http:\/\/(.*)$/",
"\${1}\${2}",
$link);
return $result.$link;
--->change end<---
}
// \S : any character that is not a whitespace character
// \s : any whitespace character
--->change start<---
// Hack to pick up leading . and / characters in URI
else if (preg_match("/^\[\[([\S|\.|\/]*)(\s+(.+))?\]\]$/s", $thing, $matches)) # recognize forced links across lines
{
--->change end<---
list (, $url, , $text) = $matches;
if ($url)
{
//if ($url!=($url=(preg_replace("/@@|££||\[\[/","",$url))))$result="</span>";
if (!$text) $text = $url;
//$text=preg_replace("/@@|££|\[\[/","",$text);
--->change start<---
$link = $wakka->Link($url, "", $text);
// Hack to handle relative URIs (i.e., links to files
// in the same directory)
if(strstr($link, "http://.") || strstr($link, "http:///"))
$link = preg_replace("/^(.*)http:\/\/(.*)$/",
"\${1}\${2}",
$link);
return $result.$link;
--->change end<---
}
To disable the display of CamelWords and InterWiki as clickable links, also delete the following lines from formatters/html.php:
"\b[A-Z???][A-Za-z???????]+[:](?![=_])\S*\b|".
# InterWiki link
"\b([A-Z???]+[a-z????]+[A-Z0-9???][A-Za-z0-9???????]*)\b|".
# CamelWords
# InterWiki link
"\b([A-Z???]+[a-z????]+[A-Z0-9???][A-Za-z0-9???????]*)\b|".
# CamelWords
Dumping an entire wiki
This is some proof-of-concept code I hacked together rather quickly for a Wikka user in need of a way to dump all of his Wikka pages to a directory. I've only tested this on version 1.1.6.0, so your results may vary. By default, html files are dumped in /tmp/wikka_test/.<?php
// Get list of all wiki pages on site
$pages = $this->LoadAllPages();
foreach($pages as $page)
{
if ($this->HasAccess("read") && $page) {
// dump pages
ob_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title><?php echo $page['tag'] ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<style type="text/css">
<?php include("css/html.css") ?>
</style>
</head>
<body>
<?php
$this->config['external_link_tail'] = '';
print($this->Format($page['body'], "html"));
}
$buffer = ob_get_flush();
$filename = $page['tag'].".html";
file_put_contents("/tmp/wikka_test/".$filename, $buffer);
}
$this->Redirect();
?>
// Get list of all wiki pages on site
$pages = $this->LoadAllPages();
foreach($pages as $page)
{
if ($this->HasAccess("read") && $page) {
// dump pages
ob_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title><?php echo $page['tag'] ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<style type="text/css">
<?php include("css/html.css") ?>
</style>
</head>
<body>
<?php
$this->config['external_link_tail'] = '';
print($this->Format($page['body'], "html"));
}
$buffer = ob_get_flush();
$filename = $page['tag'].".html";
file_put_contents("/tmp/wikka_test/".$filename, $buffer);
}
$this->Redirect();
?>
To Do
- Provide option to exclude inline CSS (with option to display listing of CSS to save in separate file)
- Provide "raw" html (no html, head, body tags)
- Clean up kludge in wikka.php (there should be no need to modify this file to accomodate a new handler type)
- Convince DarTar to include this formatter in the next release so we can show Exports HTML == yes in the WikkaWiki entry on WikiMatrix!
Categories
CategoryDevelopmentHandlersCategoryUserContributions
--One suggests an HTML dump devoid of all "wikish" elements (headers, footers, CamelCase links, etc.). This is useful when one is using Wikka strictly as an HTML editor using the wiki markup instead of HTML markup.
--The other suggests an HTML dump that would closely resemble the original Wikka page, but with internalized links externalized in a static form. This is useful if one wanted a complete portable dump or snapshot of a wiki, with all internal links converted to static relative links so the entire wiki could still be navigated.
I originally set out to accomplish the first case. My thinking is that the two cases should be handled separately. In the first case, many wiki elements are simply excluded from the output. In the second case, each wiki element must be checked to determine (1) if it can be converted to a static link, or (2) if it should be disabled. Thoughts?
For your second case, you can have a look at the FileexportAction in HTML mode. It renders hyperlinks as static relative links or external links, depending whether the target page belongs to the set of exported pages or not. This is an "optimistic" approach: instead of disabling the link, it is kept as is, event though it may not be reachable (e.g. in the case of an intranet).