fix: allow markdown inline code in metadata values

This commit is contained in:
Nathaniel Landau
2023-05-17 09:07:47 -04:00
parent 00990db77a
commit 30009ada8f
3 changed files with 36 additions and 14 deletions

View File

@@ -87,7 +87,7 @@ class Note:
yield "encoding", self.encoding
yield "note_path", self.note_path
def _grab_all_metadata(self, text: str) -> list[InlineField]:
def _grab_all_metadata(self, text: str) -> list[InlineField]: # noqa: C901
"""Grab all metadata from the note and create list of InlineField objects."""
all_metadata = [] # List of all metadata to be returned
@@ -124,17 +124,9 @@ class Note:
)
)
# Then strip all frontmatter, code blocks, and inline code from the text and parse tags and inline metadata
text = P.strip_frontmatter(P.strip_code_blocks(P.strip_inline_code(text)))
# Parse text line by line
# strip frontmatter and code blocks from the text and parse inline metadata
text = P.strip_frontmatter(P.strip_code_blocks(text))
for _line in text.splitlines():
tags = [
InlineField(meta_type=MetadataType.TAGS, key=None, value=tag.lstrip("#"))
for tag in P.return_tags(_line)
]
all_metadata.extend(tags)
inline_metadata = P.return_inline_metadata(_line)
if inline_metadata:
# for item in inline_metadata:
@@ -148,6 +140,15 @@ class Note:
)
)
# Then strip all inline code and parse tags
text = P.strip_inline_code(text)
for _line in text.splitlines():
tags = [
InlineField(meta_type=MetadataType.TAGS, key=None, value=tag.lstrip("#"))
for tag in P.return_tags(_line)
]
all_metadata.extend(tags)
return list(set(all_metadata))
def _delete_inline_metadata(self, source: InlineField) -> bool:

View File

@@ -153,17 +153,23 @@ foo [key3::value3] bar
key4::value4
foo (key4::value) bar
key5::value5
key6:: `value6`
`key7::value7`
`key8`::`value8`
"""
)
note = Note(note_path=note_path)
assert sorted(note.metadata, key=lambda x: (x.key, x.value)) == [
InlineField(meta_type=MetadataType.INLINE, key="`key7", value="value7`"),
InlineField(meta_type=MetadataType.INLINE, key="`key8`", value="`value8`"),
InlineField(meta_type=MetadataType.INLINE, key="key1", value="value1"),
InlineField(meta_type=MetadataType.INLINE, key="key2", value="2022-12-22"),
InlineField(meta_type=MetadataType.INLINE, key="key3", value="value3"),
InlineField(meta_type=MetadataType.INLINE, key="key4", value="value"),
InlineField(meta_type=MetadataType.INLINE, key="key4", value="value4"),
InlineField(meta_type=MetadataType.INLINE, key="key5", value="value5"),
InlineField(meta_type=MetadataType.INLINE, key="key6", value=" `value6`"),
]

View File

@@ -172,6 +172,10 @@ def test_return_inline_metadata_2(string, returned):
("_foo_::bar baz", [("_foo_", "bar baz", Wrapping.NONE)]),
("**foo**::bar_baz", [("**foo**", "bar_baz", Wrapping.NONE)]),
("`foo`::`bar baz`", [("`foo`", "`bar baz`", Wrapping.NONE)]),
("`foo`:: `bar baz`", [("`foo`", " `bar baz`", Wrapping.NONE)]),
("`foo::bar baz`", [("`foo", "bar baz`", Wrapping.NONE)]),
("`foo:: bar baz`", [("`foo", " bar baz`", Wrapping.NONE)]),
("**URL**::`https://example.com`", [("**URL**", "`https://example.com`", Wrapping.NONE)]),
],
)
def test_return_inline_metadata_3(string, returned):
@@ -347,15 +351,26 @@ key: value
assert P.strip_frontmatter(content, data_only=True) == content
def test_strip_inline_code_1():
@pytest.mark.parametrize(
("content", "expected"),
[
("Foo `bar` baz `Qux` ```bar\n```", "Foo baz ```bar\n```"),
("foo", "foo"),
("foo `bar` baz `qux`", "foo baz "),
("key:: `value`", "key:: "),
("foo\nbar\n`baz`", "foo\nbar\n"),
("foo\nbar::baz\n`qux`", "foo\nbar::baz\n"),
("`foo::bar`", ""),
],
)
def test_strip_inline_code_1(content, expected):
"""Test the strip_inline_code method.
GIVEN a string with inline code
WHEN the strip_inline_code method is called
THEN the inline code is removed
"""
assert P.strip_inline_code("Foo `bar` baz `Qux` ```bar\n```") == "Foo baz ```bar\n```"
assert P.strip_inline_code("Foo `bar` baz `Qux` ```bar\n```") == "Foo baz ```bar\n```"
assert P.strip_inline_code(content) == expected
def test_validators():