From: Christian Weiske Date: Tue, 17 Mar 2015 18:53:49 +0000 (+0100) Subject: standlone HTML output X-Git-Tag: v0.5.0~5 X-Git-Url: https://git.cweiske.de/grauphel.git/commitdiff_plain/81554f1309cc6a80578100b9583a591012df0d43?hp=e19fc06310e26dab3ec372fb01676a802fc02234 standlone HTML output --- diff --git a/appinfo/routes.php b/appinfo/routes.php index 1c7e50b..c96ec30 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -68,6 +68,11 @@ $application->registerRoutes( 'name' => 'gui#tag', 'verb' => 'GET', ), + array( + 'url' => '/note/{guid}.html', + 'name' => 'notes#html', + 'verb' => 'GET', + ), array( 'url' => '/note/{guid}.xml', 'name' => 'notes#xml', diff --git a/controller/guicontroller.php b/controller/guicontroller.php index 8ebea8c..15380c7 100644 --- a/controller/guicontroller.php +++ b/controller/guicontroller.php @@ -122,6 +122,9 @@ class GuiController extends Controller 'note' => $note, 'note-content' => $contentHtml, 'links' => array( + 'html' => $this->urlGen->linkToRoute( + 'grauphel.notes.html', array('guid' => $guid) + ), 'json' => $this->urlGen->linkToRoute( 'grauphel.api.note', array( 'guid' => $guid, 'username' => $this->user->getUid() diff --git a/controller/notescontroller.php b/controller/notescontroller.php index 5618bcb..893a100 100644 --- a/controller/notescontroller.php +++ b/controller/notescontroller.php @@ -47,6 +47,100 @@ class NotesController extends Controller header('HTTP/1.0 500 Internal Server Error'); } + /** + * Output a note as a standalone HTML file + * + * @NoAdminRequired + * @NoCSRFRequired + */ + public function html($guid) + { + $note = $this->getNotes()->load($guid, false); + if ($note === null) { + $res = new ErrorResponse('Note does not exist'); + $res->setStatus(\OCP\AppFramework\Http::STATUS_NOT_FOUND); + return $res; + } + + $xw = new \XMLWriter(); + $xw->openMemory(); + $xw->setIndent(true); + $xw->setIndentString(' '); + $xw->startDocument('1.0', 'utf-8'); + $xw->writeRaw( + '' + . "\n" + ); + + $xw->startElementNS(null, 'html', 'http://www.w3.org/1999/xhtml'); + + //head + $xw->startElement('head'); + $xw->writeElement('title', $note->title); + + $xw->startElement('meta'); + $xw->writeAttribute('name', 'author'); + $xw->writeAttribute('content', $this->user->getDisplayName()); + $xw->endElement(); + + $xw->startElement('meta'); + $xw->writeAttribute('http-equiv', 'Content-Type'); + $xw->writeAttribute('content', 'text/html; charset=utf-8'); + $xw->endElement(); + + $xw->startElement('link'); + $xw->writeAttribute('rel', 'schema.DC'); + $xw->writeAttribute('href', 'http://purl.org/dc/elements/1.1/'); + $xw->endElement(); + + $xw->startElement('meta'); + $xw->writeAttribute('name', 'DC.date.created'); + $xw->writeAttribute( + 'content', date('c', strtotime($note->{'create-date'})) + ); + $xw->endElement(); + + $xw->startElement('meta'); + $xw->writeAttribute('name', 'DC.date.modified'); + $xw->writeAttribute( + 'content', date('c', strtotime($note->{'last-change-date'})) + ); + $xw->endElement(); + + $xw->endElement();//head + + //body + $xw->startElement('body'); + + $xw->writeElement('h1', $note->title); + + $converter = new \OCA\Grauphel\Converter\CleanHtml(); + $converter->internalLinkHandler = array($this, 'htmlNoteLinkHandler'); + try { + $xw->writeRaw( + $converter->convert($note->{'note-content'}) + ); + } catch (\OCA\Grauphel\Converter\Exception $e) { + $res = new ErrorResponse( + 'Error converting note to HTML.' + . ' Please repport a bug to the grauphel developers.' + ); + $res->setStatus(\OCP\AppFramework\Http::STATUS_NOT_FOUND); + return $res; + } + + $xw->endElement();//body + + $xw->endElement();//html + return new \OCA\Grauphel\Response\XmlResponse($xw->outputMemory()); + } + + public function htmlNoteLinkHandler($noteTitle) + { + return urlencode($noteTitle) . '.html'; + } + /** * Output a note in tomboy XML format * diff --git a/lib/converter/cleanhtml.php b/lib/converter/cleanhtml.php new file mode 100644 index 0000000..6c5dabf --- /dev/null +++ b/lib/converter/cleanhtml.php @@ -0,0 +1,70 @@ + + * @copyright 2014 Christian Weiske + * @license http://www.gnu.org/licenses/agpl.html GNU AGPL v3 + * @link http://cweiske.de/grauphel.htm + */ +namespace OCA\Grauphel\Converter; +use \XMLReader; + +/** + * Convert Tomboy note XML to HTML that can be used (nearly) standalone. + * This means it tries to use as many native tags as possible and + * does not rely on classes so much. + * + * @category Tools + * @package Grauphel + * @author Christian Weiske + * @copyright 2014 Christian Weiske + * @license http://www.gnu.org/licenses/agpl.html GNU AGPL v3 + * @version Release: @package_version@ + * @link http://cweiske.de/grauphel.htm + */ +class CleanHtml extends Html +{ + protected static $tagMap = array( + 'list' => 'ul', + 'list-item' => 'li', + 'bold' => 'b', + 'italic' => 'i', + 'monospace' => 'tt', + + 'size:large' => 'h3', + 'size:huge' => 'h2', + + 'strikethrough' => 'del', + 'highlight' => 'ins', + ); + + protected static $styleClassMap = array( + 'size:small' => 'small', + ); + + /** + * Converts the tomboy note XML into HTML. + * Cleans HTML a bit up after it has been generated with the clean tags. + * + * @param string $xmlContent Tomboy note content + * + * @return string HTML + */ + public function convert($xmlContent) + { + $html = parent::convert($xmlContent); + $html = str_replace('
', '', $html); + $html = str_replace('
', '', $html); + $html = str_replace("
\n", "\n", $html); + $html = str_replace("
\n", "\n", $html); + $html = str_replace("
\n", "\n", $html); + $html = str_replace("
\n