 |
Changeset 3871
- Timestamp:
- 08/11/08 00:47:21
(4 months ago)
- Author:
- kris
- Message:
Added new DocEntity? module, and moved Util.unentity() there instead
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
| r3599 |
r3871 |
|
| 1130 | 1130 | /****************************************************************************** |
|---|
| 1131 | 1131 | |
|---|
| 1132 | | Convert entity chars to normal ones: & => ; for example. |
|---|
| 1133 | | |
|---|
| 1134 | | ******************************************************************************/ |
|---|
| 1135 | | |
|---|
| 1136 | | T[] unentity (T) (T[] src, T[] dst = null) |
|---|
| 1137 | | { |
|---|
| 1138 | | int delta; |
|---|
| 1139 | | auto s = src.ptr; |
|---|
| 1140 | | auto len = src.length; |
|---|
| 1141 | | |
|---|
| 1142 | | // take a peek first to see if there's anything |
|---|
| 1143 | | if ((delta = indexOf (s, '&', len)) < len) |
|---|
| 1144 | | { |
|---|
| 1145 | | // make some room if not enough provided |
|---|
| 1146 | | if (dst.length < src.length) |
|---|
| 1147 | | dst.length = src.length; |
|---|
| 1148 | | auto d = dst.ptr; |
|---|
| 1149 | | |
|---|
| 1150 | | // copy segments over, a chunk at a time |
|---|
| 1151 | | do { |
|---|
| 1152 | | d [0 .. delta] = s [0 .. delta]; |
|---|
| 1153 | | len -= delta; |
|---|
| 1154 | | s += delta; |
|---|
| 1155 | | d += delta; |
|---|
| 1156 | | |
|---|
| 1157 | | // translate entity |
|---|
| 1158 | | auto token = 0; |
|---|
| 1159 | | |
|---|
| 1160 | | switch (s[1]) |
|---|
| 1161 | | { |
|---|
| 1162 | | case 'a': |
|---|
| 1163 | | if (len > 4 && s[1..5] == "amp;") |
|---|
| 1164 | | *d++ = '&', token = 5; |
|---|
| 1165 | | else |
|---|
| 1166 | | if (len > 5 && s[1..6] == "apos;") |
|---|
| 1167 | | *d++ = '\'', token = 6; |
|---|
| 1168 | | break; |
|---|
| 1169 | | |
|---|
| 1170 | | case 'g': |
|---|
| 1171 | | if (len > 3 && s[1..4] == "gt;") |
|---|
| 1172 | | *d++ = '>', token = 4; |
|---|
| 1173 | | break; |
|---|
| 1174 | | |
|---|
| 1175 | | case 'l': |
|---|
| 1176 | | if (len > 3 && s[1..4] == "lt;") |
|---|
| 1177 | | *d++ = '<', token = 4; |
|---|
| 1178 | | break; |
|---|
| 1179 | | |
|---|
| 1180 | | case 'q': |
|---|
| 1181 | | if (len > 5 && s[1..6] == "quot;") |
|---|
| 1182 | | *d++ = '"', token = 6; |
|---|
| 1183 | | break; |
|---|
| 1184 | | |
|---|
| 1185 | | default: |
|---|
| 1186 | | break; |
|---|
| 1187 | | } |
|---|
| 1188 | | |
|---|
| 1189 | | if (token is 0) |
|---|
| 1190 | | *d++ = '&', token = 1; |
|---|
| 1191 | | s += token, len -= token; |
|---|
| 1192 | | } while ((delta = indexOf (s, '&', len)) < len); |
|---|
| 1193 | | |
|---|
| 1194 | | // copy tail too |
|---|
| 1195 | | d [0 .. len] = s [0 .. len]; |
|---|
| 1196 | | return dst [0 .. (d + len) - dst.ptr]; |
|---|
| 1197 | | } |
|---|
| 1198 | | return src; |
|---|
| 1199 | | } |
|---|
| 1200 | | |
|---|
| 1201 | | |
|---|
| 1202 | | /****************************************************************************** |
|---|
| 1203 | | |
|---|
| 1204 | 1132 | jhash() -- hash a variable-length key into a 32-bit value |
|---|
| 1205 | 1133 | |
|---|
| … | … | |
| 1718 | 1646 | assert (unescape ("\\v\\vx") == "\v\vx"); |
|---|
| 1719 | 1647 | assert (unescape ("abc\\t\\a\\bc") == "abc\t\a\bc"); |
|---|
| 1720 | | |
|---|
| 1721 | | assert (unentity ("abc") == "abc"); |
|---|
| 1722 | | assert (unentity ("abc&") == "abc&"); |
|---|
| 1723 | | assert (unentity ("abc<") == "abc<"); |
|---|
| 1724 | | assert (unentity ("abc>goo") == "abc>goo"); |
|---|
| 1725 | | assert (unentity ("&") == "&"); |
|---|
| 1726 | | assert (unentity (""'") == "\"'"); |
|---|
| 1727 | | assert (unentity ("&q&s") == "&q&s"); |
|---|
| 1728 | 1648 | } |
|---|
| 1729 | 1649 | } |
|---|
Download in other formats:
|
 |
 |
|
 |
Copyright © 2006-2008 Tango. All Rights Reserved. | Page Width:
Static or
Dynamic