line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Text::Highlight::HTML; |
2
|
1
|
|
|
1
|
|
5
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
1882
|
|
3
|
|
|
|
|
|
|
|
4
|
|
|
|
|
|
|
#TODO: |
5
|
|
|
|
|
|
|
# 1) DONE - Convert some tag list into a hashref syntax tree for sub syntax |
6
|
|
|
|
|
|
|
# 2) More distant goal: rewrite this not using HTML::SyntaxHighlighter |
7
|
|
|
|
|
|
|
# as I'm not much of a fan of its highlighting method. I'd prefer |
8
|
|
|
|
|
|
|
# html tags one color, attrib names another, and attrib vals as |
9
|
|
|
|
|
|
|
# strings. This wouldn't highlight the > around the tags. Maybe |
10
|
|
|
|
|
|
|
# this is just how whatever text editors I've used have done it, |
11
|
|
|
|
|
|
|
# but it feels more "right". |
12
|
|
|
|
|
|
|
# |
13
|
|
|
|
|
|
|
# At the very least, I'd keep an option for using it as-is. This |
14
|
|
|
|
|
|
|
# means creating some kind of optional "options" hashref that gets |
15
|
|
|
|
|
|
|
# passed to individual T::H::foo methods. Maybe have one all should |
16
|
|
|
|
|
|
|
# implement that uses the method builtin to T::H itself. Got some |
17
|
|
|
|
|
|
|
# other shit to iron out first. |
18
|
|
|
|
|
|
|
# 3) Looks like this method is html-escaping all text, which may not |
19
|
|
|
|
|
|
|
# be the desired escape method. Something else to look into when |
20
|
|
|
|
|
|
|
# poking here again. |
21
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
#array of types, allows for span tag nesting |
23
|
|
|
|
|
|
|
my @types = (undef); |
24
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
#HTML::SyntaxHighlighter to Text::Highlight class translations |
26
|
|
|
|
|
|
|
my %classes = ( |
27
|
|
|
|
|
|
|
'D' => 'key4', #DTD |
28
|
|
|
|
|
|
|
'H' => 'key3', #html/head/body |
29
|
|
|
|
|
|
|
'B' => 'key1', #block |
30
|
|
|
|
|
|
|
'I' => 'key2', #inline |
31
|
|
|
|
|
|
|
'A' => 'string', #attribute values |
32
|
|
|
|
|
|
|
'T' => undef, #text |
33
|
|
|
|
|
|
|
'S' => 'key5', #script/style |
34
|
|
|
|
|
|
|
'C' => 'comment', |
35
|
|
|
|
|
|
|
); |
36
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
sub highlight |
38
|
|
|
|
|
|
|
{ |
39
|
0
|
|
|
0
|
0
|
0
|
shift; #class method's class name |
40
|
0
|
|
|
|
|
0
|
my $obj = shift; |
41
|
0
|
|
|
|
|
0
|
my $code = shift; |
42
|
|
|
|
|
|
|
|
43
|
0
|
|
|
|
|
0
|
eval { |
44
|
0
|
|
|
|
|
0
|
require HTML::SyntaxHighlighter; |
45
|
0
|
|
|
|
|
0
|
require HTML::Parser; |
46
|
|
|
|
|
|
|
}; |
47
|
0
|
0
|
|
|
|
0
|
if ( $@ ) { |
48
|
0
|
|
|
|
|
0
|
$obj->{_active} = __PACKAGE__->syntax; |
49
|
0
|
|
|
|
|
0
|
$obj->_highlight($code); |
50
|
0
|
|
|
|
|
0
|
return; |
51
|
|
|
|
|
|
|
} |
52
|
|
|
|
|
|
|
|
53
|
0
|
|
|
|
|
0
|
my $out; |
54
|
0
|
|
|
|
|
0
|
my $p = HTML::SyntaxHighlighter->new(br => "", out_func => \$out); |
55
|
0
|
|
|
|
|
0
|
$p->parse($code); |
56
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
#HTML::Entity's decode_entities method doesn't seem to convert nbsp's into spaces |
58
|
|
|
|
|
|
|
# (and some lazy html omits the semi-colon) |
59
|
0
|
|
|
|
|
0
|
$out =~ s/ ?/ /g; |
60
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
HTML::Parser->new( |
62
|
|
|
|
|
|
|
api_version => 3, |
63
|
|
|
|
|
|
|
handlers => { |
64
|
|
|
|
|
|
|
start => [\&start, 'tagname,attr'], |
65
|
|
|
|
|
|
|
end => [\&end, 'tagname'], |
66
|
|
|
|
|
|
|
#colorize the decoded text as the type on top of the @types stack |
67
|
0
|
|
|
0
|
|
0
|
text => [ sub { $obj->_colorize($types[-1], shift) }, 'dtext'], |
|
0
|
|
|
|
|
0
|
|
68
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
}, |
70
|
|
|
|
|
|
|
)->parse($out); |
71
|
|
|
|
|
|
|
} |
72
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
#if it's a span tag, look up the tag's class for its Highlighter type and push it on the stack |
74
|
|
|
|
|
|
|
sub start |
75
|
|
|
|
|
|
|
{ |
76
|
0
|
0
|
|
0
|
0
|
0
|
return if shift ne 'span'; |
77
|
0
|
|
|
|
|
0
|
my $attr = shift; |
78
|
0
|
0
|
|
|
|
0
|
push @types, exists $classes{$attr->{class}} ? $classes{$attr->{class}} : undef; |
79
|
|
|
|
|
|
|
} |
80
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
#if it's a span tag, pop the top type off the stack |
82
|
|
|
|
|
|
|
sub end |
83
|
|
|
|
|
|
|
{ |
84
|
0
|
0
|
|
0
|
0
|
0
|
pop @types if shift eq 'span'; |
85
|
|
|
|
|
|
|
} |
86
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
sub syntax { |
88
|
|
|
|
|
|
|
return { |
89
|
1
|
|
|
1
|
0
|
743
|
'name' => 'HTML', |
90
|
|
|
|
|
|
|
'blockCommentOn' => [ |
91
|
|
|
|
|
|
|
'' |
521
|
|
|
|
|
|
|
], |
522
|
|
|
|
|
|
|
'escape' => '\\', |
523
|
|
|
|
|
|
|
'continueQuote' => 0 |
524
|
|
|
|
|
|
|
}; |
525
|
|
|
|
|
|
|
} |
526
|
|
|
|
|
|
|
|
527
|
|
|
|
|
|
|
1; |
528
|
|
|
|
|
|
|
__END__ |