powered by nequal
Home » HatenaSyntax » Timeline » 1574

Diffs

HatenaSyntax/trunk/test/lib/HatenaSyntax/InlineTag.php

@@ -0,0 +1,10 @@
+<?php
+include_once dirname(__FILE__) . '/../../t.php';
+
+$t = new lime_test;
+
+$p = new HatenaSyntax_InlineTag(PEG::anything());
+
+$c = PEG::context('<strong>a</strong>');
+
+$t->is($p->parse($c), array('strong', array('a')));
属性に変更があったパス: HatenaSyntax/trunk/test/lib/HatenaSyntax/InlineTag.php
___________________________________________________________________
名前: svn:keywords
+ Id
属性に変更があったパス: HatenaSyntax/trunk/test/lib/HatenaSyntax/List.php
___________________________________________________________________
名前: svn:keywords
+ Id
属性に変更があったパス: HatenaSyntax/trunk/test/lib/HatenaSyntax/Quote.php
___________________________________________________________________
名前: svn:keywords
+ Id
属性に変更があったパス: HatenaSyntax/trunk/test/lib/HatenaSyntax/LineElement.php
___________________________________________________________________
名前: svn:keywords
+ Id
属性に変更があったパス: HatenaSyntax/trunk/test/lib/HatenaSyntax/DefinitionList.php
___________________________________________________________________
名前: svn:keywords
+ Id
属性に変更があったパス: HatenaSyntax/trunk/test/lib/HatenaSyntax/Paragraph.php
___________________________________________________________________
名前: svn:keywords
+ Id
属性に変更があったパス: HatenaSyntax/trunk/test/lib/HatenaSyntax/SuperPre.php
___________________________________________________________________
名前: svn:keywords
+ Id
属性に変更があったパス: HatenaSyntax/trunk/test/lib/HatenaSyntax/Pre.php
___________________________________________________________________
名前: svn:keywords
+ Id
属性に変更があったパス: HatenaSyntax/trunk/test/lib/HatenaSyntax/Table.php
___________________________________________________________________
名前: svn:keywords
+ Id

HatenaSyntax/trunk/test/lib/HatenaSyntax/Header.php

@@ -6,4 +6,8 @@
$p = new HatenaSyntax_Header(PEG::anything());
$c = PEG::context(array('*abc'));
-$t->is($p->parse($c), array(0, array('a', 'b', 'c')));
+$t->is($p->parse($c), array(0, false, array('a', 'b', 'c')));
+
+$c = PEG::context(array('*name*a'));
+
+$t->is($p->parse($c), array(0, 'name', array('a')));
属性に変更があったパス: HatenaSyntax/trunk/test/lib/HatenaSyntax/Header.php
___________________________________________________________________
名前: svn:keywords
+ Id

HatenaSyntax/trunk/test/lib/HatenaSyntax.php

@@ -0,0 +1,11 @@
+<?php
+include_once dirname(__FILE__) . '/../t.php';
+
+$t = new lime_test;
+
+$node = HatenaSyntax::parse('*hoge*header');
+$t->is(HatenaSyntax::getSectionName($node), 'hoge');
+
+$node = HatenaSyntax::parse('*hoge');
+$t->is(HatenaSyntax::getSectionName($node), '');
+
属性に変更があったパス: HatenaSyntax/trunk/test/lib/HatenaSyntax.php
___________________________________________________________________
名前: svn:keywords
+ Id
属性に変更があったパス: HatenaSyntax/trunk/test/t.php
___________________________________________________________________
名前: svn:keywords
+ Id

HatenaSyntax/trunk/test/lime.php

@@ -13,7 +13,7 @@
*
* @package    lime
* @author     Fabien Potencier <fabien.potencier@gmail.com>
- * @version    SVN: $Id: lime.php 12216 2008-10-16 12:25:26Z fabien $
+ * @version    SVN: $Id$
*/
class lime_test
{
属性に変更があったパス: HatenaSyntax/trunk/test/lime.php
___________________________________________________________________
名前: svn:keywords
+ Id
属性に変更があったパス: HatenaSyntax/trunk/test/testall.php
___________________________________________________________________
名前: svn:keywords
+ Id

HatenaSyntax/trunk/sample/sample1.php

@@ -79,7 +79,8 @@
'keywordlinkhanlder' => 'keywordlinkhandler',
// superpre記法の中身を処理するコールバック
-    'superprehandler' => 'sprehandler'));
+    'superprehandler' => 'sprehandler')
+);
/* 結果
<div class="section">
属性に変更があったパス: HatenaSyntax/trunk/sample/sample1.php
___________________________________________________________________
名前: svn:keywords
+ Id
属性に変更があったパス: HatenaSyntax/trunk/sample/sample2.php
___________________________________________________________________
名前: svn:keywords
+ Id
属性に変更があったパス: HatenaSyntax/trunk/lib/HatenaSyntax/Block.php
___________________________________________________________________
名前: svn:keywords
+ Id
属性に変更があったパス: HatenaSyntax/trunk/lib/HatenaSyntax/Quote.php
___________________________________________________________________
名前: svn:keywords
+ Id
属性に変更があったパス: HatenaSyntax/trunk/lib/HatenaSyntax/LineElement.php
___________________________________________________________________
名前: svn:keywords
+ Id

HatenaSyntax/trunk/lib/HatenaSyntax/Locator.php

@@ -170,7 +170,7 @@
{
$parser = new HatenaSyntax_Header($this->lineElement);
-        return $this->nodeCreater('header', $parser, array('level', 'body'));
+        return $this->nodeCreater('header', $parser, array('level', 'name', 'body'));
}
protected function createList()
属性に変更があったパス: HatenaSyntax/trunk/lib/HatenaSyntax/SuperPre.php
___________________________________________________________________
名前: svn:keywords
+ Id
属性に変更があったパス: HatenaSyntax/trunk/lib/HatenaSyntax/Paragraph.php
___________________________________________________________________
名前: svn:keywords
+ Id

HatenaSyntax/trunk/lib/HatenaSyntax/Renderer.php

@@ -8,23 +8,40 @@
class HatenaSyntax_Renderer
{
-    protected $config, $footnote, $fncount, $root, $treeRenderer, $headerCount;
+    protected
+        $config,
+        $footnote,
+        $fncount,
+        $root,
+        $treeRenderer,
+        $headerCount;
function __construct(Array $config = array())
{
$this->config = $config + array(
-            'headerlevel' => 1,
-            'htmlescape' => true,
-            'id' => uniqid('sec'),
-            'sectionclass' => 'section',
-            'footnoteclass' => 'footnote',
+            'headerlevel'        => 1,
+            'htmlescape'         => true,
+            'id'                 => uniqid('sec'),
+            'sectionclass'       => 'section',
+            'footnoteclass'      => 'footnote',
'keywordlinkhandler' => array($this, 'keywordLinkHandler'),
-            'superprehandler' => array($this, 'superPreHandler')
+            'superprehandler'    => array($this, 'superPreHandler')
);
$this->treeRenderer = new HatenaSyntax_TreeRenderer(array($this, 'listItemCallback'), array($this, 'isOrderedCallback'));
}
+    static function superPreHandler($type, $lines)
+    {
+        $body = join(PHP_EOL, array_map(array('HatenaSyntax_Renderer', 'escape'), $lines));
+        return '<pre class="superpre">' . PHP_EOL . $body . '</pre>';
+    }
+
+    static function keywordLinkHandler($path)
+    {
+        return './' . $path;
+    }
+
function listItemCallback(Array $data)
{
list(, $lineSegment) = $data;
@@ -62,17 +79,6 @@
return $ret;
}
-    static function superPreHandler($type, $lines)
-    {
-        $body = join(PHP_EOL, array_map(array('HatenaSyntax_Renderer', 'escape'), $lines));
-        return '<pre class="superpre">' . PHP_EOL . $body . '</pre>';
-    }
-
-    static function keywordLinkHandler($path)
-    {
-        return './' . $path;
-    }
-
protected function renderTableOfContents()
{
$tocRenderer = new HatenaSyntax_TOCRenderer();
@@ -93,9 +99,10 @@
protected function renderHeader(Array $data)
{
-        $level = $data['level'] + $this->config['headerlevel'];
-        $name = md5($this->config['id']) . '_header_' . $this->headerCount++;
+        $level  = $data['level'] + $this->config['headerlevel'];
+        $name   = md5($this->config['id']) . '_header_' . $this->headerCount++;
$anchor = '<a name="' . $name . '" id="' . $name . '"></a>';
+
return "<h{$level}>" . $this->renderLineSegment($data['body']) . $anchor . "</h{$level}>";
}
属性に変更があったパス: HatenaSyntax/trunk/lib/HatenaSyntax/Regex.php
___________________________________________________________________
名前: svn:keywords
+ Id
属性に変更があったパス: HatenaSyntax/trunk/lib/HatenaSyntax/InlineTag.php
___________________________________________________________________
名前: svn:keywords
+ Id
属性に変更があったパス: HatenaSyntax/trunk/lib/HatenaSyntax/List.php
___________________________________________________________________
名前: svn:keywords
+ Id
属性に変更があったパス: HatenaSyntax/trunk/lib/HatenaSyntax/DefinitionList.php
___________________________________________________________________
名前: svn:keywords
+ Id
属性に変更があったパス: HatenaSyntax/trunk/lib/HatenaSyntax/Pre.php
___________________________________________________________________
名前: svn:keywords
+ Id
属性に変更があったパス: HatenaSyntax/trunk/lib/HatenaSyntax/Table.php
___________________________________________________________________
名前: svn:keywords
+ Id

HatenaSyntax/trunk/lib/HatenaSyntax/Header.php

@@ -24,12 +24,39 @@
function map($line)
{
if (strpos($line, '*') === 0) {
-            preg_match('/^\**/', substr($line, 1), $matches);
-            $level = strlen($matches[0]);
-            $body = $this->child->parse(PEG::context((string)substr($line, $level + 1)));
-            return array($level, $body);
+            list($level, $rest) = $this->levelAndRest($line);
+            list($name, $body) = $this->nameAndBody($rest);
+
+            $body = $this->child->parse(PEG::context($body));
+
+            return array($level, $name, $body);
}
return PEG::failure();
}
+
+    protected function levelAndRest($line)
+    {
+        $level = 0;
+        $line = (string)substr($line, 1);
+
+        for ($i = 0, $len = strlen($line); $i < $len; $i++) {
+            if ($line[$i] === '*') {
+                $level++;
+            } else {
+                break;
+            }
+        }
+
+        return array($level, substr($line, $level));
+    }
+
+    protected function nameAndBody($rest)
+    {
+        if (preg_match('/^(.*?)\*/', $rest, $matches)) {
+            return array($matches[1], (string)substr($rest, strlen($matches[0])));
+        }
+
+        return array(false, $rest);
+    }
}
属性に変更があったパス: HatenaSyntax/trunk/lib/HatenaSyntax/Header.php
___________________________________________________________________
名前: svn:keywords
+ Id

HatenaSyntax/trunk/lib/HatenaSyntax.php

@@ -35,6 +35,8 @@
class HatenaSyntax
{
/**
+     * 文字列をパースしてHatenaSyntax_Nodeインスタンからなる構文木を返す。
+     *
* @param string
* @return HatenaSyntax_Node
*/
@@ -44,11 +46,13 @@
}
/**
+     * 文字列をパースしてhtmlを返す。
+     *
* @param string
* @param Array
* @return string
*/
-    static function render($str, $config = array())
+    static function render($str, Array $config = array())
{
$node = self::parse($str);
$renderer = new HatenaSyntax_Renderer($config);
@@ -67,4 +71,42 @@
return PEG::context(preg_split("/\n/", $str));
}
+
+    /**
+     * HatenaSyntax_Nodeインスタンスからなる構文木をhtmlにして返す。
+     *
+     * @param HatenaSyntax_Node
+     * @param Array
+     * @return string
+     */
+    static function renderNode(HatenaSyntax_Node $root, Array $config = array())
+    {
+        $renderer = new HatenaSyntax_Renderer($config);
+        return $renderer->render($root);
+    }
+
+    /**
+     * セクション名を取得する。
+     * 見つからなかった場合は空の文字列を返す。
+     *
+     * @param HatenaSyntax_Node
+     * @return string
+     */
+    static function getSectionName(HatenaSyntax_Node $root)
+    {
+        if ($root->getType() !== 'root') {
+            throw new InvalidArgumentException('$root must be root node');
+        }
+
+        foreach ($root->getData() as $block) {
+            if ($block->getType() === 'header') {
+                $data = $block->getData();
+                if (is_string($data['name'])) {
+                    return $data['name'];
+                }
+            }
+        }
+
+        return '';
+    }
}