]> granicus.if.org Git - multimarkdown/commitdiff
FIXED: Improve efficiency when checking for existence of metadata
authorFletcher T. Penney <fletcher@fletcherpenney.net>
Fri, 5 Apr 2019 14:42:37 +0000 (10:42 -0400)
committerFletcher T. Penney <fletcher@fletcherpenney.net>
Fri, 5 Apr 2019 14:42:37 +0000 (10:42 -0400)
Sources/libMultiMarkdown/mmd.c

index 73014043324b165c08141ba0585c3a21e4797fb5..64f2c3ff20d682010e6a9bdefb59343fa800d065 100644 (file)
@@ -2329,11 +2329,21 @@ bool mmd_engine_has_metadata(mmd_engine * e, size_t * end) {
        // Preserve existing parse tree (if any)
        old_root = e->root;
 
-       // Tokenize the string (up until first empty line)
-       token * doc = mmd_tokenize_string(e, 0, e->dstr->currentStringLength, true);
+       token * doc;
+
+       if (old_root &&
+                       (old_root->type == DOC_START_TOKEN) &&
+                       (old_root->len == e->dstr->currentStringLength)
+          ) {
+               // Already parsed
+               doc = old_root;
+       } else {
+               // Tokenize the string (up until first empty line)
+               doc = mmd_tokenize_string(e, 0, e->dstr->currentStringLength, true);
 
-       // Parse tokens into blocks
-       mmd_parse_token_chain(e, doc);
+               // Parse tokens into blocks
+               mmd_parse_token_chain(e, doc);
+       }
 
        if (doc) {
                if (doc->child && doc->child->type == BLOCK_META) {
@@ -2344,7 +2354,11 @@ bool mmd_engine_has_metadata(mmd_engine * e, size_t * end) {
                        }
                }
 
-               token_tree_free(doc);
+               if (old_root != doc) {
+                       token_tree_free(doc);
+
+                       // TODO: Need to reset various stacks (e.g. header stack)...
+               }
        }
 
        // Restore previous parse tree