woocommerce/apigen/libs/Texy/texy/modules/TexyBlockQuoteModule.php

132 lines
3.1 KiB
PHP
Raw Normal View History

2014-02-14 14:29:30 +00:00
<?php
/**
* Texy! - human-readable text to HTML converter.
*
* @copyright Copyright (c) 2004, 2010 David Grudl
* @license GNU GENERAL PUBLIC LICENSE version 2 or 3
* @link http://texy.info
* @package Texy
*/
/**
* Blockquote module.
*
* @copyright Copyright (c) 2004, 2010 David Grudl
* @package Texy
*/
final class TexyBlockQuoteModule extends TexyModule
{
public function __construct($texy)
{
$this->texy = $texy;
$texy->registerBlockPattern(
array($this, 'pattern'),
'#^(?:'.TEXY_MODIFIER_H.'\n)?\>(\ +|:)(\S.*)$#mU', // original
// '#^(?:'.TEXY_MODIFIER_H.'\n)?\>(?:(\>|\ +?|:)(.*))?()$#mU', // >>>>
// '#^(?:'.TEXY_MODIFIER_H.'\n)?\>(?:(\ +?|:)(.*))()$#mU', // only >
'blockquote'
);
}
/**
* Callback for:.
*
* > They went in single file, running like hounds on a strong scent,
* and an eager light was in their eyes. Nearly due west the broad
* swath of the marching Orcs tramped its ugly slot; the sweet grass
* of Rohan had been bruised and blackened as they passed.
* >:http://www.mycom.com/tolkien/twotowers.html
*
* @param TexyBlockParser
* @param array regexp matches
* @param string pattern name
* @return TexyHtml|string|FALSE
*/
public function pattern($parser, $matches)
{
list(, $mMod, $mPrefix, $mContent) = $matches;
// [1] => .(title)[class]{style}<>
// [2] => spaces |
// [3] => ... / LINK
$tx = $this->texy;
$el = TexyHtml::el('blockquote');
$mod = new TexyModifier($mMod);
$mod->decorate($tx, $el);
$content = '';
$spaces = '';
do {
if ($mPrefix === ':') {
$mod->cite = $tx->blockQuoteModule->citeLink($mContent);
$content .= "\n";
} else {
if ($spaces === '') $spaces = max(1, strlen($mPrefix));
$content .= $mContent . "\n";
}
if (!$parser->next("#^>(?:|(\\ {1,$spaces}|:)(.*))()$#mA", $matches)) break;
/*
if ($mPrefix === '>') {
$content .= $mPrefix . $mContent . "\n";
} elseif ($mPrefix === ':') {
$mod->cite = $tx->blockQuoteModule->citeLink($mContent);
$content .= "\n";
} else {
if ($spaces === '') $spaces = max(1, strlen($mPrefix));
$content .= $mContent . "\n";
}
if (!$parser->next("#^\\>(?:(\\>|\\ {1,$spaces}|:)(.*))?()$#mA", $matches)) break;
*/
list(, $mPrefix, $mContent) = $matches;
} while (TRUE);
$el->attrs['cite'] = $mod->cite;
$el->parseBlock($tx, $content, $parser->isIndented());
// no content?
if (!$el->count()) return FALSE;
// event listener
$tx->invokeHandlers('afterBlockquote', array($parser, $el, $mod));
return $el;
}
/**
* Converts cite source to URL.
* @param string
* @return string|NULL
*/
public function citeLink($link)
{
$tx = $this->texy;
if ($link == NULL) return NULL;
if ($link{0} === '[') { // [ref]
$link = substr($link, 1, -1);
$ref = $tx->linkModule->getReference($link);
if ($ref) return Texy::prependRoot($ref->URL, $tx->linkModule->root);
}
// special supported case
if (strncasecmp($link, 'www.', 4) === 0) return 'http://' . $link;
return Texy::prependRoot($link, $tx->linkModule->root);
}
}