Diffs
HatenaSyntax/trunk/test/lib/HatenaSyntax/Paragraph.php
@@ -11,13 +11,10 @@
$t->is(
$p->parse($c),
- array('abc')
+ array('a', 'b', 'c')
);
$t->is(
$p->parse($c),
- array('def')
+ array('d', 'e', 'f')
);
-
-$c = PEG::context(array('日本語'));
-$t->is($p->parse($c), array('日本語'));
HatenaSyntax/trunk/sample/sample1.php
@@ -74,7 +74,7 @@
// 記事の識別子。指定しない場合はランダムなIDが生成される
'id' => 'hoge',
- // デフォルトはtrue。
+ // htmlをエスケープするか。デフォルトはtrue。
'htmlescape' => false,
// 記事本体を囲むdiv要素のクラス。デフォルトは'section'
HatenaSyntax/trunk/lib/HatenaSyntax/Paragraph.php
@@ -16,10 +16,7 @@
array($this, 'map'),
PEG::anything()
);
- $this->line = PEG::callbackAction(
- array($this, 'normalize'),
- PEG::many($lineelt)
- );
+ $this->line = PEG::many($lineelt);
}
function parse(PEG_IContext $context)
@@ -32,44 +29,4 @@
return $this->line->parse(PEG::context($line));
}
- /**
- * @param Array $rest
- * @return Array
- */
- function normalize(Array $rest)
- {
- $ret = array();
-
- while ($rest) {
- list($elt, $rest) = $this->segment($rest);
- $ret[] = $elt;
- }
-
- return $ret;
- }
-
- /**
- * @param Array
- * @return Array array($elt, $rest)
- */
- function segment(Array $p)
- {
- $first = array_shift($p);
- $rest = $p;
-
- if (!is_string($first)) {
- return array($first, $rest);
- }
-
- $str = $first;
- while ($rest) {
- if (is_string($rest[0])) {
- $str .= array_shift($rest);
- }
- else {
- return array($str, $rest);
- }
- }
- return array($str, array());
- }
}
HatenaSyntax/trunk/lib/HatenaSyntax/Renderer.php
@@ -156,9 +156,12 @@
protected function renderLineSegment(Array $data)
{
- foreach ($data as &$elt)
- $elt = !$elt instanceof HatenaSyntax_Node ? ($this->config['htmlescape'] ? $this->escape($elt) : $elt)
- : $this->renderNode($elt);
+ $data = self::normalize($data);
+ foreach ($data as &$elt) {
+ $elt = !$elt instanceof HatenaSyntax_Node
+ ? ($this->config['htmlescape'] ? $this->escape($elt) : $elt)
+ : $this->renderNode($elt);
+ }
return join('', $data);
}
@@ -294,6 +297,50 @@
protected static function escape($str)
{
+ if (!is_string($str)) {
+ debug_print_backtrace();
+ return;
+ }
return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}
+
+ /**
+ * @param Array
+ * @return Array
+ */
+ protected static function normalize(Array $arr)
+ {
+ $ret = array();
+
+ while ($arr) {
+ list($elt, $arr) = self::segment($arr);
+ $ret[] = $elt;
+ }
+
+ return $ret;
+ }
+
+ /**
+ * @param Array
+ * @return Array array($elt, $rest)
+ */
+ static function segment(Array $arr)
+ {
+ $first = array_shift($arr);
+
+ if (!is_string($first)) {
+ return array($first, $arr);
+ }
+
+ $str = $first;
+ while ($arr) {
+ if (is_string($arr[0])) {
+ $str .= array_shift($arr);
+ }
+ else {
+ return array($str, $arr);
+ }
+ }
+ return array($str, array());
+ }
}