redsnow 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (174) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +34 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +20 -0
  5. data/CHANGELOG.md +4 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE +21 -0
  8. data/README.md +62 -0
  9. data/Rakefile +36 -0
  10. data/Vagrantfile +20 -0
  11. data/ext/snowcrash/Makefile +64 -0
  12. data/ext/snowcrash/Vagrantfile +20 -0
  13. data/ext/snowcrash/bin/snowcrash +0 -0
  14. data/ext/snowcrash/common.gypi +163 -0
  15. data/ext/snowcrash/config.gypi +10 -0
  16. data/ext/snowcrash/config.mk +5 -0
  17. data/ext/snowcrash/configure +213 -0
  18. data/ext/snowcrash/provisioning.sh +15 -0
  19. data/ext/snowcrash/snowcrash.gyp +141 -0
  20. data/ext/snowcrash/src/ActionParser.h +503 -0
  21. data/ext/snowcrash/src/AssetParser.h +215 -0
  22. data/ext/snowcrash/src/BlockUtility.h +186 -0
  23. data/ext/snowcrash/src/Blueprint.h +283 -0
  24. data/ext/snowcrash/src/BlueprintParser.h +347 -0
  25. data/ext/snowcrash/src/BlueprintParserCore.h +190 -0
  26. data/ext/snowcrash/src/BlueprintSection.h +140 -0
  27. data/ext/snowcrash/src/BlueprintUtility.h +126 -0
  28. data/ext/snowcrash/src/CBlueprint.cc +600 -0
  29. data/ext/snowcrash/src/CBlueprint.h +354 -0
  30. data/ext/snowcrash/src/CSourceAnnotation.cc +140 -0
  31. data/ext/snowcrash/src/CSourceAnnotation.h +106 -0
  32. data/ext/snowcrash/src/CodeBlockUtility.h +189 -0
  33. data/ext/snowcrash/src/DescriptionSectionUtility.h +156 -0
  34. data/ext/snowcrash/src/HTTP.cc +46 -0
  35. data/ext/snowcrash/src/HTTP.h +105 -0
  36. data/ext/snowcrash/src/HeaderParser.h +289 -0
  37. data/ext/snowcrash/src/ListBlockUtility.h +273 -0
  38. data/ext/snowcrash/src/ListUtility.h +95 -0
  39. data/ext/snowcrash/src/MarkdownBlock.cc +176 -0
  40. data/ext/snowcrash/src/MarkdownBlock.h +93 -0
  41. data/ext/snowcrash/src/MarkdownParser.cc +266 -0
  42. data/ext/snowcrash/src/MarkdownParser.h +88 -0
  43. data/ext/snowcrash/src/ParameterDefinitonParser.h +570 -0
  44. data/ext/snowcrash/src/ParametersParser.h +252 -0
  45. data/ext/snowcrash/src/Parser.cc +71 -0
  46. data/ext/snowcrash/src/Parser.h +29 -0
  47. data/ext/snowcrash/src/ParserCore.cc +120 -0
  48. data/ext/snowcrash/src/ParserCore.h +82 -0
  49. data/ext/snowcrash/src/PayloadParser.h +672 -0
  50. data/ext/snowcrash/src/Platform.h +54 -0
  51. data/ext/snowcrash/src/RegexMatch.h +32 -0
  52. data/ext/snowcrash/src/ResourceGroupParser.h +195 -0
  53. data/ext/snowcrash/src/ResourceParser.h +584 -0
  54. data/ext/snowcrash/src/SectionUtility.h +142 -0
  55. data/ext/snowcrash/src/Serialize.cc +52 -0
  56. data/ext/snowcrash/src/Serialize.h +69 -0
  57. data/ext/snowcrash/src/SerializeJSON.cc +601 -0
  58. data/ext/snowcrash/src/SerializeJSON.h +21 -0
  59. data/ext/snowcrash/src/SerializeYAML.cc +336 -0
  60. data/ext/snowcrash/src/SerializeYAML.h +21 -0
  61. data/ext/snowcrash/src/SourceAnnotation.h +177 -0
  62. data/ext/snowcrash/src/StringUtility.h +109 -0
  63. data/ext/snowcrash/src/SymbolTable.h +83 -0
  64. data/ext/snowcrash/src/UriTemplateParser.cc +195 -0
  65. data/ext/snowcrash/src/UriTemplateParser.h +243 -0
  66. data/ext/snowcrash/src/Version.h +39 -0
  67. data/ext/snowcrash/src/csnowcrash.cc +23 -0
  68. data/ext/snowcrash/src/csnowcrash.h +38 -0
  69. data/ext/snowcrash/src/posix/RegexMatch.cc +99 -0
  70. data/ext/snowcrash/src/snowcrash.cc +18 -0
  71. data/ext/snowcrash/src/snowcrash.h +41 -0
  72. data/ext/snowcrash/src/snowcrash/snowcrash.cc +170 -0
  73. data/ext/snowcrash/src/win/RegexMatch.cc +78 -0
  74. data/ext/snowcrash/sundown/CONTRIBUTING.md +10 -0
  75. data/ext/snowcrash/sundown/Makefile +83 -0
  76. data/ext/snowcrash/sundown/Makefile.win +33 -0
  77. data/ext/snowcrash/sundown/examples/smartypants.c +72 -0
  78. data/ext/snowcrash/sundown/examples/sundown.c +80 -0
  79. data/ext/snowcrash/sundown/html/houdini.h +37 -0
  80. data/ext/snowcrash/sundown/html/houdini_href_e.c +108 -0
  81. data/ext/snowcrash/sundown/html/houdini_html_e.c +84 -0
  82. data/ext/snowcrash/sundown/html/html.c +647 -0
  83. data/ext/snowcrash/sundown/html/html.h +77 -0
  84. data/ext/snowcrash/sundown/html/html_smartypants.c +389 -0
  85. data/ext/snowcrash/sundown/html_block_names.txt +25 -0
  86. data/ext/snowcrash/sundown/src/autolink.c +297 -0
  87. data/ext/snowcrash/sundown/src/autolink.h +51 -0
  88. data/ext/snowcrash/sundown/src/buffer.c +225 -0
  89. data/ext/snowcrash/sundown/src/buffer.h +96 -0
  90. data/ext/snowcrash/sundown/src/html_blocks.h +206 -0
  91. data/ext/snowcrash/sundown/src/markdown.c +2701 -0
  92. data/ext/snowcrash/sundown/src/markdown.h +147 -0
  93. data/ext/snowcrash/sundown/src/src_map.c +200 -0
  94. data/ext/snowcrash/sundown/src/src_map.h +58 -0
  95. data/ext/snowcrash/sundown/src/stack.c +81 -0
  96. data/ext/snowcrash/sundown/src/stack.h +29 -0
  97. data/ext/snowcrash/sundown/sundown.def +20 -0
  98. data/ext/snowcrash/tools/gyp/AUTHORS +11 -0
  99. data/ext/snowcrash/tools/gyp/DEPS +24 -0
  100. data/ext/snowcrash/tools/gyp/OWNERS +1 -0
  101. data/ext/snowcrash/tools/gyp/PRESUBMIT.py +120 -0
  102. data/ext/snowcrash/tools/gyp/buildbot/buildbot_run.py +190 -0
  103. data/ext/snowcrash/tools/gyp/codereview.settings +10 -0
  104. data/ext/snowcrash/tools/gyp/data/win/large-pdb-shim.cc +12 -0
  105. data/ext/snowcrash/tools/gyp/gyp +8 -0
  106. data/ext/snowcrash/tools/gyp/gyp.bat +5 -0
  107. data/ext/snowcrash/tools/gyp/gyp_main.py +18 -0
  108. data/ext/snowcrash/tools/gyp/pylib/gyp/MSVSNew.py +340 -0
  109. data/ext/snowcrash/tools/gyp/pylib/gyp/MSVSProject.py +208 -0
  110. data/ext/snowcrash/tools/gyp/pylib/gyp/MSVSSettings.py +1063 -0
  111. data/ext/snowcrash/tools/gyp/pylib/gyp/MSVSToolFile.py +58 -0
  112. data/ext/snowcrash/tools/gyp/pylib/gyp/MSVSUserFile.py +147 -0
  113. data/ext/snowcrash/tools/gyp/pylib/gyp/MSVSUtil.py +267 -0
  114. data/ext/snowcrash/tools/gyp/pylib/gyp/MSVSVersion.py +409 -0
  115. data/ext/snowcrash/tools/gyp/pylib/gyp/__init__.py +537 -0
  116. data/ext/snowcrash/tools/gyp/pylib/gyp/__init__.pyc +0 -0
  117. data/ext/snowcrash/tools/gyp/pylib/gyp/common.py +521 -0
  118. data/ext/snowcrash/tools/gyp/pylib/gyp/common.pyc +0 -0
  119. data/ext/snowcrash/tools/gyp/pylib/gyp/easy_xml.py +157 -0
  120. data/ext/snowcrash/tools/gyp/pylib/gyp/flock_tool.py +49 -0
  121. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/__init__.py +0 -0
  122. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/__init__.pyc +0 -0
  123. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/android.py +1069 -0
  124. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/cmake.py +1143 -0
  125. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/dump_dependency_json.py +81 -0
  126. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/eclipse.py +335 -0
  127. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/gypd.py +87 -0
  128. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/gypsh.py +56 -0
  129. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/make.py +2181 -0
  130. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/make.pyc +0 -0
  131. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/msvs.py +3335 -0
  132. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/ninja.py +2156 -0
  133. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/xcode.py +1224 -0
  134. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/xcode.pyc +0 -0
  135. data/ext/snowcrash/tools/gyp/pylib/gyp/input.py +2809 -0
  136. data/ext/snowcrash/tools/gyp/pylib/gyp/input.pyc +0 -0
  137. data/ext/snowcrash/tools/gyp/pylib/gyp/mac_tool.py +510 -0
  138. data/ext/snowcrash/tools/gyp/pylib/gyp/msvs_emulation.py +972 -0
  139. data/ext/snowcrash/tools/gyp/pylib/gyp/ninja_syntax.py +160 -0
  140. data/ext/snowcrash/tools/gyp/pylib/gyp/ordered_dict.py +289 -0
  141. data/ext/snowcrash/tools/gyp/pylib/gyp/win_tool.py +292 -0
  142. data/ext/snowcrash/tools/gyp/pylib/gyp/xcode_emulation.py +1440 -0
  143. data/ext/snowcrash/tools/gyp/pylib/gyp/xcode_emulation.pyc +0 -0
  144. data/ext/snowcrash/tools/gyp/pylib/gyp/xcodeproj_file.py +2889 -0
  145. data/ext/snowcrash/tools/gyp/pylib/gyp/xcodeproj_file.pyc +0 -0
  146. data/ext/snowcrash/tools/gyp/pylib/gyp/xml_fix.py +69 -0
  147. data/ext/snowcrash/tools/gyp/pylintrc +307 -0
  148. data/ext/snowcrash/tools/gyp/samples/samples +81 -0
  149. data/ext/snowcrash/tools/gyp/samples/samples.bat +5 -0
  150. data/ext/snowcrash/tools/gyp/setup.py +19 -0
  151. data/ext/snowcrash/tools/gyp/tools/Xcode/Specifications/gyp.pbfilespec +27 -0
  152. data/ext/snowcrash/tools/gyp/tools/Xcode/Specifications/gyp.xclangspec +226 -0
  153. data/ext/snowcrash/tools/gyp/tools/emacs/gyp.el +252 -0
  154. data/ext/snowcrash/tools/gyp/tools/graphviz.py +100 -0
  155. data/ext/snowcrash/tools/gyp/tools/pretty_gyp.py +155 -0
  156. data/ext/snowcrash/tools/gyp/tools/pretty_sln.py +168 -0
  157. data/ext/snowcrash/tools/gyp/tools/pretty_vcproj.py +329 -0
  158. data/ext/snowcrash/tools/homebrew/snowcrash.rb +11 -0
  159. data/ext/snowcrash/vcbuild.bat +184 -0
  160. data/lib/redsnow.rb +31 -0
  161. data/lib/redsnow/binding.rb +132 -0
  162. data/lib/redsnow/blueprint.rb +365 -0
  163. data/lib/redsnow/object.rb +18 -0
  164. data/lib/redsnow/parseresult.rb +107 -0
  165. data/lib/redsnow/version.rb +4 -0
  166. data/provisioning.sh +20 -0
  167. data/redsnow.gemspec +35 -0
  168. data/test/_helper.rb +15 -0
  169. data/test/fixtures/sample-api-ast.json +97 -0
  170. data/test/fixtures/sample-api.apib +20 -0
  171. data/test/redsnow_binding_test.rb +35 -0
  172. data/test/redsnow_parseresult_test.rb +50 -0
  173. data/test/redsnow_test.rb +285 -0
  174. metadata +358 -0
@@ -0,0 +1,77 @@
1
+ /*
2
+ * Copyright (c) 2011, Vicent Marti
3
+ *
4
+ * Permission to use, copy, modify, and distribute this software for any
5
+ * purpose with or without fee is hereby granted, provided that the above
6
+ * copyright notice and this permission notice appear in all copies.
7
+ *
8
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15
+ */
16
+
17
+ #ifndef UPSKIRT_HTML_H
18
+ #define UPSKIRT_HTML_H
19
+
20
+ #include "markdown.h"
21
+ #include "buffer.h"
22
+ #include <stdlib.h>
23
+
24
+ #ifdef __cplusplus
25
+ extern "C" {
26
+ #endif
27
+
28
+ struct html_renderopt {
29
+ struct {
30
+ int header_count;
31
+ int current_level;
32
+ int level_offset;
33
+ } toc_data;
34
+
35
+ unsigned int flags;
36
+
37
+ /* extra callbacks */
38
+ void (*link_attributes)(struct buf *ob, const struct buf *url, void *self);
39
+ };
40
+
41
+ typedef enum {
42
+ HTML_SKIP_HTML = (1 << 0),
43
+ HTML_SKIP_STYLE = (1 << 1),
44
+ HTML_SKIP_IMAGES = (1 << 2),
45
+ HTML_SKIP_LINKS = (1 << 3),
46
+ HTML_EXPAND_TABS = (1 << 4),
47
+ HTML_SAFELINK = (1 << 5),
48
+ HTML_TOC = (1 << 6),
49
+ HTML_HARD_WRAP = (1 << 7),
50
+ HTML_USE_XHTML = (1 << 8),
51
+ HTML_ESCAPE = (1 << 9),
52
+ } html_render_mode;
53
+
54
+ typedef enum {
55
+ HTML_TAG_NONE = 0,
56
+ HTML_TAG_OPEN,
57
+ HTML_TAG_CLOSE,
58
+ } html_tag;
59
+
60
+ int
61
+ sdhtml_is_tag(const uint8_t *tag_data, size_t tag_size, const char *tagname);
62
+
63
+ extern void
64
+ sdhtml_renderer(struct sd_callbacks *callbacks, struct html_renderopt *options_ptr, unsigned int render_flags);
65
+
66
+ extern void
67
+ sdhtml_toc_renderer(struct sd_callbacks *callbacks, struct html_renderopt *options_ptr);
68
+
69
+ extern void
70
+ sdhtml_smartypants(struct buf *ob, const uint8_t *text, size_t size);
71
+
72
+ #ifdef __cplusplus
73
+ }
74
+ #endif
75
+
76
+ #endif
77
+
@@ -0,0 +1,389 @@
1
+ /*
2
+ * Copyright (c) 2011, Vicent Marti
3
+ *
4
+ * Permission to use, copy, modify, and distribute this software for any
5
+ * purpose with or without fee is hereby granted, provided that the above
6
+ * copyright notice and this permission notice appear in all copies.
7
+ *
8
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15
+ */
16
+
17
+ #include "buffer.h"
18
+ #include "html.h"
19
+
20
+ #include <string.h>
21
+ #include <stdlib.h>
22
+ #include <stdio.h>
23
+ #include <ctype.h>
24
+
25
+ #if defined(_WIN32)
26
+ #define snprintf _snprintf
27
+ #endif
28
+
29
+ struct smartypants_data {
30
+ int in_squote;
31
+ int in_dquote;
32
+ };
33
+
34
+ static size_t smartypants_cb__ltag(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
35
+ static size_t smartypants_cb__dquote(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
36
+ static size_t smartypants_cb__amp(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
37
+ static size_t smartypants_cb__period(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
38
+ static size_t smartypants_cb__number(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
39
+ static size_t smartypants_cb__dash(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
40
+ static size_t smartypants_cb__parens(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
41
+ static size_t smartypants_cb__squote(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
42
+ static size_t smartypants_cb__backtick(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
43
+ static size_t smartypants_cb__escape(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
44
+
45
+ static size_t (*smartypants_cb_ptrs[])
46
+ (struct buf *, struct smartypants_data *, uint8_t, const uint8_t *, size_t) =
47
+ {
48
+ NULL, /* 0 */
49
+ smartypants_cb__dash, /* 1 */
50
+ smartypants_cb__parens, /* 2 */
51
+ smartypants_cb__squote, /* 3 */
52
+ smartypants_cb__dquote, /* 4 */
53
+ smartypants_cb__amp, /* 5 */
54
+ smartypants_cb__period, /* 6 */
55
+ smartypants_cb__number, /* 7 */
56
+ smartypants_cb__ltag, /* 8 */
57
+ smartypants_cb__backtick, /* 9 */
58
+ smartypants_cb__escape, /* 10 */
59
+ };
60
+
61
+ static const uint8_t smartypants_cb_chars[] = {
62
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
63
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
64
+ 0, 0, 4, 0, 0, 0, 5, 3, 2, 0, 0, 0, 0, 1, 6, 0,
65
+ 0, 7, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0,
66
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
67
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
68
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
69
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
70
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
71
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
72
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
73
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
74
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
75
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
76
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
77
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
78
+ };
79
+
80
+ static inline int
81
+ word_boundary(uint8_t c)
82
+ {
83
+ return c == 0 || isspace(c) || ispunct(c);
84
+ }
85
+
86
+ static int
87
+ smartypants_quotes(struct buf *ob, uint8_t previous_char, uint8_t next_char, uint8_t quote, int *is_open)
88
+ {
89
+ char ent[8];
90
+
91
+ if (*is_open && !word_boundary(next_char))
92
+ return 0;
93
+
94
+ if (!(*is_open) && !word_boundary(previous_char))
95
+ return 0;
96
+
97
+ snprintf(ent, sizeof(ent), "&%c%cquo;", (*is_open) ? 'r' : 'l', quote);
98
+ *is_open = !(*is_open);
99
+ bufputs(ob, ent);
100
+ return 1;
101
+ }
102
+
103
+ static size_t
104
+ smartypants_cb__squote(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
105
+ {
106
+ if (size >= 2) {
107
+ uint8_t t1 = tolower(text[1]);
108
+
109
+ if (t1 == '\'') {
110
+ if (smartypants_quotes(ob, previous_char, size >= 3 ? text[2] : 0, 'd', &smrt->in_dquote))
111
+ return 1;
112
+ }
113
+
114
+ if ((t1 == 's' || t1 == 't' || t1 == 'm' || t1 == 'd') &&
115
+ (size == 3 || word_boundary(text[2]))) {
116
+ BUFPUTSL(ob, "&rsquo;");
117
+ return 0;
118
+ }
119
+
120
+ if (size >= 3) {
121
+ uint8_t t2 = tolower(text[2]);
122
+
123
+ if (((t1 == 'r' && t2 == 'e') ||
124
+ (t1 == 'l' && t2 == 'l') ||
125
+ (t1 == 'v' && t2 == 'e')) &&
126
+ (size == 4 || word_boundary(text[3]))) {
127
+ BUFPUTSL(ob, "&rsquo;");
128
+ return 0;
129
+ }
130
+ }
131
+ }
132
+
133
+ if (smartypants_quotes(ob, previous_char, size > 0 ? text[1] : 0, 's', &smrt->in_squote))
134
+ return 0;
135
+
136
+ bufputc(ob, text[0]);
137
+ return 0;
138
+ }
139
+
140
+ static size_t
141
+ smartypants_cb__parens(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
142
+ {
143
+ if (size >= 3) {
144
+ uint8_t t1 = tolower(text[1]);
145
+ uint8_t t2 = tolower(text[2]);
146
+
147
+ if (t1 == 'c' && t2 == ')') {
148
+ BUFPUTSL(ob, "&copy;");
149
+ return 2;
150
+ }
151
+
152
+ if (t1 == 'r' && t2 == ')') {
153
+ BUFPUTSL(ob, "&reg;");
154
+ return 2;
155
+ }
156
+
157
+ if (size >= 4 && t1 == 't' && t2 == 'm' && text[3] == ')') {
158
+ BUFPUTSL(ob, "&trade;");
159
+ return 3;
160
+ }
161
+ }
162
+
163
+ bufputc(ob, text[0]);
164
+ return 0;
165
+ }
166
+
167
+ static size_t
168
+ smartypants_cb__dash(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
169
+ {
170
+ if (size >= 3 && text[1] == '-' && text[2] == '-') {
171
+ BUFPUTSL(ob, "&mdash;");
172
+ return 2;
173
+ }
174
+
175
+ if (size >= 2 && text[1] == '-') {
176
+ BUFPUTSL(ob, "&ndash;");
177
+ return 1;
178
+ }
179
+
180
+ bufputc(ob, text[0]);
181
+ return 0;
182
+ }
183
+
184
+ static size_t
185
+ smartypants_cb__amp(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
186
+ {
187
+ if (size >= 6 && memcmp(text, "&quot;", 6) == 0) {
188
+ if (smartypants_quotes(ob, previous_char, size >= 7 ? text[6] : 0, 'd', &smrt->in_dquote))
189
+ return 5;
190
+ }
191
+
192
+ if (size >= 4 && memcmp(text, "&#0;", 4) == 0)
193
+ return 3;
194
+
195
+ bufputc(ob, '&');
196
+ return 0;
197
+ }
198
+
199
+ static size_t
200
+ smartypants_cb__period(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
201
+ {
202
+ if (size >= 3 && text[1] == '.' && text[2] == '.') {
203
+ BUFPUTSL(ob, "&hellip;");
204
+ return 2;
205
+ }
206
+
207
+ if (size >= 5 && text[1] == ' ' && text[2] == '.' && text[3] == ' ' && text[4] == '.') {
208
+ BUFPUTSL(ob, "&hellip;");
209
+ return 4;
210
+ }
211
+
212
+ bufputc(ob, text[0]);
213
+ return 0;
214
+ }
215
+
216
+ static size_t
217
+ smartypants_cb__backtick(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
218
+ {
219
+ if (size >= 2 && text[1] == '`') {
220
+ if (smartypants_quotes(ob, previous_char, size >= 3 ? text[2] : 0, 'd', &smrt->in_dquote))
221
+ return 1;
222
+ }
223
+
224
+ return 0;
225
+ }
226
+
227
+ static size_t
228
+ smartypants_cb__number(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
229
+ {
230
+ if (word_boundary(previous_char) && size >= 3) {
231
+ if (text[0] == '1' && text[1] == '/' && text[2] == '2') {
232
+ if (size == 3 || word_boundary(text[3])) {
233
+ BUFPUTSL(ob, "&frac12;");
234
+ return 2;
235
+ }
236
+ }
237
+
238
+ if (text[0] == '1' && text[1] == '/' && text[2] == '4') {
239
+ if (size == 3 || word_boundary(text[3]) ||
240
+ (size >= 5 && tolower(text[3]) == 't' && tolower(text[4]) == 'h')) {
241
+ BUFPUTSL(ob, "&frac14;");
242
+ return 2;
243
+ }
244
+ }
245
+
246
+ if (text[0] == '3' && text[1] == '/' && text[2] == '4') {
247
+ if (size == 3 || word_boundary(text[3]) ||
248
+ (size >= 6 && tolower(text[3]) == 't' && tolower(text[4]) == 'h' && tolower(text[5]) == 's')) {
249
+ BUFPUTSL(ob, "&frac34;");
250
+ return 2;
251
+ }
252
+ }
253
+ }
254
+
255
+ bufputc(ob, text[0]);
256
+ return 0;
257
+ }
258
+
259
+ static size_t
260
+ smartypants_cb__dquote(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
261
+ {
262
+ if (!smartypants_quotes(ob, previous_char, size > 0 ? text[1] : 0, 'd', &smrt->in_dquote))
263
+ BUFPUTSL(ob, "&quot;");
264
+
265
+ return 0;
266
+ }
267
+
268
+ static size_t
269
+ smartypants_cb__ltag(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
270
+ {
271
+ static const char *skip_tags[] = {
272
+ "pre", "code", "var", "samp", "kbd", "math", "script", "style"
273
+ };
274
+ static const size_t skip_tags_count = 8;
275
+
276
+ size_t tag, i = 0;
277
+
278
+ while (i < size && text[i] != '>')
279
+ i++;
280
+
281
+ for (tag = 0; tag < skip_tags_count; ++tag) {
282
+ if (sdhtml_is_tag(text, size, skip_tags[tag]) == HTML_TAG_OPEN)
283
+ break;
284
+ }
285
+
286
+ if (tag < skip_tags_count) {
287
+ for (;;) {
288
+ while (i < size && text[i] != '<')
289
+ i++;
290
+
291
+ if (i == size)
292
+ break;
293
+
294
+ if (sdhtml_is_tag(text + i, size - i, skip_tags[tag]) == HTML_TAG_CLOSE)
295
+ break;
296
+
297
+ i++;
298
+ }
299
+
300
+ while (i < size && text[i] != '>')
301
+ i++;
302
+ }
303
+
304
+ bufput(ob, text, i + 1);
305
+ return i;
306
+ }
307
+
308
+ static size_t
309
+ smartypants_cb__escape(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
310
+ {
311
+ if (size < 2)
312
+ return 0;
313
+
314
+ switch (text[1]) {
315
+ case '\\':
316
+ case '"':
317
+ case '\'':
318
+ case '.':
319
+ case '-':
320
+ case '`':
321
+ bufputc(ob, text[1]);
322
+ return 1;
323
+
324
+ default:
325
+ bufputc(ob, '\\');
326
+ return 0;
327
+ }
328
+ }
329
+
330
+ #if 0
331
+ static struct {
332
+ uint8_t c0;
333
+ const uint8_t *pattern;
334
+ const uint8_t *entity;
335
+ int skip;
336
+ } smartypants_subs[] = {
337
+ { '\'', "'s>", "&rsquo;", 0 },
338
+ { '\'', "'t>", "&rsquo;", 0 },
339
+ { '\'', "'re>", "&rsquo;", 0 },
340
+ { '\'', "'ll>", "&rsquo;", 0 },
341
+ { '\'', "'ve>", "&rsquo;", 0 },
342
+ { '\'', "'m>", "&rsquo;", 0 },
343
+ { '\'', "'d>", "&rsquo;", 0 },
344
+ { '-', "--", "&mdash;", 1 },
345
+ { '-', "<->", "&ndash;", 0 },
346
+ { '.', "...", "&hellip;", 2 },
347
+ { '.', ". . .", "&hellip;", 4 },
348
+ { '(', "(c)", "&copy;", 2 },
349
+ { '(', "(r)", "&reg;", 2 },
350
+ { '(', "(tm)", "&trade;", 3 },
351
+ { '3', "<3/4>", "&frac34;", 2 },
352
+ { '3', "<3/4ths>", "&frac34;", 2 },
353
+ { '1', "<1/2>", "&frac12;", 2 },
354
+ { '1', "<1/4>", "&frac14;", 2 },
355
+ { '1', "<1/4th>", "&frac14;", 2 },
356
+ { '&', "&#0;", 0, 3 },
357
+ };
358
+ #endif
359
+
360
+ void
361
+ sdhtml_smartypants(struct buf *ob, const uint8_t *text, size_t size)
362
+ {
363
+ size_t i;
364
+ struct smartypants_data smrt = {0, 0};
365
+
366
+ if (!text)
367
+ return;
368
+
369
+ bufgrow(ob, size);
370
+
371
+ for (i = 0; i < size; ++i) {
372
+ size_t org;
373
+ uint8_t action = 0;
374
+
375
+ org = i;
376
+ while (i < size && (action = smartypants_cb_chars[text[i]]) == 0)
377
+ i++;
378
+
379
+ if (i > org)
380
+ bufput(ob, text + org, i - org);
381
+
382
+ if (i < size) {
383
+ i += smartypants_cb_ptrs[(int)action]
384
+ (ob, &smrt, i ? text[i - 1] : 0, text + i, size - i);
385
+ }
386
+ }
387
+ }
388
+
389
+