忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/11/23 05:17 |
PHP1-51:PHPでText/Highlighterのclass名を変更してみる

Text/Highlighterで色づけを行うと、生成されるcssのclass名が".hl-main"とかに固定されて出力されます。
ここを変更するにはText_Highlighter_Renderer_Html::$_class_mapを直接変更します。
実際私はソースの出力に使用しているclass名を"highlight-hl-main "というふうにしています。
ただこうすると、例えば複数のソースを違うスタイルで表示したいというようなことができません。
それに配布されているPearのソースに手を加えるのはできれば避けたいところです。
何かメソッドで変更できたりできないものでしょうか。

Webを探してみてもその手の情報は全くないので自力でソースを追っていったところ、どうやらそれっぽいオプションを発見。
どうでもいいんだがググるとマニュアルのコピペばっかり大量に見つかるのだが、あれってどういう意味があるんだろう。
colorsのヒントとか全く意味がわからんだろ。
はっきりいって邪魔でしょうがない。

とりあえずText/highliter/Renderer/Html.php::reset()内に
        if (isset($this->_options['class_map'])) {
            $this->_class_map = array_merge($this->_class_map, $this->_options['class_map']);
        }
とかいう記述があったのでおそらくここらへんだろうと推測し、適当に突っ込んでみる。

highlighe_test.php 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
    
    //インスタンス
        require_once('Text/Highlighter.php');
        require_once('Text/Highlighter/Renderer/Html.php');
        $highlight = Text_Highlighter::factory('PHP');
        $renderclass='Text_Highlighter_Renderer_Html';
    
    //レンダラセット
        $highlight->setRenderer(
            new $renderclass(
                array(
                     'numbers'=>FALSE
                    ,'class_map'=>array('main'=>'hogehoge')
                )
            )
        );
        
    //表示
        $str=file_get_contents(__FILE__);
        $a=$highlight->highlight($str);
        print($a);

あっさり成功。
というわけでクラス化してみます。

highlight.class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?php
    //初期設定
    require_once('Text/Highlighter.php');
    
    class pearHighLightModel {
        //メンバ変数
        private $highlight = '';
        private $language = 'PHP';
        private $renderer = 'Html';
        private $numbers = FALSE ;
        private $class_map_head='';
        
        private $class_map_ori=array(
             'main'       => 'hl-main'
            ,'table'      => 'hl-table'
            ,'gutter'     => 'hl-gutter'
            ,'brackets'   => 'hl-brackets'
            ,'builtin'    => 'hl-builtin'
            ,'code'       => 'hl-code'
            ,'comment'    => 'hl-comment'
            ,'default'    => 'hl-default'
            ,'identifier' => 'hl-identifier'
            ,'inlinedoc'  => 'hl-inlinedoc'
            ,'inlinetags' => 'hl-inlinetags'
            ,'mlcomment'  => 'hl-mlcomment'
            ,'number'     => 'hl-number'
            ,'quotes'     => 'hl-quotes'
            ,'reserved'   => 'hl-reserved'
            ,'special'    => 'hl-special'
            ,'string'     => 'hl-string'
            ,'url'        => 'hl-url'
            ,'var'        => 'hl-var'
        );
        
        //コンストラクタ
        public function __construct(){
        }
        
        //ハイライトして返す
        public function highlight($str){
            $this->_makeHighlighter();
            return $this->highlight->highlight($str);
        }
        
        //cssの接頭辞を入れる
        public function setClassMap($head=''){
            $this->class_map_head=$head;
        }
        
        private function _setClassMap(){
            foreach($this->class_map_ori as $key=>$val){
                $this->class_map[$key]=$this->class_map_head.$val;
            }
        }
        
        //言語を変更
        public function setLang($language){
            $this->language=$language;
        }
        
        //レンダリング変更
        public function setRenderer($renderer){
            $this->renderer=$renderer;
        }
        
        //表示形式を変更
        public function setNumbers($numbers){
            $this->numbers=$numbers;
        }
        
        //オブジェクト作る
        private function _makeHighlighter(){
            if($this->class_map_head){$this->_setClassMap();}
            
            require_once('Text/Highlighter/Renderer/'.$this->renderer.'.php');
            $renderclass='Text_Highlighter_Renderer_'.$this->renderer;
            $this->highlight = Text_Highlighter::factory($this->language);
            $this->highlight->setRenderer(
                new $renderclass(
                    array(
                         'numbers'=>$this->numbers
                        ,'class_map'=>$this->class_map
                    )
                )
            );
        }
        
    #↓クラスのおわり
    }

利用するときに
$highlight->setClassMap('highlight-');
というかんじで接頭辞を突っ込んだら、出力が
class="highlight-hl-main"
となります。

問題点としては、class_mapの一覧をこちらで持ってしまっていること。
Text_Highlighter_Renderer_Html::_class_mapを直接引っ張ってくればよかったのでしょうが、めんどいからもういいや。

 

PR


2009/02/09 19:21 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<PHP1-52:PHPでバグ管理 | HOME | PHP1-50:PHPでText/Highlighterの続き>>
忍者ブログ[PR]