File Coverage

lib/Petal/Entities.pm
Criterion Covered Total %
statement 6 17 35.2
branch 0 8 0.0
condition n/a
subroutine 2 3 66.6
pod 0 1 0.0
total 8 29 27.5


line stmt bran cond sub pod time code
1             # Entirely stolen from HTML::Entities
2             # And modified to fit Petal's purposes.
3             package Petal::Entities;
4 77     77   251 use strict;
  77         86  
  77         2077  
5 77     77   1846 use warnings;
  77         98  
  77         53694  
6              
7              
8             our %ENTITY_2_CHAR = (
9             # Some normal chars that have special meaning in SGML context
10             # those will be managed by XML::Parser
11             # so we don't want to expand them
12             # amp => '&', # ampersand
13             # 'gt' => '>', # greater than
14             # 'lt' => '<', # less than
15             # quot => '"', # double quote
16             # apos => "'", # single quote
17            
18             # PUBLIC ISO 8879-1986//ENTITIES Added Latin 1//EN//HTML
19             AElig => '�', # capital AE diphthong (ligature)
20             Aacute => '�', # capital A, acute accent
21             Acirc => '�', # capital A, circumflex accent
22             Agrave => '�', # capital A, grave accent
23             Aring => '�', # capital A, ring
24             Atilde => '�', # capital A, tilde
25             Auml => '�', # capital A, dieresis or umlaut mark
26             Ccedil => '�', # capital C, cedilla
27             ETH => '�', # capital Eth, Icelandic
28             Eacute => '�', # capital E, acute accent
29             Ecirc => '�', # capital E, circumflex accent
30             Egrave => '�', # capital E, grave accent
31             Euml => '�', # capital E, dieresis or umlaut mark
32             Iacute => '�', # capital I, acute accent
33             Icirc => '�', # capital I, circumflex accent
34             Igrave => '�', # capital I, grave accent
35             Iuml => '�', # capital I, dieresis or umlaut mark
36             Ntilde => '�', # capital N, tilde
37             Oacute => '�', # capital O, acute accent
38             Ocirc => '�', # capital O, circumflex accent
39             Ograve => '�', # capital O, grave accent
40             Oslash => '�', # capital O, slash
41             Otilde => '�', # capital O, tilde
42             Ouml => '�', # capital O, dieresis or umlaut mark
43             THORN => '�', # capital THORN, Icelandic
44             Uacute => '�', # capital U, acute accent
45             Ucirc => '�', # capital U, circumflex accent
46             Ugrave => '�', # capital U, grave accent
47             Uuml => '�', # capital U, dieresis or umlaut mark
48             Yacute => '�', # capital Y, acute accent
49             aacute => '�', # small a, acute accent
50             acirc => '�', # small a, circumflex accent
51             aelig => '�', # small ae diphthong (ligature)
52             agrave => '�', # small a, grave accent
53             aring => '�', # small a, ring
54             atilde => '�', # small a, tilde
55             auml => '�', # small a, dieresis or umlaut mark
56             ccedil => '�', # small c, cedilla
57             eacute => '�', # small e, acute accent
58             ecirc => '�', # small e, circumflex accent
59             egrave => '�', # small e, grave accent
60             eth => '�', # small eth, Icelandic
61             euml => '�', # small e, dieresis or umlaut mark
62             iacute => '�', # small i, acute accent
63             icirc => '�', # small i, circumflex accent
64             igrave => '�', # small i, grave accent
65             iuml => '�', # small i, dieresis or umlaut mark
66             ntilde => '�', # small n, tilde
67             oacute => '�', # small o, acute accent
68             ocirc => '�', # small o, circumflex accent
69             ograve => '�', # small o, grave accent
70             oslash => '�', # small o, slash
71             otilde => '�', # small o, tilde
72             ouml => '�', # small o, dieresis or umlaut mark
73             szlig => '�', # small sharp s, German (sz ligature)
74             thorn => '�', # small thorn, Icelandic
75             uacute => '�', # small u, acute accent
76             ucirc => '�', # small u, circumflex accent
77             ugrave => '�', # small u, grave accent
78             uuml => '�', # small u, dieresis or umlaut mark
79             yacute => '�', # small y, acute accent
80             yuml => '�', # small y, dieresis or umlaut mark
81              
82             # Some extra Latin 1 chars that are listed in the HTML3.2 draft (21-May-96)
83             copy => '�', # copyright sign
84             reg => '�', # registered sign
85             nbsp => "\240", # non breaking space
86              
87             # Additional ISO-8859/1 entities listed in rfc1866 (section 14)
88             iexcl => '�',
89             cent => '�',
90             pound => '�',
91             curren => '�',
92             yen => '�',
93             brvbar => '�',
94             sect => '�',
95             uml => '�',
96             ordf => '�',
97             laquo => '�',
98             'not' => '�', # not is a keyword in perl
99             shy => '�',
100             macr => '�',
101             deg => '�',
102             plusmn => '�',
103             sup1 => '�',
104             sup2 => '�',
105             sup3 => '�',
106             acute => '�',
107             micro => '�',
108             para => '�',
109             middot => '�',
110             cedil => '�',
111             ordm => '�',
112             raquo => '�',
113             frac14 => '�',
114             frac12 => '�',
115             frac34 => '�',
116             iquest => '�',
117             'times' => '�', # times is a keyword in perl
118             divide => '�',
119              
120             ( $] > 5.007 ? (
121             OElig => chr(338),
122             oelig => chr(339),
123             Scaron => chr(352),
124             scaron => chr(353),
125             Yuml => chr(376),
126             fnof => chr(402),
127             circ => chr(710),
128             tilde => chr(732),
129             Alpha => chr(913),
130             Beta => chr(914),
131             Gamma => chr(915),
132             Delta => chr(916),
133             Epsilon => chr(917),
134             Zeta => chr(918),
135             Eta => chr(919),
136             Theta => chr(920),
137             Iota => chr(921),
138             Kappa => chr(922),
139             Lambda => chr(923),
140             Mu => chr(924),
141             Nu => chr(925),
142             Xi => chr(926),
143             Omicron => chr(927),
144             Pi => chr(928),
145             Rho => chr(929),
146             Sigma => chr(931),
147             Tau => chr(932),
148             Upsilon => chr(933),
149             Phi => chr(934),
150             Chi => chr(935),
151             Psi => chr(936),
152             Omega => chr(937),
153             alpha => chr(945),
154             beta => chr(946),
155             gamma => chr(947),
156             delta => chr(948),
157             epsilon => chr(949),
158             zeta => chr(950),
159             eta => chr(951),
160             theta => chr(952),
161             iota => chr(953),
162             kappa => chr(954),
163             lambda => chr(955),
164             mu => chr(956),
165             nu => chr(957),
166             xi => chr(958),
167             omicron => chr(959),
168             pi => chr(960),
169             rho => chr(961),
170             sigmaf => chr(962),
171             sigma => chr(963),
172             tau => chr(964),
173             upsilon => chr(965),
174             phi => chr(966),
175             chi => chr(967),
176             psi => chr(968),
177             omega => chr(969),
178             thetasym => chr(977),
179             upsih => chr(978),
180             piv => chr(982),
181             ensp => chr(8194),
182             emsp => chr(8195),
183             thinsp => chr(8201),
184             zwnj => chr(8204),
185             zwj => chr(8205),
186             lrm => chr(8206),
187             rlm => chr(8207),
188             ndash => chr(8211),
189             mdash => chr(8212),
190             lsquo => chr(8216),
191             rsquo => chr(8217),
192             sbquo => chr(8218),
193             ldquo => chr(8220),
194             rdquo => chr(8221),
195             bdquo => chr(8222),
196             dagger => chr(8224),
197             Dagger => chr(8225),
198             bull => chr(8226),
199             hellip => chr(8230),
200             permil => chr(8240),
201             prime => chr(8242),
202             Prime => chr(8243),
203             lsaquo => chr(8249),
204             rsaquo => chr(8250),
205             oline => chr(8254),
206             frasl => chr(8260),
207             euro => chr(8364),
208             image => chr(8465),
209             weierp => chr(8472),
210             real => chr(8476),
211             trade => chr(8482),
212             alefsym => chr(8501),
213             larr => chr(8592),
214             uarr => chr(8593),
215             rarr => chr(8594),
216             darr => chr(8595),
217             harr => chr(8596),
218             crarr => chr(8629),
219             lArr => chr(8656),
220             uArr => chr(8657),
221             rArr => chr(8658),
222             dArr => chr(8659),
223             hArr => chr(8660),
224             forall => chr(8704),
225             part => chr(8706),
226             exist => chr(8707),
227             empty => chr(8709),
228             nabla => chr(8711),
229             isin => chr(8712),
230             notin => chr(8713),
231             ni => chr(8715),
232             prod => chr(8719),
233             sum => chr(8721),
234             minus => chr(8722),
235             lowast => chr(8727),
236             radic => chr(8730),
237             prop => chr(8733),
238             infin => chr(8734),
239             ang => chr(8736),
240             'and' => chr(8743),
241             'or' => chr(8744),
242             cap => chr(8745),
243             cup => chr(8746),
244             'int' => chr(8747),
245             there4 => chr(8756),
246             sim => chr(8764),
247             cong => chr(8773),
248             asymp => chr(8776),
249             'ne' => chr(8800),
250             equiv => chr(8801),
251             'le' => chr(8804),
252             'ge' => chr(8805),
253             'sub' => chr(8834),
254             sup => chr(8835),
255             nsub => chr(8836),
256             sube => chr(8838),
257             supe => chr(8839),
258             oplus => chr(8853),
259             otimes => chr(8855),
260             perp => chr(8869),
261             sdot => chr(8901),
262             lceil => chr(8968),
263             rceil => chr(8969),
264             lfloor => chr(8970),
265             rfloor => chr(8971),
266             lang => chr(9001),
267             rang => chr(9002),
268             loz => chr(9674),
269             spades => chr(9824),
270             clubs => chr(9827),
271             hearts => chr(9829),
272             diams => chr(9830),
273             ) : ())
274             );
275              
276              
277             my %subst; # compiled encoding regexps
278              
279              
280             sub decode_entities
281             {
282 0     0 0   my $array = \@_; # modify in-place
283            
284 0           my $c;
285 0           for (@$array) {
286 0 0         s/(&\#(\d+);?)/$2 < 256 ? chr($2) : $1/eg;
  0            
287 0 0         s/(&\#[xX]([0-9a-fA-F]+);?)/$c = hex($2); $c < 256 ? chr($c) : $1/eg;
  0            
  0            
288 0 0         s/(&(\w+);?)/$ENTITY_2_CHAR{$2} || $1/eg;
  0            
289             }
290 0 0         wantarray ? @$array : $array->[0];
291             }
292              
293              
294             1;