@@ -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,12 @@
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, const struct Blob *span,
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const struct Blob *upc, int index, int locus, void *opaque);
84 89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
85 90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* low level callbacks - NULL copies input directly into the output */
86 91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void (*entity)(struct Blob *ob, struct Blob *entity, void *opaque);
87 92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void (*normal_text)(struct Blob *ob, struct Blob *text, void *opaque);
88 93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -113,31 +118,54 @@
113 118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
114 119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**********************
115 120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
* EXPORTED FUNCTIONS *
116 121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**********************/
117 122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* markdown -- parses the input buffer and renders it into the output buffer */
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** markdown -- parses the input buffer and renders it into the output buffer.
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
119 126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void markdown(
120 127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *ob,
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct Blob *ib,
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const struct Blob *ib,
122 129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const struct mkd_renderer *rndr);
123 130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
124 131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
125 132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* INTERFACE */
126 133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define BLOB_COUNT(pBlob,el_type) (blob_size(pBlob)/sizeof(el_type))
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define COUNT_FOOTNOTES(pBlob) BLOB_COUNT(pBlob,struct footnote)
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define CAST_AS_FOOTNOTES(pBlob) ((struct footnote*)blob_buffer(pBlob))
127 137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
128 138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/***************
129 139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
* LOCAL TYPES *
130 140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
***************/
131 141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* link_ref -- reference to a link */
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** link_ref -- reference to a link.
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
133 145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct link_ref {
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct Blob id;
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Blob id; /* must be the first field as in footnote struct */
135 147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob link;
136 148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob title;
137 149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
138 150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** A footnote's data.
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** id, text, and upc fields must be in that particular order.
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct footnote {
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Blob id; /* must be the first field as in link_ref struct */
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Blob text; /* footnote's content that is rendered at the end */
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Blob upc; /* user-provided classes .ASCII-alnum.or-hypen: */
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bRndred; /* indicates if `text` holds a rendered content */
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int defno; /* serial number of definition, set during the first pass */
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int index; /* set to the index within array after ordering by id */
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iMark; /* user-visible numeric marker, assigned upon the first use*/
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nUsed; /* counts references to this note, increments upon each use*/
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define FOOTNOTE_INITIALIZER {empty_blob,empty_blob,empty_blob, 0,0,0,0,0}
139 167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
140 168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* char_trigger -- function pointer to render active chars */
141 169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* returns the number of chars taken care of */
142 170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* data is the pointer of the beginning of the span */
143 171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* offset is the number of valid chars before data */
@@ -156,12 +184,19 @@
156 184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob refs;
157 185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char_trigger active_char[256];
158 186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iDepth; /* Depth of recursion */
159 187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nBlobCache; /* Number of entries in aBlobCache */
160 188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *aBlobCache[20]; /* Cache of Blobs available for reuse */
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct {
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob all; /* Buffer that holds array of footnotes. Its underline
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memory may be reallocated when a new footnote is added. */
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nLbled; /* number of labeled footnotes found during the first pass */
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nMarks; /* counts distinct indices found during the second pass */
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct footnote misref; /* nUsed counts misreferences, iMark must be -1 */
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } notes;
161 197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
163 198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
164 199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* html_tag -- structure for quick HTML tag search (inspired from discount) */
165 200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct html_tag {
166 201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *text;
167 202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int size;
@@ -183,16 +218,18 @@
183 218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
{ "html", 4 },
184 219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
{ "pre", 3 },
185 220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
{ "script", 6 },
186 221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
187 222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
189 223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/***************************
190 224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
* STATIC HELPER FUNCTIONS *
191 225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
***************************/
192 226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* build_ref_id -- collapse whitespace from input text to make it a ref id */
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** build_ref_id -- collapse whitespace from input text to make it a ref id.
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Potential TODO: maybe also handle CR+LF line endings?
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
194 231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int build_ref_id(struct Blob *id, const char *data, size_t size){
195 232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t beg, i;
196 233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *id_data;
197 234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
198 235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* skip leading whitespace */
@@ -247,10 +284,58 @@
247 284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct link_ref *lra = (void *)a;
248 285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct link_ref *lrb = (void *)b;
249 286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return blob_compare(&lra->id, &lrb->id);
250 287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
251 288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** cmp_footnote_id -- comparison function for footnotes qsort.
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Empty IDs sort last (in undetermined order).
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Equal IDs are sorted in the order of definition in the source.
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int cmp_footnote_id(const void *fna, const void *fnb){
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const struct footnote *a = fna, *b = fnb;
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const int szA = blob_size(&a->id), szB = blob_size(&b->id);
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( szA ){
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( szB ){
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int cmp = blob_compare(&a->id, &b->id);
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( cmp ) return cmp;
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else return -1;
302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else return szB ? 1 : 0;
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* IDs are equal and non-empty */
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( a->defno < b->defno ) return -1;
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( a->defno > b->defno ) return 1;
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert(!"reachable");
307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0; /* should never reach here */
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** cmp_footnote_sort -- comparison function for footnotes qsort.
312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Unreferenced footnotes (when nUsed == 0) sort last and
313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are sorted in the order of definition in the source.
314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int cmp_footnote_sort(const void *fna, const void *fnb){
316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const struct footnote *a = fna, *b = fnb;
317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i, j;
318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( a->nUsed >= 0 );
319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( b->nUsed >= 0 );
320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( a->defno >= 0 );
321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( b->defno >= 0 );
322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( a->nUsed ){
323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( a->iMark > 0 );
324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !b->nUsed ) return -1;
325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( b->iMark > 0 );
326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i = a->iMark;
327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ j = b->iMark;
328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( b->nUsed ) return 1;
330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i = a->defno;
331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ j = b->defno;
332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i < j ) return -1;
334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i > j ) return 1;
335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
252 337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
253 338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* cmp_html_tag -- comparison function for bsearch() (stolen from discount) */
254 339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int cmp_html_tag(const void *a, const void *b){
255 340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const struct html_tag *hta = a;
256 341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const struct html_tag *htb = b;
@@ -579,12 +664,14 @@
579 664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fossil_isalnum(after) ) return 0;
580 665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1;
581 666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
582 667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
583 668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* parse_emph1 -- parsing single emphasis */
585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* closed by a symbol not preceded by whitespace and not followed by symbol */
669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** parse_emph1 -- parsing single emphasis.
671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** closed by a symbol not preceded by whitespace and not followed by symbol.
672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
586 673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static size_t parse_emph1(
587 674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *ob,
588 675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct render *rndr,
589 676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *data,
590 677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t size,
@@ -624,12 +711,13 @@
624 711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
625 712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
626 713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
627 714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
628 715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* parse_emph2 -- parsing single emphasis */
716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** parse_emph2 -- parsing single emphasis.
718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
631 719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static size_t parse_emph2(
632 720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *ob,
633 721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct render *rndr,
634 722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *data,
635 723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t size,
@@ -663,13 +751,14 @@
663 751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i++;
664 752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
665 753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
666 754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
667 755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* parse_emph3 -- parsing single emphasis */
670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* finds the first closing tag, and delegates to the other emph */
756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** parse_emph3 -- parsing single emphasis.
758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** finds the first closing tag, and delegates to the other emph.
759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
671 760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static size_t parse_emph3(
672 761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *ob,
673 762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct render *rndr,
674 763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *data,
675 764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t size,
@@ -711,12 +800,13 @@
711 800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
712 801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
713 802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
714 803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
715 804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* char_emphasis -- single and double emphasis parsing */
805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** char_emphasis -- single and double emphasis parsing.
807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
718 808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static size_t char_emphasis(
719 809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *ob,
720 810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct render *rndr,
721 811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *data,
722 812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t offset,
@@ -756,12 +846,13 @@
756 846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return ret+3;
757 847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
758 848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
759 849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
760 850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* char_linebreak -- '\n' preceded by two spaces (assuming linebreak != 0) */
851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** char_linebreak -- '\n' preceded by two spaces (assuming linebreak != 0).
853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
763 854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static size_t char_linebreak(
764 855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *ob,
765 856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct render *rndr,
766 857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *data,
767 858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t offset,
@@ -771,12 +862,13 @@
771 862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* removing the last space from ob and rendering */
772 863 { 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--;
773 864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rndr->make.linebreak(ob, rndr->make.opaque) ? 1 : 0;
774 865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
775 866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* char_codespan -- '`' parsing a code span (assuming codespan != 0) */
867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** char_codespan -- '`' parsing a code span (assuming codespan != 0).
869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
778 870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static size_t char_codespan(
779 871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *ob,
780 872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct render *rndr,
781 873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *data,
782 874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t offset,
@@ -813,11 +905,13 @@
813 905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
814 906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return end;
815 907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
816 908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
817 909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* char_escape -- '\\' backslash escape */
910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** char_escape -- '\\' backslash escape.
912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
819 913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static size_t char_escape(
820 914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *ob,
821 915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct render *rndr,
822 916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *data,
823 917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t offset,
@@ -833,13 +927,14 @@
833 927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
834 928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
835 929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 2;
836 930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
837 931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* char_entity -- '&' escaped when it doesn't belong to an entity */
840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* valid entities are assumed to be anything matching &#?[A-Za-z0-9]+; */
932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** char_entity -- '&' escaped when it doesn't belong to an entity.
934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** valid entities are assumed to be anything matching &#?[A-Za-z0-9]+;
935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
841 936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static size_t char_entity(
842 937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *ob,
843 938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct render *rndr,
844 939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *data,
845 940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t offset,
@@ -869,12 +964,13 @@
869 964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append(ob, data, end);
870 965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
871 966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return end;
872 967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
873 968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* char_langle_tag -- '<' when tags or autolinks are allowed */
969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** char_langle_tag -- '<' when tags or autolinks are allowed.
971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
876 972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static size_t char_langle_tag(
877 973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *ob,
878 974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct render *rndr,
879 975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *data,
880 976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t offset,
@@ -899,12 +995,12 @@
899 995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
900 996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return end;
901 997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
902 998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
903 999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* get_link_inline -- extract inline-style link and title from
1000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** get_link_inline -- extract inline-style link and title from
906 1002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** parenthesed data
907 1003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
908 1004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int get_link_inline(
909 1005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *link,
910 1006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *title,
@@ -954,11 +1050,11 @@
954 1050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
link_e--;
955 1051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
956 1052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
957 1053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* remove optional angle brackets around the link */
958 1054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( data[link_b]=='<' ) link_b += 1;
959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( data[link_e-1]=='>' ) link_e -= 1;
1055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( link_e && data[link_e-1]=='>' ) link_e -= 1;
960 1056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
961 1057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* escape backslashed character from link */
962 1058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(link);
963 1059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i = link_b;
964 1060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( i<link_e ){
@@ -975,145 +1071,353 @@
975 1071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* this function always succeed */
976 1072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
977 1073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
978 1074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
979 1075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* get_link_ref -- extract referenced link and title from id */
1076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** get_link_ref -- extract referenced link and title from id.
1078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
981 1079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int get_link_ref(
982 1080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct render *rndr,
983 1081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *link,
984 1082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *title,
985 1083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *data,
986 1084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t size
987 1085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
988 1086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct link_ref *lr;
1087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const size_t sz = blob_size(&rndr->refs);
989 1088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
990 1089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* find the link from its id (stored temporarily in link) */
991 1090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(link);
992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( build_ref_id(link, data, size)<0 ) return -1;
1091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !sz || build_ref_id(link, data, size)<0 ) return -1;
993 1092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lr = bsearch(link,
994 1093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_buffer(&rndr->refs),
995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_size(&rndr->refs)/sizeof(struct link_ref),
1094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sz/sizeof(struct link_ref),
996 1095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sizeof (struct link_ref),
997 1096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cmp_link_ref);
998 1097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !lr ) return -1;
999 1098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1000 1099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* fill the output buffers */
1001 1100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(link);
1002 1101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(title);
1003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(link, blob_buffer(&lr->link), blob_size(&lr->link));
1004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(title, blob_buffer(&lr->title), blob_size(&lr->title));
1102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendb(link, &lr->link);
1103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendb(title, &lr->title);
1104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
1105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** get_footnote() -- find a footnote by label, invoked during the 2nd pass.
1109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If found then return a shallow copy of the corresponding footnote;
1110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** otherwise return a shallow copy of rndr->notes.misref.
1111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** In both cases corresponding `nUsed` field is incremented before return.
1112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static struct footnote get_footnote(
1114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct render *rndr,
1115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *data,
1116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t size
1117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
1118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct footnote *fn = 0;
1119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Blob *id;
1120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !rndr->notes.nLbled ) goto fallback;
1121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ id = new_work_buffer(rndr);
1122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( build_ref_id(id, data, size)<0 ) goto cleanup;
1123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fn = bsearch(id, blob_buffer(&rndr->notes.all),
1124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr->notes.nLbled,
1125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sizeof (struct footnote),
1126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cmp_link_ref);
1127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !fn ) goto cleanup;
1128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fn->nUsed == 0 ){ /* the first reference to the footnote */
1130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( fn->iMark == 0 );
1131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fn->iMark = ++(rndr->notes.nMarks);
1132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( fn->iMark > 0 );
1134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cleanup:
1135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ release_work_buffer( rndr, id );
1136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fallback:
1137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !fn ) fn = &rndr->notes.misref;
1138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fn->nUsed++;
1139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( fn->nUsed > 0 );
1140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return *fn;
1141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Counts characters in the blank prefix within at most nHalfLines.
1145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** A sequence of spaces and tabs counts as odd halfline,
1146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a newline counts as even halfline.
1147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If nHalfLines < 0 then proceed without constraints.
1148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static inline size_t sizeof_blank_prefix(
1150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *data, size_t size, int nHalfLines
1151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
1152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *p = data;
1153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char * const end = data+size;
1154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nHalfLines < 0 ){
1155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( p!=end && fossil_isspace(*p) ){
1156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p++;
1157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else while( nHalfLines > 0 ){
1159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( p!=end && (*p==' ' || *p=='\t' ) ){ p++; }
1160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p==end || --nHalfLines == 0 ) break;
1161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( *p=='\n' || *p=='\r' ){
1162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p++;
1163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p==end ) break;
1164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( *p=='\n' && p[-1]=='\r' ){
1165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p++;
1166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nHalfLines--;
1169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return p-data;
1171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Check if the data starts with a classlist token of the special form.
1175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If so then return the length of that token, otherwise return 0.
1176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The token must start with a dot and must end with a colon;
1178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in between of these it must be a dot-separated list of words;
1179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** each word may contain only alphanumeric characters and hyphens.
1180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If `bBlank` is non-zero then a blank character must follow
1182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the token's ending colon: otherwise function returns 0
1183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** despite the well-formed token.
1184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static size_t is_footnote_classlist(const char * const data, size_t size,
1186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bBlank){
1187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *p;
1188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char * const end = data+size;
1189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( data==end || *data != '.' ) return 0;
1190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(p=data+1; p!=end; p++){
1191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fossil_isalnum(*p) || *p=='-' ) continue;
1192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p[-1]=='.' ) break;
1193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( *p==':' ){
1194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p++;
1195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bBlank ){
1196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p==end || !fossil_isspace(*p) ) break;
1197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return p-data;
1199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( *p!='.' ) break;
1201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
1203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Adds unlabeled footnote to the rndr->notes.all.
1207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** On success puts a shallow copy of the constructed footnote into pFN
1208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and returns 1, otherwise pFN is unchanged and 0 is returned.
1209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static inline int add_inline_footnote(
1211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct render *rndr,
1212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *text,
1213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t size,
1214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct footnote* pFN
1215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
1216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct footnote fn = FOOTNOTE_INITIALIZER, *last;
1217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zUPC = 0;
1218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t nUPC = 0, n = sizeof_blank_prefix(text, size, 3);
1219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( n >= size ) return 0;
1220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ text += n;
1221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size -= n;
1222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nUPC = is_footnote_classlist(text, size, 1);
1223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nUPC ){
1224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( nUPC<size );
1225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zUPC = text;
1226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ text += nUPC;
1227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size -= nUPC;
1228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sizeof_blank_prefix(text,size,-1)==size ){
1230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !nUPC ) return 0; /* empty inline footnote */
1231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ text = zUPC;
1232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size = nUPC; /* bare classlist is treated */
1233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nUPC = 0; /* as plain text */
1234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fn.iMark = ++(rndr->notes.nMarks);
1236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fn.nUsed = 1;
1237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fn.index = COUNT_FOOTNOTES(&rndr->notes.all);
1238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( fn.iMark > 0 );
1239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&fn.text, text, size);
1240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(nUPC) blob_append(&fn.upc, zUPC, nUPC);
1241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&rndr->notes.all, (char *)&fn, sizeof fn);
1242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ last = (struct footnote*)( blob_buffer(&rndr->notes.all)
1243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ +( blob_size(&rndr->notes.all)-sizeof fn ));
1244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pFN );
1245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy( pFN, last, sizeof fn );
1246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1;
1247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return the byte offset of the matching closing bracket or 0 if not
1251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** found. begin[0] must be either '[' or '('.
1252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** TODO: It seems that things like "\\(" are not handled correctly.
1254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** That is historical behavior for a corner-case,
1255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** so it's left as it is until somebody complains.
1256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static inline size_t matching_bracket_offset(
1258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char* begin,
1259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char* end
1260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
1261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *i;
1262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int level;
1263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char bra = *begin;
1264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char ket = bra=='[' ? ']' : ')';
1265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( bra=='[' || bra=='(' );
1266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=begin+1,level=1; i!=end; i++){
1267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( *i=='\n' ) /* do nothing */;
1268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ else if( i[-1]=='\\' ) continue;
1269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ else if( *i==bra ) level++;
1270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ else if( *i==ket ){
1271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( --level<=0 ) return i-begin;
1272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1005 1274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
1006 1275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1007 1276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** char_footnote -- '(': parsing a standalone inline footnote.
1279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static size_t char_footnote(
1281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Blob *ob,
1282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct render *rndr,
1283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *data,
1284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t offset,
1285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t size
1286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
1287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t end;
1288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct footnote fn;
1008 1289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* char_link -- '[': parsing a link or an image */
1290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( size<4 || data[1]!='^' ) return 0;
1291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ end = matching_bracket_offset(data, data+size);
1292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !end ) return 0;
1293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !add_inline_footnote(rndr, data+2, end-2, &fn) ) return 0;
1294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rndr->make.footnote_ref ){
1295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr->make.footnote_ref(ob,0,&fn.upc,fn.iMark,1,rndr->make.opaque);
1296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return end+1;
1298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** char_link -- '[': parsing a link or an image.
1302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1010 1303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static size_t char_link(
1011 1304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *ob,
1012 1305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct render *rndr,
1013 1306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *data,
1014 1307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t offset,
1015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- size_t size
1308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t size /* parse_inline() ensures that size > 0 */
1016 1309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
1017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int is_img = (offset && data[-1] == '!'), level;
1310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const int is_img = (offset && data[-1] == '!');
1018 1311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t i = 1, txt_e;
1019 1312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *content = 0;
1020 1313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *link = 0;
1021 1314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *title = 0;
1315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct footnote fn;
1022 1316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int ret;
1023 1317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1024 1318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* checking whether the correct renderer exists */
1025 1319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (is_img && !rndr->make.image) || (!is_img && !rndr->make.link) ){
1026 1320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
1027 1321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1028 1322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1029 1323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* looking for the matching closing bracket */
1030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(level=1; i<size; i++){
1031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( data[i]=='\n' ) /* do nothing */;
1032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- else if( data[i-1]=='\\' ) continue;
1033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- else if( data[i]=='[' ) level += 1;
1034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- else if( data[i]==']' ){
1035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- level--;
1036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( level<=0 ) break;
1037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( i>=size ) return 0;
1040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- txt_e = i;
1041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- i++;
1042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* skip any amount of whitespace or newline */
1044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* (this is much more laxist than original markdown syntax) */
1045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( i<size && (data[i]==' ' || data[i]=='\t' || data[i]=='\n') ){ i++; }
1046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* allocate temporary buffers to store content, link and title */
1048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- title = new_work_buffer(rndr);
1049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- content = new_work_buffer(rndr);
1050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- link = new_work_buffer(rndr);
1324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ txt_e = matching_bracket_offset(data, data+size);
1325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !txt_e ) return 0;
1326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i = txt_e + 1;
1051 1327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ret = 0; /* error if we don't get to the callback */
1052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* inline style link */
1054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( i<size && data[i]=='(' ){
1055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- size_t span_end = i;
1056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( span_end<size
1057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && !(data[span_end]==')' && (span_end==i || data[span_end-1]!='\\'))
1058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
1059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- span_end++;
1060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( span_end>=size
1063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || get_link_inline(link, title, data+i+1, span_end-(i+1))<0
1064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
1065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- goto char_link_cleanup;
1066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- i = span_end+1;
1069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* reference style link */
1071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( i<size && data[i]=='[' ){
1072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *id_data;
1073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- size_t id_size, id_end = i;
1074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( id_end<size && data[id_end]!=']' ){ id_end++; }
1076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( id_end>=size ) goto char_link_cleanup;
1078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( i+1==id_end ){
1080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* implicit id - use the contents */
1081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- id_data = data+1;
1082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- id_size = txt_e-1;
1083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
1084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* explicit id - between brackets */
1085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- id_data = data+i+1;
1086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- id_size = id_end-(i+1);
1087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( get_link_ref(rndr, link, title, id_data, id_size)<0 ){
1090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- goto char_link_cleanup;
1091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- i = id_end+1;
1094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* shortcut reference style link */
1096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
1097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( get_link_ref(rndr, link, title, data+1, txt_e-1)<0 ){
1098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- goto char_link_cleanup;
1099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* rewinding the whitespace */
1102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- i = txt_e+1;
1103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fn.nUsed = 0;
1329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* free-standing footnote refernece */
1331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(!is_img && size>3 && data[1]=='^'){
1332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fn = get_footnote(rndr, data+2, txt_e-2);
1333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
1334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* skip "inter-bracket-whitespace" - any amount of whitespace or newline */
1336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* (this is much more lax than original markdown syntax) */
1337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( i<size && (data[i]==' ' || data[i]=='\t' || data[i]=='\n') ){ i++; }
1338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* allocate temporary buffers to store content, link and title */
1340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ title = new_work_buffer(rndr);
1341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ content = new_work_buffer(rndr);
1342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ link = new_work_buffer(rndr);
1343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i<size && data[i]=='(' ){
1345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i+2<size && data[i+1]=='^' ){ /* span-bounded inline footnote */
1347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const size_t k = matching_bracket_offset(data+i, data+size);
1349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !k ) goto char_link_cleanup;
1350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ add_inline_footnote(rndr, data+(i+2), k-2, &fn);
1351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i += k+1;
1352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{ /* inline style link */
1353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t span_end = i;
1354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( span_end<size
1355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && !(data[span_end]==')'
1356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (span_end==i || data[span_end-1]!='\\')) ){
1357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ span_end++;
1358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( span_end>=size
1360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || get_link_inline(link, title, data+i+1, span_end-(i+1))<0 ){
1361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto char_link_cleanup;
1362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i = span_end+1;
1364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* reference style link or span-bounded footnote reference */
1366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( i<size && data[i]=='[' ){
1367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *id_data;
1368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t id_size, id_end = i;
1369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bFootnote;
1370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( id_end<size && data[id_end]!=']' ){ id_end++; }
1372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( id_end>=size ) goto char_link_cleanup;
1373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bFootnote = data[i+1]=='^';
1374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i+1==id_end || (bFootnote && i+2==id_end) ){
1375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* implicit id - use the contents */
1376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ id_data = data+1;
1377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ id_size = txt_e-1;
1378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
1379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* explicit id - between brackets */
1380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ id_data = data+i+1;
1381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ id_size = id_end-(i+1);
1382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bFootnote ){
1383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ id_data++;
1384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ id_size--;
1385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bFootnote ){
1388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fn = get_footnote(rndr, id_data, id_size);
1389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( get_link_ref(rndr, link, title, id_data, id_size)<0 ){
1390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto char_link_cleanup;
1391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i = id_end+1;
1393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* shortcut reference style link */
1394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
1395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( get_link_ref(rndr, link, title, data+1, txt_e-1)<0 ){
1396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto char_link_cleanup;
1397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* rewinding an "inter-bracket-whitespace" */
1399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i = txt_e+1;
1400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1105 1402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* building content: img alt is escaped, link content is parsed */
1106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( txt_e>1 ){
1403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( txt_e>1 && content ){
1107 1404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( is_img ) blob_append(content, data+1, txt_e-1);
1108 1405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
else parse_inline(content, rndr, data+1, txt_e-1);
1109 1406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1110 1407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1111 1408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* calling the relevant rendering function */
1112 1409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( is_img ){
1113 { 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--;
1410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( blob_size(ob)>0 && blob_buffer(ob)[blob_size(ob)-1]=='!' ){
1411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ob->nUsed--;
1412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1114 1413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ret = rndr->make.image(ob, link, title, content, rndr->make.opaque);
1414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( fn.nUsed ){
1415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rndr->make.footnote_ref ){
1416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ret = rndr->make.footnote_ref(ob, content, &fn.upc, fn.iMark,
1417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fn.nUsed, rndr->make.opaque);
1418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1115 1419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
1116 1420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ret = rndr->make.link(ob, link, title, content, rndr->make.opaque);
1117 1421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1118 1422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1119 1423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* cleanup */
@@ -1121,11 +1425,10 @@
1121 1425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
release_work_buffer(rndr, title);
1122 1426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
release_work_buffer(rndr, link);
1123 1427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
release_work_buffer(rndr, content);
1124 1428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return ret ? i : 0;
1125 1429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1127 1430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1128 1431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1129 1432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*********************************
1130 1433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
* BLOCK-LEVEL PARSING FUNCTIONS *
1131 1434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*********************************/
@@ -1806,11 +2109,12 @@
1806 2109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* the end of the block has been found */
1807 2110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( strcmp(curtag->text,"html")==0 ){
1808 2111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Omit <html> tags */
1809 2112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
enum mkd_autolink dummy;
1810 2113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int k = tag_length(data, size, &dummy);
1811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_init(&work, data+k, i-(j+k));
2114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int sz = i - (j+k);
2115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sz>0 ) blob_init(&work, data+k, sz);
1812 2116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
1813 2117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_init(&work, data, i);
1814 2118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1815 2119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rndr->make.blockhtml ){
1816 2120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rndr->make.blockhtml(ob, &work, rndr->make.opaque);
@@ -2013,11 +2317,13 @@
2013 2317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *data, /* input text */
2014 2318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t size /* input text size */
2015 2319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
2016 2320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t beg, end, i;
2017 2321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *txt_data;
2018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int has_table = (rndr->make.table
2322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int has_table;
2323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !size ) return;
2324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ has_table = (rndr->make.table
2019 2325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& rndr->make.table_row
2020 2326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& rndr->make.table_cell
2021 2327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& memchr(data, '|', size)!=0);
2022 2328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2023 2329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
beg = 0;
@@ -2063,11 +2369,11 @@
2063 2369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
* REFERENCE PARSING *
2064 2370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*********************/
2065 2371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2066 2372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* is_ref -- returns whether a line is a reference or not */
2067 2373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int is_ref(
2068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *data, /* input text */
2374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *data, /* input text */
2069 2375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t beg, /* offset of the beginning of the line */
2070 2376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t end, /* offset of the end of the text */
2071 2377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t *last, /* last character of the link */
2072 2378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *refs /* array of link references */
2073 2379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
@@ -2097,10 +2403,12 @@
2097 2403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i += beg;
2098 2404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2099 2405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* id part: anything but a newline between brackets */
2100 2406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( data[i]!='[' ) return 0;
2101 2407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i++;
2408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i>=end || data[i]=='^' ) return 0; /* see is_footnote() */
2409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2102 2410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
id_offset = i;
2103 2411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( i<end && data[i]!='\n' && data[i]!='\r' && data[i]!=']' ){ i++; }
2104 2412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( i>=end || data[i]!=']' ) return 0;
2105 2413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
id_end = i;
2106 2414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -2125,10 +2433,11 @@
2125 2433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& data[i]!='\n'
2126 2434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& data[i]!='\r'
2127 2435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
2128 2436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i += 1;
2129 2437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* TODO: maybe require both data[i-1]=='>' && data[link_offset-1]=='<' ? */
2130 2439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( data[i-1]=='>' ) link_end = i-1; else link_end = i;
2131 2440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2132 2441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* optional spacer: (space | tab)* (newline | '\'' | '"' | '(' ) */
2133 2442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( i<end && (data[i]==' ' || data[i]=='\t') ){ i++; }
2134 2443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( i<end
@@ -2184,34 +2493,168 @@
2184 2493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2185 2494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append(refs, (char *)&lr, sizeof lr);
2186 2495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1;
2187 2496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2188 2497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*********************
2499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * FOOTNOTE PARSING *
2500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *********************/
2501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* is_footnote -- check if data holds a definition of a labeled footnote.
2503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * If so then append the corresponding element to `footnotes` array */
2504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int is_footnote(
2505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *data, /* input text */
2506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t beg, /* offset of the beginning of the line */
2507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t end, /* offset of the end of the text */
2508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t *last, /* last character of the link */
2509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Blob * footnotes
2510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
2511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t i, id_offset, id_end, upc_offset, upc_size;
2512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct footnote fn = FOOTNOTE_INITIALIZER;
2513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* failfast if data is too short */
2515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( beg+5>=end ) return 0;
2516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i = beg;
2517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* footnote definition must start at the begining of a line */
2519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( data[i]!='[' ) return 0;
2520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i++;
2521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( data[i]!='^' ) return 0;
2522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ id_offset = ++i;
2523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* id part: anything but a newline between brackets */
2525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( i<end && data[i]!=']' && data[i]!='\n' && data[i]!='\r' ){ i++; }
2526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i>=end || data[i]!=']' ) return 0;
2527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ id_end = i++;
2528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* spacer: colon (space | tab)* */
2530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i>=end || data[i]!=':' ) return 0;
2531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i++;
2532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( i<end && (data[i]==' ' || data[i]=='\t') ){ i++; }
2533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* passthrough truncated footnote definition */
2535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i>=end ) return 0;
2536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( build_ref_id(&fn.id, data+id_offset, id_end-id_offset)<0 ) return 0;
2538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* footnote's text may start on the same line after [^id]: */
2540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upc_offset = upc_size = 0;
2541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( data[i]!='\n' && data[i]!='\r' ){
2542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t j;
2543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upc_size = is_footnote_classlist(data+i, end-i, 1);
2544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upc_offset = i; /* prevent further checks for a classlist */
2545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i += upc_size;
2546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ j = i;
2547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( i<end && data[i]!='\n' && data[i]!='\r' ){ i++; };
2548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i!=j )blob_append(&fn.text, data+j, i-j);
2549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i<end ){
2550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&fn.text, data[i]);
2551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i++;
2552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i<end && data[i]=='\n' && data[i-1]=='\r' ){
2553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&fn.text, data[i]);
2554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i++;
2555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
2558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i++;
2559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i<end && data[i]=='\n' && data[i-1]=='\r' ) i++;
2560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i<end ){
2562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* compute the indentation from the 2nd line */
2564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t indent = i;
2565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *spaces = data+i;
2566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( indent<end && data[indent]==' ' ){ indent++; }
2567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( indent>=end ) goto footnote_finish;
2568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ indent -= i;
2569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( indent<2 ) goto footnote_finish;
2189 2570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* process the 2nd and subsequent lines */
2572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( i+indent<end && memcmp(data+i,spaces,indent)==0 ){
2573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t j;
2574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i += indent;
2575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !upc_offset ){
2576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* a classlist must be provided no later than at the 2nd line */
2577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upc_offset = i + sizeof_blank_prefix(data+i, end-i, 1);
2578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upc_size = is_footnote_classlist(data+upc_offset,
2579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ end-upc_offset, 1);
2580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( upc_size ){
2581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i = upc_offset + upc_size;
2582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ j = i;
2585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( i<end && data[i]!='\n' && data[i]!='\r' ){ i++; }
2586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i!=j ) blob_append(&fn.text, data+j, i-j);
2587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i>=end ) break;
2588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&fn.text, data[i]);
2589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i++;
2590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i<end && data[i]=='\n' && data[i-1]=='\r' ){
2591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&fn.text, data[i]);
2592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i++;
2593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ footnote_finish:
2597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !blob_size(&fn.text) ){
2598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&fn.id);
2599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
2600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !blob_trim(&fn.text) ){ /* if the content is all-blank */
2602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( upc_size ){ /* interpret UPC as plain text */
2603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&fn.text, data+upc_offset, upc_size);
2604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upc_size = 0;
2605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
2606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&fn.id); /* or clean up and fail */
2607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&fn.text);
2608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
2609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* a valid note has been found */
2612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( last ) *last = i;
2613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( footnotes ){
2614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fn.defno = COUNT_FOOTNOTES( footnotes );
2615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( upc_size ){
2616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( upc_offset && upc_offset+upc_size<end );
2617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&fn.upc, data+upc_offset, upc_size);
2618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(footnotes, (char *)&fn, sizeof fn);
2620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1;
2622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2190 2623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2191 2624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**********************
2192 2625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
* EXPORTED FUNCTIONS *
2193 2626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**********************/
2194 2627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2195 2628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* markdown -- parses the input buffer and renders it into the output buffer */
2196 2629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void markdown(
2197 2630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Blob *ob, /* output blob for rendered text */
2198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct Blob *ib, /* input blob in markdown */
2631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const struct Blob *ib, /* input blob in markdown */
2199 2632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const struct mkd_renderer *rndrer /* renderer descriptor (callbacks) */
2200 2633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
2201 2634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct link_ref *lr;
2635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct footnote *fn;
2202 2636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t i, beg, end = 0;
2203 2637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct render rndr;
2204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *ib_data;
2205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Blob text = BLOB_INITIALIZER;
2638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob text = BLOB_INITIALIZER; /* input after the first pass */
2639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob * const allNotes = &rndr.notes.all;
2206 2640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2207 2641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* filling the render structure */
2208 2642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !rndrer ) return;
2209 2643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rndr.make = *rndrer;
2210 2644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rndr.nBlobCache = 0;
2211 2645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rndr.iDepth = 0;
2212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rndr.refs = empty_blob;
2646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr.refs = empty_blob;
2647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr.notes.all = empty_blob;
2648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr.notes.nMarks = 0;
2649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr.notes.misref.id = empty_blob;
2650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr.notes.misref.text = empty_blob;
2651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr.notes.misref.upc = empty_blob;
2652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr.notes.misref.bRndred = 0;
2653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr.notes.misref.nUsed = 0;
2654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr.notes.misref.iMark = -1;
2655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2213 2656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<256; i++) rndr.active_char[i] = 0;
2214 2657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (rndr.make.emphasis
2215 2658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| rndr.make.double_emphasis
2216 2659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| rndr.make.triple_emphasis)
2217 2660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& rndr.make.emph_chars
@@ -2221,32 +2664,34 @@
2221 2664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2222 2665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2223 2666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rndr.make.codespan ) rndr.active_char['`'] = char_codespan;
2224 2667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rndr.make.linebreak ) rndr.active_char['\n'] = char_linebreak;
2225 2668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rndr.make.image || rndr.make.link ) rndr.active_char['['] = char_link;
2669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rndr.make.footnote_ref ) rndr.active_char['('] = char_footnote;
2226 2670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rndr.active_char['<'] = char_langle_tag;
2227 2671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rndr.active_char['\\'] = char_escape;
2228 2672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rndr.active_char['&'] = char_entity;
2229 2673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* first pass: looking for references, copying everything else */
2674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* first pass: iterate over lines looking for references,
2675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * copying everything else into "text" */
2231 2676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
beg = 0;
2232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ib_data = blob_buffer(ib);
2233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( beg<blob_size(ib) ){ /* iterating over lines */
2234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( is_ref(ib_data, beg, blob_size(ib), &end, &rndr.refs) ){
2677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(const size_t size = blob_size(ib); beg<size ;){
2678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char* const data = blob_buffer(ib);
2679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( is_ref(data, beg, size, &end, &rndr.refs) ){
2680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ beg = end;
2681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if(is_footnote(data, beg, size, &end, &rndr.notes.all)){
2235 2682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
beg = end;
2236 2683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{ /* skipping to the next line */
2237 2684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
end = beg;
2238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( end<blob_size(ib) && ib_data[end]!='\n' && ib_data[end]!='\r' ){
2685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( end<size && data[end]!='\n' && data[end]!='\r' ){
2239 2686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
end += 1;
2240 2687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2241 2688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* adding the line body if present */
2242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( end>beg ) blob_append(&text, ib_data + beg, end - beg);
2243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( end<blob_size(ib) && (ib_data[end]=='\n' || ib_data[end]=='\r') ){
2689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( end>beg ) blob_append(&text, data + beg, end - beg);
2690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( end<size && (data[end]=='\n' || data[end]=='\r') ){
2244 2691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* add one \n per newline */
2245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( ib_data[end]=='\n'
2246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || (end+1<blob_size(ib) && ib_data[end+1]!='\n')
2247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
2692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( data[end]=='\n' || (end+1<size && data[end+1]!='\n') ){
2248 2693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append_char(&text, '\n');
2249 2694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2250 2695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
end += 1;
2251 2696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2252 2697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
beg = end;
@@ -2258,14 +2703,160 @@
2258 2703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
qsort(blob_buffer(&rndr.refs),
2259 2704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_size(&rndr.refs)/sizeof(struct link_ref),
2260 2705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sizeof(struct link_ref),
2261 2706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cmp_link_ref_sort);
2262 2707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr.notes.nLbled = COUNT_FOOTNOTES( allNotes );
2709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* sort footnotes by ID and join duplicates */
2711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rndr.notes.nLbled > 1 ){
2712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nDups = 0;
2713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fn = CAST_AS_FOOTNOTES( allNotes );
2714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ qsort(fn, rndr.notes.nLbled, sizeof(struct footnote), cmp_footnote_id);
2715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* concatenate footnotes with equal labels */
2717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<rndr.notes.nLbled ;){
2718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct footnote *x = fn + i;
2719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t j = i+1, k = blob_size(&x->text) + 64 + blob_size(&x->upc);
2720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while(j<rndr.notes.nLbled && !blob_compare(&x->id, &fn[j].id)){
2721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ k += blob_size(&fn[j].text) + 10 + blob_size(&fn[j].upc);
2722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ j++;
2723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nDups++;
2724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i+1<j ){
2726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob list = empty_blob;
2727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reserve(&list, k);
2728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* must match _joined_footnote_indicator in html_footnote_item() */
2729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_literal(&list, "<ul class='fn-joined'>\n");
2730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(k=i; k<j; k++){
2731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct footnote *y = fn + k;
2732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_literal(&list, "<li>");
2733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( blob_size(&y->upc) ){
2734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendb(&list, &y->upc);
2735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&y->upc);
2736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendb(&list, &y->text);
2738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_literal(&list, "</li>\n");
2739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* free memory buffer */
2741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&y->text);
2742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( k!=i ) blob_reset(&y->id);
2743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_literal(&list, "</ul>\n");
2745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x->text = list;
2746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.ftntsIssues[2]++;
2747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i = j;
2749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nDups ){ /* clean rndr.notes.all from invalidated footnotes */
2751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const int n = rndr.notes.nLbled - nDups;
2752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Blob filtered = empty_blob;
2753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reserve(&filtered, n*sizeof(struct footnote));
2754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<rndr.notes.nLbled; i++){
2755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( blob_size(&fn[i].id) ){
2756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&filtered, (char*)(fn+i), sizeof(struct footnote));
2757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset( allNotes );
2760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr.notes.all = filtered;
2761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr.notes.nLbled = n;
2762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( COUNT_FOOTNOTES(allNotes) == rndr.notes.nLbled );
2763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fn = CAST_AS_FOOTNOTES( allNotes );
2766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<rndr.notes.nLbled; i++){
2767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fn[i].index = i;
2768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( rndr.notes.nMarks==0 );
2263 2770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2264 2771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* second pass: actual rendering */
2265 2772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rndr.make.prolog ) rndr.make.prolog(ob, rndr.make.opaque);
2266 2773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
parse_block(ob, &rndr, blob_buffer(&text), blob_size(&text));
2774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( blob_size(allNotes) || rndr.notes.misref.nUsed ){
2776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Footnotes must be parsed for the correct discovery of (back)links */
2778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob *notes = new_work_buffer( &rndr );
2779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( blob_size(allNotes) ){
2780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob *tmp = new_work_buffer( &rndr );
2781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nMarks = -1, maxDepth = 5;
2782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* inline notes may get appended to rndr.notes.all while rendering */
2784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while(1){
2785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct footnote *aNotes;
2786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const int N = COUNT_FOOTNOTES( allNotes );
2787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* make a shallow copy of `allNotes` */
2789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_truncate(notes,0);
2790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendb(notes, allNotes);
2791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aNotes = CAST_AS_FOOTNOTES(notes);
2792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ qsort(aNotes, N, sizeof(struct footnote), cmp_footnote_sort);
2793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( --maxDepth < 0 || nMarks == rndr.notes.nMarks ) break;
2795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nMarks = rndr.notes.nMarks;
2796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<N; i++){
2798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const int j = aNotes[i].index;
2799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct footnote *x = CAST_AS_FOOTNOTES(allNotes) + j;
2800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( 0<=j && j<N );
2801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( x->bRndred || !x->nUsed ) continue;
2802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( x->iMark > 0 );
2803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( blob_size(&x->text) );
2804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_truncate(tmp,0);
2805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* `allNotes` may be altered and extended through this call */
2807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ parse_inline(tmp, &rndr, blob_buffer(&x->text), blob_size(&x->text));
2808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x = CAST_AS_FOOTNOTES(allNotes) + j;
2810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_truncate(&x->text,0);
2811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendb(&x->text, tmp);
2812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ x->bRndred = 1;
2813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ release_work_buffer(&rndr,tmp);
2816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* footnotes rendering */
2819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rndr.make.footnote_item && rndr.make.footnotes ){
2820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob *all_items = new_work_buffer(&rndr);
2821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int j = -1;
2822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Assert that the in-memory layout of id, text and upc within
2824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** footnote struct matches the expectations of html_footnote_item()
2825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If it doesn't then a compiler has done something very weird.
2826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
2827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( &(rndr.notes.misref.id) == &(rndr.notes.misref.text) - 1 );
2828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( &(rndr.notes.misref.upc) == &(rndr.notes.misref.text) + 1 );
2829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<COUNT_FOOTNOTES(notes); i++){
2831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const struct footnote* x = CAST_AS_FOOTNOTES(notes) + i;
2832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const int xUsed = x->bRndred ? x->nUsed : 0;
2833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !x->iMark ) break;
2834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( x->nUsed );
2835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr.make.footnote_item(all_items, &x->text, x->iMark,
2836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ xUsed, rndr.make.opaque);
2837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !xUsed ) g.ftntsIssues[3]++; /* an overnested footnote */
2838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ j = i;
2839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rndr.notes.misref.nUsed ){
2841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr.make.footnote_item(all_items, 0, -1,
2842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr.notes.misref.nUsed, rndr.make.opaque);
2843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.ftntsIssues[0] += rndr.notes.misref.nUsed;
2844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( ++j < COUNT_FOOTNOTES(notes) ){
2846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const struct footnote* x = CAST_AS_FOOTNOTES(notes) + j;
2847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( !x->iMark );
2848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( !x->nUsed );
2849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( !x->bRndred );
2850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr.make.footnote_item(all_items,&x->text,0,0,rndr.make.opaque);
2851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.ftntsIssues[1]++;
2852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rndr.make.footnotes(ob, all_items, rndr.make.opaque);
2854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ release_work_buffer(&rndr, all_items);
2855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ release_work_buffer(&rndr, notes);
2857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2267 2858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rndr.make.epilog ) rndr.make.epilog(ob, rndr.make.opaque);
2268 2859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2269 2860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* clean-up */
2270 2861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( rndr.iDepth==0 );
2271 2862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&text);
@@ -2275,9 +2866,17 @@
2275 2866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&lr[i].id);
2276 2867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&lr[i].link);
2277 2868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&lr[i].title);
2278 2869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2279 2870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&rndr.refs);
2871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fn = CAST_AS_FOOTNOTES( allNotes );
2872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ end = COUNT_FOOTNOTES( allNotes );
2873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<end; i++){
2874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(blob_size(&fn[i].id)) blob_reset(&fn[i].id);
2875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(blob_size(&fn[i].upc)) blob_reset(&fn[i].upc);
2876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&fn[i].text);
2877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&rndr.notes.all);
2280 2879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<rndr.nBlobCache; i++){
2281 2880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(rndr.aBlobCache[i]);
2282 2881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2283 2882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2284 2883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!