summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwrmr2025-04-05 21:59:54 -0500
committerwrmr2025-04-05 21:59:54 -0500
commit589e6f67eca81c727873656a19508675810e8f08 (patch)
tree5f7aebd0c276fc9155e4539376615130c5240f2a
parent082896dd9a49bd21d4090a4df5a42e29e4ba36ab (diff)
smart quotes doesn't require --inline, can be unpaired
-rw-r--r--main.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/main.c b/main.c
index 9e964bb..5fc6bd0 100644
--- a/main.c
+++ b/main.c
@@ -272,14 +272,17 @@ BlockList blk_gather(Str src, Arena *perm) {
typedef enum {
IM_ITAL,
IM_CODE,
- IM_DQUOT,
IM_NONE
} InlineMarkup;
-Str im_str_op[IM_NONE] = { S( "<em>"), S( "<code>"), S("“") };
-Str im_str_cl[IM_NONE] = { S("</em>"), S("</code>"), S("”") };
+Str im_str_op[IM_NONE] = { S( "<em>"), S( "<code>"), };
+Str im_str_cl[IM_NONE] = { S("</em>"), S("</code>"), };
+
+#define DQUOT_OP S("“")
+#define DQUOT_CL S("”")
typedef struct {
+ int dquot;
int stkc;
InlineMarkup *stkv;
} InlineState;
@@ -331,9 +334,17 @@ void im_tog(InlineState *ms, Str *out, InlineMarkup mu, Arena *scratch, Arena *p
}
}
+void text_inline(InlineState *ms, char c, Str *out, Arena *perm) {
+ if (c == '"' && opts.smartquot) {
+ str_cat(out, (ms->dquot = !ms->dquot) ? DQUOT_OP : DQUOT_CL, perm);
+ } else {
+ str_catc_html(out, c, perm);
+ }
+}
+
void markup_inline(InlineState *ms, Str *out, Str src, Arena *scratch, Arena *perm) {
if (!opts.inlinep) {
- str_cat_html(out, src, perm);
+ for (int i = 0; i < src.n; i++) text_inline(ms, src.s[i], out, perm);
return;
}
for (int i = 0; i < src.n; i++) {
@@ -347,11 +358,11 @@ void markup_inline(InlineState *ms, Str *out, Str src, Arena *scratch, Arena *pe
} else {
if (c == '`') im_op(ms, out, IM_CODE, scratch, perm);
else if (c == '*') im_tog(ms, out, IM_ITAL, scratch, perm);
- else if (c == '"' && opts.smartquot) im_tog(ms, out, IM_DQUOT, scratch, perm);
else if (str_starts(str_skip(src, i), S("---"))) {
str_cat(out, S("&mdash;"), perm);
i += 2;
} else {
+ text_inline(ms, c, out, perm);
str_catc_html(out, src.s[i], perm);
}
}