@@ -45,10 +45,11 @@
45 45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* mkd_renderer -- functions for rendering parsed data */
46 46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct mkd_renderer {
47 47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* document level callbacks */
48 48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void (*prolog)(struct Blob *ob, void *opaque);
49 49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void (*epilog)(struct Blob *ob, void *opaque);
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void (*footnotes)(struct Blob *ob, const struct Blob *items, void *opaque);
50 51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
51 52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* block level callbacks - NULL skips the block */
52 53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void (*blockcode)(struct Blob *ob, struct Blob *text, void *opaque);
53 54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void (*blockquote)(struct Blob *ob, struct Blob *text, void *opaque);
54 55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void (*blockhtml)(struct Blob *ob, struct Blob *text, void *opaque);
@@ -63,10 +64,12 @@
63 64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *opaque);
64 65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void (*table_cell)(struct Blob *ob, struct Blob *text, int flags,
65 66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *opaque);
66 67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void (*table_row)(struct Blob *ob, struct Blob *cells, int flags,
67 68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *opaque);
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void (*footnote_item)(struct Blob *ob, const struct Blob *text,
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int index, int nUsed, void *opaque);
68 71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
69 72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* span level callbacks - NULL or return 0 prints the span verbatim */
70 73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int (*autolink)(struct Blob *ob, struct Blob *link,
71 74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
enum mkd_autolink type, void *opaque);
72 75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int (*codespan)(struct Blob *ob, struct Blob *text, int nSep, void *opaque);
@@ -79,10 +82,11 @@
79 82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int (*link)(struct Blob *ob, struct Blob *link, struct Blob *title,
80 83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *content, void *opaque);
81 84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int (*raw_html_tag)(struct Blob *ob, struct Blob *tag, void *opaque);
82 85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int (*triple_emphasis)(struct Blob *ob, struct Blob *text,
83 86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char c, void *opaque);
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int (*footnote_ref)(struct Blob *ob, int index, int locus, void *opaque);
84 88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
85 89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* low level callbacks - NULL copies input directly into the output */
86 90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void (*entity)(struct Blob *ob, struct Blob *entity, void *opaque);
87 91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void (*normal_text)(struct Blob *ob, struct Blob *text, void *opaque);
88 92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -122,10 +126,12 @@
122 126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const struct mkd_renderer *rndr);
123 127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
124 128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
125 129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* INTERFACE */
126 130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define BLOB_COUNT(blob_ptr,el_type) (blob_size(blob_ptr)/sizeof(el_type))
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define COUNT_FOOTNOTES(blob_ptr) BLOB_COUNT(blob_ptr,struct footnote)
127 133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
128 134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/***************
129 135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
* LOCAL TYPES *
130 136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
***************/
131 137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -138,10 +144,11 @@
138 144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
139 145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct footnote {
140 146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob id; /* must be the first field as in link_ref struct */
141 147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob text; /* footnote's content that is rendered at the end */
142 148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int index; /* serial number, in the order of appearance */
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nUsed; /* number of references to this note */
143 150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
144 151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
145 152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
146 153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* char_trigger -- function pointer to render active chars */
147 154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* returns the number of chars taken care of */
@@ -158,16 +165,17 @@
158 165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
159 166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* render -- structure containing one particular render */
160 167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct render {
161 168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct mkd_renderer make;
162 169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob refs;
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct Blob footnotes;
164 170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char_trigger active_char[256];
165 171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iDepth; /* Depth of recursion */
166 172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nBlobCache; /* Number of entries in aBlobCache */
167 173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *aBlobCache[20]; /* Cache of Blobs available for reuse */
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nLabels; /* Footnotes counter for the second pass */
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Blob notes; /* array of footnotes */
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iNotesCount; /* count distinct indices found in the second pass */
169 177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
170 178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
171 179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* html_tag -- structure for quick HTML tag search (inspired from discount) */
172 180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct html_tag {
173 181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *text;
@@ -254,15 +262,18 @@
254 262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct link_ref *lra = (void *)a;
255 263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct link_ref *lrb = (void *)b;
256 264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return blob_compare(&lra->id, &lrb->id);
257 265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
258 266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* cmp_footnote_sort -- comparison function for footnotes qsort */
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* cmp_footnote_sort -- comparison function for footnotes qsort.
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * Unused footnotes (when index == 0) sort last */
260 269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int cmp_footnote_sort(const void *a, const void *b){
261 270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const struct footnote *fna = (void *)a, *fnb = (void *)b;
262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( fna->index > 0 && fnb->index > 0 );
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( fna->index >= 0 && fnb->index >= 0 );
263 272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fna->index == fnb->index ) return 0;
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fna->index == 0 ) return 1;
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fnb->index == 0 ) return -1;
264 275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return ( fna->index < fnb->index ? -1 : 1 );
265 276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
266 277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
267 278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* cmp_html_tag -- comparison function for bsearch() (stolen from discount) */
268 279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int cmp_html_tag(const void *a, const void *b){
@@ -1017,38 +1028,37 @@
1017 1028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append(link, blob_buffer(&lr->link), blob_size(&lr->link));
1018 1029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append(title, blob_buffer(&lr->title), blob_size(&lr->title));
1019 1030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
1020 1031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1021 1032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* get_footnote -- resolve footnote by its id
1033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* get_footnote() is invoked during the second pass
1023 1034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
* on success: fill text and return positive footnote's index
1024 1035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
* on failure: return -1 */
1025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int get_footnote(
1036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const struct footnote* get_footnote(
1026 1037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct render *rndr,
1027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct Blob *text,
1028 1038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *data,
1029 1039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t size
1030 1040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
1031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct footnote *fn;
1032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_reset(text); /* use text for temporary storage */
1034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( build_ref_id(text, data, size)<0 ) return -1;
1035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fn = bsearch(text,
1037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_buffer(&rndr->footnotes),
1038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_size(&rndr->footnotes)/sizeof(struct footnote),
1041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct footnote *fn = NULL;
1042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Blob *id = new_work_buffer(rndr);
1043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( build_ref_id(id, data, size)<0 ) goto cleanup;
1044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fn = bsearch(id, blob_buffer(&rndr->notes),
1045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ COUNT_FOOTNOTES(&rndr->notes),
1039 1046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sizeof (struct footnote),
1040 1047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cmp_link_ref);
1041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !fn ) return -1;
1048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !fn ) goto cleanup;
1042 1049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1043 1050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fn->index == 0 ){ /* the first reference to the footnote */
1044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fn->index = ++(rndr->nLabels);
1051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( fn->nUsed == 0 );
1052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fn->index = ++(rndr->iNotesCount);
1045 1053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fn->nUsed++;
1046 1055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( fn->index > 0 );
1047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_reset(text);
1048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(text, blob_buffer(&fn->text), blob_size(&fn->text));
1049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return fn->index;
1056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( fn->nUsed > 0 );
1057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cleanup:
1058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ release_work_buffer( rndr, id );
1059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return fn;
1050 1060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1051 1061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1052 1062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* char_link -- '[': parsing a link or an image */
1053 1063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static size_t char_link(
1054 1064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *ob,
@@ -1055,17 +1065,19 @@
1055 1065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct render *rndr,
1056 1066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *data,
1057 1067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t offset,
1058 1068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t size
1059 1069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
1060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int is_img = (offset && data[-1] == '!'), level;
1070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const int is_img = (offset && data[-1] == '!');
1071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const int is_inline = (offset && data[-1]=='^');
1072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const int is_note = !is_img && (is_inline || (size>1 && data[1]=='^'));
1061 1073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t i = 1, txt_e;
1062 1074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *content = 0;
1063 1075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *link = 0;
1064 1076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *title = 0;
1065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const int is_note = (size && data[1] == '^');
1066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int ret;
1077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const struct footnote *fn = 0;
1078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int level, ret;
1067 1079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1068 1080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* checking whether the correct renderer exists */
1069 1081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (is_img && !rndr->make.image) || (!is_img && !rndr->make.link) ){
1070 1082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
1071 1083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -1135,17 +1147,16 @@
1135 1147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i = id_end+1;
1136 1148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1137 1149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* shortcut reference style link */
1138 1150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
1139 1151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( is_note ){
1140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const int lbl = get_footnote(rndr, link, data+1, txt_e-1);
1141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( lbl <= 0 ){
1142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- goto char_link_cleanup;
1152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( is_inline ){
1153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ //fn = put_footnote(rndr, data+1, txt_e-1);
1154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
1155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fn = get_footnote(rndr, data+1, txt_e-1);
1143 1156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_reset(link);
1145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(link, "#footnote-%i", lbl);
1146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(content,"<sup class='footnote'>%i</sup>",lbl);
1157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !fn ) goto char_link_cleanup;
1147 1158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( get_link_ref(rndr, link, title, data+1, txt_e-1)<0 ){
1148 1159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto char_link_cleanup;
1149 1160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1150 1161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1151 1162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* rewinding the whitespace */
@@ -1153,17 +1164,21 @@
1153 1164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1154 1165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1155 1166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* building content: img alt is escaped, link content is parsed */
1156 1167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( txt_e>1 ){
1157 1168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( is_img ) blob_append(content, data+1, txt_e-1);
1158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- else if(!is_note) parse_inline(content, rndr, data+1, txt_e-1);
1169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ else if(is_inline) parse_inline(content, rndr, data+1, txt_e-1);
1159 1170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1160 1171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1161 1172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* calling the relevant rendering function */
1162 1173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( is_img ){
1163 1174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( blob_size(ob)>0 && blob_buffer(ob)[blob_size(ob)-1]=='!' ) ob->nUsed--;
1164 1175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ret = rndr->make.image(ob, link, title, content, rndr->make.opaque);
1176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if(fn){
1177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(rndr->make.footnote_ref){
1178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ret = rndr->make.footnote_ref(ob,fn->index,fn->nUsed,rndr->make.opaque);
1179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1165 1180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
1166 1181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ret = rndr->make.link(ob, link, title, content, rndr->make.opaque);
1167 1182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1168 1183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1169 1184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* cleanup */
@@ -2250,11 +2265,11 @@
2250 2265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
2251 2266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t i = 0;
2252 2267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t id_offset, id_end;
2253 2268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t note_offset, note_end;
2254 2269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t line_end;
2255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct footnote fn = { empty_blob, empty_blob, 0 };
2270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct footnote fn = { empty_blob, empty_blob, 0, 0 };
2256 2271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2257 2272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* footnote definition must start at the begining of a line */
2258 2273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( beg+4>=end ) return 0;
2259 2274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i += beg;
2260 2275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -2311,20 +2326,21 @@
2311 2326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
2312 2327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct link_ref *lr;
2313 2328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct footnote *fn;
2314 2329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t i, beg, end = 0;
2315 2330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct render rndr;
2316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Blob text = BLOB_INITIALIZER; /* input after the first pass */
2331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob text = BLOB_INITIALIZER; /* input after the first pass */
2332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nLabeled; /* number of footnotes found by the first pass */
2317 2333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2318 2334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* filling the render structure */
2319 2335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !rndrer ) return;
2320 2336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rndr.make = *rndrer;
2321 2337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rndr.nBlobCache = 0;
2322 2338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rndr.iDepth = 0;
2323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rndr.refs = empty_blob;
2324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rndr.footnotes = empty_blob;
2325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rndr.nLabels = 0;
2339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr.refs = empty_blob;
2340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr.notes = empty_blob;
2341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr.iNotesCount = 0;
2326 2342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<256; i++) rndr.active_char[i] = 0;
2327 2343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (rndr.make.emphasis
2328 2344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| rndr.make.double_emphasis
2329 2345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| rndr.make.triple_emphasis)
2330 2346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& rndr.make.emph_chars
@@ -2345,11 +2361,11 @@
2345 2361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
beg = 0;
2346 2362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(const size_t size = blob_size(ib); beg<size ;){
2347 2363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char* const data = blob_buffer(ib);
2348 2364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( is_ref(data, beg, size, &end, &rndr.refs) ){
2349 2365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
beg = end;
2350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( is_footnote(data, beg, size, &end, &rndr.footnotes) ){
2366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if(is_footnote(data, beg, size, &end, &rndr.notes)){
2351 2367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* FIXME: fossil_print("\nfootnote found at %i\n", beg); */
2352 2368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
beg = end;
2353 2369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{ /* skipping to the next line */
2354 2370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
end = beg;
2355 2371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( end<size && data[end]!='\n' && data[end]!='\r' ){
@@ -2373,41 +2389,39 @@
2373 2389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
qsort(blob_buffer(&rndr.refs),
2374 2390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_size(&rndr.refs)/sizeof(struct link_ref),
2375 2391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sizeof(struct link_ref),
2376 2392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cmp_link_ref_sort);
2377 2393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nLabeled = COUNT_FOOTNOTES(&rndr.notes);
2378 2395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* sorting the footnotes array by id */
2379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( blob_size(&rndr.footnotes) ){
2380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- qsort(blob_buffer(&rndr.footnotes),
2381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_size(&rndr.footnotes)/sizeof(struct footnote),
2382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sizeof(struct footnote),
2396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nLabeled ){
2397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ qsort(blob_buffer(&rndr.notes), nLabeled, sizeof(struct footnote),
2383 2398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cmp_link_ref_sort);
2384 2399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2385 2400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2386 2401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* second pass: actual rendering */
2387 2402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rndr.make.prolog ) rndr.make.prolog(ob, rndr.make.opaque);
2388 2403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
parse_block(ob, &rndr, blob_buffer(&text), blob_size(&text));
2389 2404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* sorting the footnotes array by index */
2391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( blob_size(&rndr.footnotes) ){
2392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- qsort(blob_buffer(&rndr.footnotes),
2393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_size(&rndr.footnotes)/sizeof(struct footnote),
2394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sizeof(struct footnote),
2395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cmp_footnote_sort);
2396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
2397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* FIXME: decouple parsing and HTML-specific rendering of footnotes */
2398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rndr.nLabels ){
2399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fn = (struct footnote *)blob_buffer(&rndr.footnotes);
2400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- end = blob_size(&rndr.footnotes)/sizeof(struct footnote);
2401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(ob, "\n<ol class='footnotes'>\n");
2402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=0; i<end; i++){
2403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(fn[i].index == 0) continue;
2404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(ob, "<li id='footnote-%i'>\n ", fn[i].index );
2405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- parse_inline(ob,&rndr,blob_buffer(&fn[i].text),blob_size(&fn[i].text));
2406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(ob,"\n</li>\n",7);
2407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
2408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(ob, "</ol>\n", 7);
2405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fn = (struct footnote*)blob_buffer(&rndr.notes);
2406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(rndr.iNotesCount && rndr.make.footnote_item && rndr.make.footnotes){
2407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob * one_item = new_work_buffer(&rndr);
2408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob * all_items = new_work_buffer(&rndr);
2409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ qsort( fn, COUNT_FOOTNOTES(&rndr.notes), sizeof(struct footnote),
2410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cmp_footnote_sort /* sort footnotes by index */ );
2411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset( all_items );
2412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<rndr.iNotesCount; i++){
2413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( fn[i].index == i+1 );
2414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset( one_item );
2416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ parse_inline( one_item, &rndr, blob_buffer(&fn[i].text),
2417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_size(&fn[i].text));
2418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr.make.footnote_item( all_items, one_item, i+1, fn[i].nUsed, rndr.make.opaque);
2419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr.make.footnotes(ob, all_items, rndr.make.opaque );
2421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ release_work_buffer( &rndr, one_item );
2422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ release_work_buffer( &rndr, all_items );
2409 2423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2410 2424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rndr.make.epilog ) rndr.make.epilog(ob, rndr.make.opaque);
2411 2425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2412 2426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* clean-up */
2413 2427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( rndr.iDepth==0 );
@@ -2418,9 +2432,15 @@
2418 2432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&lr[i].id);
2419 2433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&lr[i].link);
2420 2434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&lr[i].title);
2421 2435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2422 2436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&rndr.refs);
2437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ end = COUNT_FOOTNOTES(&rndr.notes);
2438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<end; i++){
2439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&fn[i].id);
2440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&fn[i].text);
2441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&rndr.notes);
2423 2443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<rndr.nBlobCache; i++){
2424 2444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(rndr.aBlobCache[i]);
2425 2445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2426 2446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2427 2447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!