diff --git a/source/md.c b/source/md.c index 945257c..d2120ff 100644 --- a/source/md.c +++ b/source/md.c @@ -787,6 +787,7 @@ MD_S8Copy(MD_Arena *arena, MD_String8 string) res.size = string.size; res.str = MD_PushArray(arena, MD_u8, string.size + 1); MD_MemoryCopy(res.str, string.str, string.size); + res.str[string.size] = 0; return(res); } @@ -2399,9 +2400,60 @@ MD_ParseOneNode(MD_Arena *arena, MD_String8 string, MD_u64 offset) } //- rjf: parse tag list + MD_Node *first_tag = MD_NilNode(); + MD_Node *last_tag = MD_NilNode(); + { + for(;off < string.size;) + { + //- rjf: parse @ symbol, signifying start of tag + off += MD_LexAdvanceFromSkips(MD_S8Skip(string, off), MD_TokenGroup_Irregular); + MD_Token next_token = MD_TokenFromString(MD_S8Skip(string, off)); + if(next_token.kind != MD_TokenKind_Reserved || + next_token.string.str[0] != '@') + { + break; + } + off += next_token.raw_string.size; + + //- rjf: parse string of tag node + MD_Token name = MD_TokenFromString(MD_S8Skip(string, off)); + MD_u64 name_off = off; + if((name.kind & MD_TokenGroup_Label) == 0) + { + // NOTE(rjf): @error Improper token for tag string + MD_String8 error_str = MD_S8Fmt(arena, "\"%.*s\" is not a proper tag label", + MD_S8VArg(name.raw_string)); + MD_Message *error = MD_MakeTokenError(arena, string, name, MD_MessageKind_Error, error_str); + MD_MessageListPush(&result.errors, error); + break; + } + off += name.raw_string.size; + + //- rjf: build tag + MD_Node *tag = MD_MakeNode(arena, MD_NodeKind_Tag, name.string, name.raw_string, name_off); + + //- rjf: parse tag arguments + MD_Token open_paren = MD_TokenFromString(MD_S8Skip(string, off)); + MD_ParseResult args_parse = MD_ParseResultZero(); + if(open_paren.kind == MD_TokenKind_Reserved && + open_paren.string.str[0] == '(') + { + args_parse = MD_ParseNodeSet(arena, string, off, tag, MD_ParseSetRule_EndOnDelimiter); + MD_MessageListConcat(&result.errors, &args_parse.errors); + } + off += args_parse.string_advance; + + //- rjf: push tag to result + MD_NodeDblPushBack(first_tag, last_tag, tag); + } + } + + //- rjf: parse tag list +#if 0 MD_ParseResult tags_parse = _MD_ParseTagList(arena, string, off); off += tags_parse.string_advance; MD_MessageListConcat(&result.errors, &tags_parse.errors); +#endif //- rjf: parse node MD_Node *parsed_node = MD_NilNode(); @@ -2559,11 +2611,14 @@ MD_ParseOneNode(MD_Arena *arena, MD_String8 string, MD_u64 offset) result.node = parsed_node; if(!MD_NodeIsNil(result.node)) { - result.node->first_tag = tags_parse.node; - result.node->last_tag = tags_parse.last_node; + result.node->first_tag = first_tag; + result.node->last_tag = last_tag; + for(MD_Node *tag = first_tag; !MD_NodeIsNil(tag); tag = tag->next) + { + tag->parent = result.node; + } } - result.last_node = parsed_node; - result.string_advance= off - offset; + result.string_advance = off - offset; return result; }