source: applications/nimpad/branches/0.2/lib/HatenaSyntax/Tree.php @ 1488

SVN
Revision 1488, 1.9 KB checked in by anatoo, 10 months ago (diff)

HatenaSyntax?とPEGをリポジトリの中に置いておくようにした

Line 
1<?php
2/**
3 * @package HatenaSyntax
4 * @author anatoo<anatoo@nequal.jp>
5 * @license http://www.opensource.org/licenses/mit-license.php MIT License
6 * @version $Id: Tree.php 1159 2009-09-06 09:43:29Z anatoo $
7 */
8
9class HatenaSyntax_Tree
10{
11    /**
12     * array('level' => ?, 'value' => ?)の配列を渡す
13     *
14     * @param array $arr
15     */
16    static function make(Array $arr)
17    {
18        return new HatenaSyntax_Tree_Root(self::makeNodeArray($arr));
19    } 
20   
21    static protected function makeNodeArray(Array $arr)
22    {
23        $i = 0;
24        $len = count($arr);
25        $tree_arr = array();
26        $min_level = self::fetchMinLevel($arr);
27        while ($i < $len) {
28            list($tree_arr[], $i) = self::makeNode($arr, $i, $min_level);
29        }
30        return $tree_arr;
31    }
32   
33    static protected function makeNode(Array $arr, $i, $min_level)
34    {
35        $children = array();
36        $len = count($arr);
37        if ($min_level < $arr[$i]['level']) {
38            // Node
39            for (; $i < $len && $min_level < $arr[$i]['level']; $i++) {
40                $children[] = $arr[$i];
41            }
42            return array(new HatenaSyntax_Tree_Node(self::makeNodeArray($children)), $i);
43        }
44        else {
45            // NodeかLeaf
46            $value = $arr[$i]['value'];
47            $i++;
48            for (; $i < $len && $min_level < $arr[$i]['level']; $i++) {
49                $children[] = $arr[$i];
50            }
51            $node = $children ? new HatenaSyntax_Tree_Node(self::makeNodeArray($children), $value) : 
52                                new HatenaSyntax_Tree_Leaf($value);
53            return array($node, $i);
54        }
55    }
56   
57    static protected function fetchMinLevel(Array $arr)
58    {
59        foreach ($arr as $elt) {
60            if (!isset($level) || $level > $elt['level']) {
61                $level = $elt['level'];
62            }
63        }
64        return $level;
65    }
66}
Note: See TracBrowser for help on using the repository browser.