powered by nequal
Home » HatenaSyntax » Timeline » 1632

Changeset 1632 -- 2010-02-09 12:42:22

Author
anatoo
Comment
fixed vanishing multibyte string bug with HatenaSyntax_Renderer

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());
+    }
}