Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
canifa_note
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Vũ Hoàng Anh
canifa_note
Commits
e43a445c
Commit
e43a445c
authored
Dec 16, 2023
by
Steven
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
chore: implement escaping character node
parent
12376430
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
132 additions
and
0 deletions
+132
-0
inline.go
plugin/gomark/ast/inline.go
+10
-0
node.go
plugin/gomark/ast/node.go
+1
-0
escaping_character.go
plugin/gomark/parser/escaping_character.go
+41
-0
escaping_character_test.go
plugin/gomark/parser/escaping_character_test.go
+30
-0
parser.go
plugin/gomark/parser/parser.go
+1
-0
parser_test.go
plugin/gomark/parser/parser_test.go
+28
-0
tokenizer.go
plugin/gomark/parser/tokenizer/tokenizer.go
+3
-0
html.go
plugin/gomark/render/html/html.go
+7
-0
html_test.go
plugin/gomark/render/html/html_test.go
+4
-0
string.go
plugin/gomark/render/string/string.go
+7
-0
No files found.
plugin/gomark/ast/inline.go
View file @
e43a445c
...
...
@@ -101,3 +101,13 @@ type Strikethrough struct {
func
(
*
Strikethrough
)
Type
()
NodeType
{
return
StrikethroughNode
}
type
EscapingCharacter
struct
{
BaseInline
Symbol
string
}
func
(
*
EscapingCharacter
)
Type
()
NodeType
{
return
EscapingCharacterNode
}
plugin/gomark/ast/node.go
View file @
e43a445c
...
...
@@ -23,6 +23,7 @@ const (
LinkNode
TagNode
StrikethroughNode
EscapingCharacterNode
)
type
Node
interface
{
...
...
plugin/gomark/parser/escaping_character.go
0 → 100644
View file @
e43a445c
package
parser
import
(
"errors"
"github.com/usememos/memos/plugin/gomark/ast"
"github.com/usememos/memos/plugin/gomark/parser/tokenizer"
)
type
EscapingCharacterParser
struct
{}
func
NewEscapingCharacterParser
()
*
EscapingCharacterParser
{
return
&
EscapingCharacterParser
{}
}
func
(
*
EscapingCharacterParser
)
Match
(
tokens
[]
*
tokenizer
.
Token
)
(
int
,
bool
)
{
if
len
(
tokens
)
==
0
{
return
0
,
false
}
if
tokens
[
0
]
.
Type
!=
tokenizer
.
Backslash
{
return
0
,
false
}
if
len
(
tokens
)
==
1
{
return
0
,
false
}
if
tokens
[
1
]
.
Type
==
tokenizer
.
Newline
||
tokens
[
1
]
.
Type
==
tokenizer
.
Space
||
tokens
[
1
]
.
Type
==
tokenizer
.
Text
||
tokens
[
1
]
.
Type
==
tokenizer
.
Number
{
return
0
,
false
}
return
2
,
true
}
func
(
p
*
EscapingCharacterParser
)
Parse
(
tokens
[]
*
tokenizer
.
Token
)
(
ast
.
Node
,
error
)
{
size
,
ok
:=
p
.
Match
(
tokens
)
if
size
==
0
||
!
ok
{
return
nil
,
errors
.
New
(
"not matched"
)
}
return
&
ast
.
EscapingCharacter
{
Symbol
:
tokens
[
1
]
.
Value
,
},
nil
}
plugin/gomark/parser/escaping_character_test.go
0 → 100644
View file @
e43a445c
package
parser
import
(
"testing"
"github.com/stretchr/testify/require"
"github.com/usememos/memos/plugin/gomark/ast"
"github.com/usememos/memos/plugin/gomark/parser/tokenizer"
)
func
TestEscapingCharacterParser
(
t
*
testing
.
T
)
{
tests
:=
[]
struct
{
text
string
node
ast
.
Node
}{
{
text
:
`\# 123`
,
node
:
&
ast
.
EscapingCharacter
{
Symbol
:
"#"
,
},
},
}
for
_
,
test
:=
range
tests
{
tokens
:=
tokenizer
.
Tokenize
(
test
.
text
)
node
,
_
:=
NewEscapingCharacterParser
()
.
Parse
(
tokens
)
require
.
Equal
(
t
,
StringifyNodes
([]
ast
.
Node
{
test
.
node
}),
StringifyNodes
([]
ast
.
Node
{
node
}))
}
}
plugin/gomark/parser/parser.go
View file @
e43a445c
...
...
@@ -71,6 +71,7 @@ func ParseBlockWithParsers(tokens []*tokenizer.Token, blockParsers []BlockParser
}
var
defaultInlineParsers
=
[]
InlineParser
{
NewEscapingCharacterParser
(),
NewBoldItalicParser
(),
NewImageParser
(),
NewLinkParser
(),
...
...
plugin/gomark/parser/parser_test.go
View file @
e43a445c
...
...
@@ -26,6 +26,34 @@ func TestParser(t *testing.T) {
},
},
},
{
text
:
"# Hello world!"
,
nodes
:
[]
ast
.
Node
{
&
ast
.
Heading
{
Level
:
1
,
Children
:
[]
ast
.
Node
{
&
ast
.
Text
{
Content
:
"Hello world!"
,
},
},
},
},
},
{
text
:
"
\\
# Hello world!"
,
nodes
:
[]
ast
.
Node
{
&
ast
.
Paragraph
{
Children
:
[]
ast
.
Node
{
&
ast
.
EscapingCharacter
{
Symbol
:
"#"
,
},
&
ast
.
Text
{
Content
:
" Hello world!"
,
},
},
},
},
},
{
text
:
"**Hello** world!"
,
nodes
:
[]
ast
.
Node
{
...
...
plugin/gomark/parser/tokenizer/tokenizer.go
View file @
e43a445c
...
...
@@ -17,6 +17,7 @@ const (
PlusSign
TokenType
=
"+"
Dot
TokenType
=
"."
GreaterThan
TokenType
=
">"
Backslash
TokenType
=
"
\\
"
Newline
TokenType
=
"
\n
"
Space
TokenType
=
" "
)
...
...
@@ -70,6 +71,8 @@ func Tokenize(text string) []*Token {
tokens
=
append
(
tokens
,
NewToken
(
PlusSign
,
"+"
))
case
'.'
:
tokens
=
append
(
tokens
,
NewToken
(
Dot
,
"."
))
case
'\\'
:
tokens
=
append
(
tokens
,
NewToken
(
Backslash
,
`\`
))
case
'\n'
:
tokens
=
append
(
tokens
,
NewToken
(
Newline
,
"
\n
"
))
case
' '
:
...
...
plugin/gomark/render/html/html.go
View file @
e43a445c
...
...
@@ -59,6 +59,8 @@ func (r *HTMLRender) RenderNode(node ast.Node) {
r
.
renderTag
(
n
)
case
*
ast
.
Strikethrough
:
r
.
renderStrikethrough
(
n
)
case
*
ast
.
EscapingCharacter
:
r
.
renderEscapingCharacter
(
n
)
case
*
ast
.
Text
:
r
.
renderText
(
n
)
default
:
...
...
@@ -199,3 +201,8 @@ func (r *HTMLRender) renderStrikethrough(node *ast.Strikethrough) {
r
.
output
.
WriteString
(
node
.
Content
)
r
.
output
.
WriteString
(
`</del>`
)
}
func
(
r
*
HTMLRender
)
renderEscapingCharacter
(
node
*
ast
.
EscapingCharacter
)
{
r
.
output
.
WriteString
(
"
\\
"
)
r
.
output
.
WriteString
(
node
.
Symbol
)
}
plugin/gomark/render/html/html_test.go
View file @
e43a445c
...
...
@@ -42,6 +42,10 @@ func TestHTMLRender(t *testing.T) {
text
:
"#article #memo"
,
expected
:
`<p><span>#article</span> <span>#memo</span></p>`
,
},
{
text
:
"#article
\\
#memo"
,
expected
:
`<p><span>#article</span> \#memo</p>`
,
},
{
text
:
"* Hello
\n
* world!"
,
expected
:
`<ul><li>Hello</li><li>world!</li></ul>`
,
...
...
plugin/gomark/render/string/string.go
View file @
e43a445c
...
...
@@ -59,6 +59,8 @@ func (r *StringRender) RenderNode(node ast.Node) {
r
.
renderTag
(
n
)
case
*
ast
.
Strikethrough
:
r
.
renderStrikethrough
(
n
)
case
*
ast
.
EscapingCharacter
:
r
.
renderEscapingCharacter
(
n
)
case
*
ast
.
Text
:
r
.
renderText
(
n
)
default
:
...
...
@@ -157,3 +159,8 @@ func (r *StringRender) renderTag(node *ast.Tag) {
func
(
r
*
StringRender
)
renderStrikethrough
(
node
*
ast
.
Strikethrough
)
{
r
.
output
.
WriteString
(
node
.
Content
)
}
func
(
r
*
StringRender
)
renderEscapingCharacter
(
node
*
ast
.
EscapingCharacter
)
{
r
.
output
.
WriteString
(
"
\\
"
)
r
.
output
.
WriteString
(
node
.
Symbol
)
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment