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
b20e0097
Commit
b20e0097
authored
Dec 13, 2023
by
Steven
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
chore: implement part of nodes
parent
dd837825
Changes
16
Show whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
227 additions
and
142 deletions
+227
-142
block.go
plugin/gomark/ast/block.go
+13
-17
inline.go
plugin/gomark/ast/inline.go
+64
-13
bold_test.go
plugin/gomark/parser/bold_test.go
+1
-2
code.go
plugin/gomark/parser/code.go
+27
-14
code_block_test.go
plugin/gomark/parser/code_block_test.go
+1
-2
code_test.go
plugin/gomark/parser/code_test.go
+4
-4
heading.go
plugin/gomark/parser/heading.go
+32
-11
heading_test.go
plugin/gomark/parser/heading_test.go
+29
-45
image.go
plugin/gomark/parser/image.go
+40
-20
image_test.go
plugin/gomark/parser/image_test.go
+5
-4
italic_test.go
plugin/gomark/parser/italic_test.go
+1
-2
line_break.go
plugin/gomark/parser/line_break.go
+1
-1
paragraph.go
plugin/gomark/parser/paragraph.go
+3
-1
paragraph_test.go
plugin/gomark/parser/paragraph_test.go
+1
-2
parser_test.go
plugin/gomark/parser/parser_test.go
+1
-2
text.go
plugin/gomark/parser/text.go
+4
-2
No files found.
plugin/gomark/ast/block.go
View file @
b20e0097
...
@@ -9,10 +9,6 @@ type LineBreak struct {
...
@@ -9,10 +9,6 @@ type LineBreak struct {
var
NodeTypeLineBreak
=
NewNodeType
(
"LineBreak"
)
var
NodeTypeLineBreak
=
NewNodeType
(
"LineBreak"
)
func
NewLineBreak
()
*
LineBreak
{
return
&
LineBreak
{}
}
func
(
*
LineBreak
)
Type
()
NodeType
{
func
(
*
LineBreak
)
Type
()
NodeType
{
return
NodeTypeLineBreak
return
NodeTypeLineBreak
}
}
...
@@ -25,12 +21,6 @@ type Paragraph struct {
...
@@ -25,12 +21,6 @@ type Paragraph struct {
var
NodeTypeParagraph
=
NewNodeType
(
"Paragraph"
)
var
NodeTypeParagraph
=
NewNodeType
(
"Paragraph"
)
func
NewParagraph
(
children
[]
Node
)
*
Paragraph
{
return
&
Paragraph
{
Children
:
children
,
}
}
func
(
*
Paragraph
)
Type
()
NodeType
{
func
(
*
Paragraph
)
Type
()
NodeType
{
return
NodeTypeParagraph
return
NodeTypeParagraph
}
}
...
@@ -44,13 +34,19 @@ type CodeBlock struct {
...
@@ -44,13 +34,19 @@ type CodeBlock struct {
var
NodeTypeCodeBlock
=
NewNodeType
(
"CodeBlock"
)
var
NodeTypeCodeBlock
=
NewNodeType
(
"CodeBlock"
)
func
NewCodeBlock
(
language
,
content
string
)
*
CodeBlock
{
return
&
CodeBlock
{
Language
:
language
,
Content
:
content
,
}
}
func
(
*
CodeBlock
)
Type
()
NodeType
{
func
(
*
CodeBlock
)
Type
()
NodeType
{
return
NodeTypeCodeBlock
return
NodeTypeCodeBlock
}
}
type
Heading
struct
{
BaseBlock
Level
int
Children
[]
Node
}
var
NodeTypeHeading
=
NewNodeType
(
"Heading"
)
func
(
*
Heading
)
Type
()
NodeType
{
return
NodeTypeHeading
}
plugin/gomark/ast/inline.go
View file @
b20e0097
...
@@ -10,12 +10,6 @@ type Text struct {
...
@@ -10,12 +10,6 @@ type Text struct {
var
NodeTypeText
=
NewNodeType
(
"Text"
)
var
NodeTypeText
=
NewNodeType
(
"Text"
)
func
NewText
(
content
string
)
*
Text
{
return
&
Text
{
Content
:
content
,
}
}
func
(
*
Text
)
Type
()
NodeType
{
func
(
*
Text
)
Type
()
NodeType
{
return
NodeTypeText
return
NodeTypeText
}
}
...
@@ -30,13 +24,70 @@ type Bold struct {
...
@@ -30,13 +24,70 @@ type Bold struct {
var
NodeTypeBold
=
NewNodeType
(
"Bold"
)
var
NodeTypeBold
=
NewNodeType
(
"Bold"
)
func
NewBold
(
symbol
,
content
string
)
*
Bold
{
return
&
Bold
{
Symbol
:
symbol
,
Content
:
content
,
}
}
func
(
*
Bold
)
Type
()
NodeType
{
func
(
*
Bold
)
Type
()
NodeType
{
return
NodeTypeBold
return
NodeTypeBold
}
}
type
Code
struct
{
BaseInline
Content
string
}
var
NodeTypeCode
=
NewNodeType
(
"Code"
)
func
(
*
Code
)
Type
()
NodeType
{
return
NodeTypeCode
}
type
Image
struct
{
BaseInline
AltText
string
URL
string
}
var
NodeTypeImage
=
NewNodeType
(
"Image"
)
func
(
*
Image
)
Type
()
NodeType
{
return
NodeTypeImage
}
type
Link
struct
{
BaseInline
Text
string
URL
string
}
var
NodeTypeLink
=
NewNodeType
(
"Link"
)
func
(
*
Link
)
Type
()
NodeType
{
return
NodeTypeLink
}
type
Italic
struct
{
BaseInline
// Symbol is "*" or "_"
Symbol
string
Content
string
}
var
NodeTypeItalic
=
NewNodeType
(
"Italic"
)
func
(
*
Italic
)
Type
()
NodeType
{
return
NodeTypeItalic
}
type
Tag
struct
{
BaseInline
Content
string
}
var
NodeTypeTag
=
NewNodeType
(
"Tag"
)
func
(
*
Tag
)
Type
()
NodeType
{
return
NodeTypeTag
}
plugin/gomark/parser/bold_test.go
View file @
b20e0097
...
@@ -44,7 +44,6 @@ func TestBoldParser(t *testing.T) {
...
@@ -44,7 +44,6 @@ func TestBoldParser(t *testing.T) {
for
_
,
test
:=
range
tests
{
for
_
,
test
:=
range
tests
{
tokens
:=
tokenizer
.
Tokenize
(
test
.
text
)
tokens
:=
tokenizer
.
Tokenize
(
test
.
text
)
parser
:=
NewBoldParser
()
require
.
Equal
(
t
,
test
.
bold
,
NewBoldParser
()
.
Parse
(
tokens
))
require
.
Equal
(
t
,
test
.
bold
,
parser
.
Parse
(
tokens
))
}
}
}
}
plugin/gomark/parser/code.go
View file @
b20e0097
package
parser
package
parser
import
"github.com/usememos/memos/plugin/gomark/parser/tokenizer"
import
(
"github.com/usememos/memos/plugin/gomark/ast"
"github.com/usememos/memos/plugin/gomark/parser/tokenizer"
)
type
CodeParser
struct
{
type
CodeParser
struct
{}
Content
string
}
var
defaultCodeParser
=
&
CodeParser
{
}
func
NewCodeParser
()
*
CodeParser
{
func
NewCodeParser
()
*
CodeParser
{
return
&
CodeParser
{}
return
defaultCodeParser
}
}
func
(
*
CodeParser
)
Match
(
tokens
[]
*
tokenizer
.
Token
)
*
CodeParser
{
func
(
*
CodeParser
)
Match
(
tokens
[]
*
tokenizer
.
Token
)
(
int
,
bool
)
{
if
len
(
tokens
)
<
3
{
if
len
(
tokens
)
<
3
{
return
nil
return
0
,
false
}
}
if
tokens
[
0
]
.
Type
!=
tokenizer
.
Backtick
{
if
tokens
[
0
]
.
Type
!=
tokenizer
.
Backtick
{
return
nil
return
0
,
false
}
}
content
,
matched
:=
""
,
false
content
Tokens
,
matched
:=
[]
*
tokenizer
.
Token
{}
,
false
for
_
,
token
:=
range
tokens
[
1
:
]
{
for
_
,
token
:=
range
tokens
[
1
:
]
{
if
token
.
Type
==
tokenizer
.
Newline
{
if
token
.
Type
==
tokenizer
.
Newline
{
return
nil
return
0
,
false
}
}
if
token
.
Type
==
tokenizer
.
Backtick
{
if
token
.
Type
==
tokenizer
.
Backtick
{
matched
=
true
matched
=
true
break
break
}
}
content
+=
token
.
Value
content
Tokens
=
append
(
contentTokens
,
token
)
}
}
if
!
matched
||
len
(
content
)
==
0
{
if
!
matched
||
len
(
contentTokens
)
==
0
{
return
0
,
false
}
return
len
(
contentTokens
)
+
2
,
true
}
func
(
p
*
CodeParser
)
Parse
(
tokens
[]
*
tokenizer
.
Token
)
ast
.
Node
{
size
,
ok
:=
p
.
Match
(
tokens
)
if
size
==
0
||
!
ok
{
return
nil
return
nil
}
}
return
&
CodeParser
{
Content
:
content
,
contentTokens
:=
tokens
[
1
:
size
-
1
]
return
&
ast
.
Code
{
Content
:
tokenizer
.
Stringify
(
contentTokens
),
}
}
}
}
plugin/gomark/parser/code_block_test.go
View file @
b20e0097
...
@@ -58,7 +58,6 @@ func TestCodeBlockParser(t *testing.T) {
...
@@ -58,7 +58,6 @@ func TestCodeBlockParser(t *testing.T) {
for
_
,
test
:=
range
tests
{
for
_
,
test
:=
range
tests
{
tokens
:=
tokenizer
.
Tokenize
(
test
.
text
)
tokens
:=
tokenizer
.
Tokenize
(
test
.
text
)
parser
:=
NewCodeBlockParser
()
require
.
Equal
(
t
,
test
.
codeBlock
,
NewCodeBlockParser
()
.
Parse
(
tokens
))
require
.
Equal
(
t
,
test
.
codeBlock
,
parser
.
Parse
(
tokens
))
}
}
}
}
plugin/gomark/parser/code_test.go
View file @
b20e0097
...
@@ -5,13 +5,14 @@ import (
...
@@ -5,13 +5,14 @@ import (
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/require"
"github.com/usememos/memos/plugin/gomark/ast"
"github.com/usememos/memos/plugin/gomark/parser/tokenizer"
"github.com/usememos/memos/plugin/gomark/parser/tokenizer"
)
)
func
TestCodeParser
(
t
*
testing
.
T
)
{
func
TestCodeParser
(
t
*
testing
.
T
)
{
tests
:=
[]
struct
{
tests
:=
[]
struct
{
text
string
text
string
code
*
CodeParser
code
ast
.
Node
}{
}{
{
{
text
:
"`Hello world!"
,
text
:
"`Hello world!"
,
...
@@ -19,7 +20,7 @@ func TestCodeParser(t *testing.T) {
...
@@ -19,7 +20,7 @@ func TestCodeParser(t *testing.T) {
},
},
{
{
text
:
"`Hello world!`"
,
text
:
"`Hello world!`"
,
code
:
&
CodeParser
{
code
:
&
ast
.
Code
{
Content
:
"Hello world!"
,
Content
:
"Hello world!"
,
},
},
},
},
...
@@ -31,7 +32,6 @@ func TestCodeParser(t *testing.T) {
...
@@ -31,7 +32,6 @@ func TestCodeParser(t *testing.T) {
for
_
,
test
:=
range
tests
{
for
_
,
test
:=
range
tests
{
tokens
:=
tokenizer
.
Tokenize
(
test
.
text
)
tokens
:=
tokenizer
.
Tokenize
(
test
.
text
)
code
:=
NewCodeParser
()
require
.
Equal
(
t
,
test
.
code
,
NewCodeParser
()
.
Parse
(
tokens
))
require
.
Equal
(
t
,
test
.
code
,
code
.
Match
(
tokens
))
}
}
}
}
plugin/gomark/parser/heading.go
View file @
b20e0097
package
parser
package
parser
import
(
import
(
"github.com/usememos/memos/plugin/gomark/ast"
"github.com/usememos/memos/plugin/gomark/parser/tokenizer"
"github.com/usememos/memos/plugin/gomark/parser/tokenizer"
)
)
type
HeadingParser
struct
{
type
HeadingParser
struct
{}
Level
int
ContentTokens
[]
*
tokenizer
.
Token
}
func
NewHeadingParser
()
*
HeadingParser
{
func
NewHeadingParser
()
*
HeadingParser
{
return
&
HeadingParser
{}
return
&
HeadingParser
{}
}
}
func
(
*
HeadingParser
)
Match
(
tokens
[]
*
tokenizer
.
Token
)
*
HeadingParser
{
func
(
*
HeadingParser
)
Match
(
tokens
[]
*
tokenizer
.
Token
)
(
int
,
bool
)
{
cursor
:=
0
cursor
:=
0
for
_
,
token
:=
range
tokens
{
for
_
,
token
:=
range
tokens
{
if
token
.
Type
==
tokenizer
.
Hash
{
if
token
.
Type
==
tokenizer
.
Hash
{
...
@@ -23,14 +21,14 @@ func (*HeadingParser) Match(tokens []*tokenizer.Token) *HeadingParser {
...
@@ -23,14 +21,14 @@ func (*HeadingParser) Match(tokens []*tokenizer.Token) *HeadingParser {
}
}
}
}
if
len
(
tokens
)
<=
cursor
+
1
{
if
len
(
tokens
)
<=
cursor
+
1
{
return
nil
return
0
,
false
}
}
if
tokens
[
cursor
]
.
Type
!=
tokenizer
.
Space
{
if
tokens
[
cursor
]
.
Type
!=
tokenizer
.
Space
{
return
nil
return
0
,
false
}
}
level
:=
cursor
level
:=
cursor
if
level
==
0
||
level
>
6
{
if
level
==
0
||
level
>
6
{
return
nil
return
0
,
false
}
}
cursor
++
cursor
++
...
@@ -43,11 +41,34 @@ func (*HeadingParser) Match(tokens []*tokenizer.Token) *HeadingParser {
...
@@ -43,11 +41,34 @@ func (*HeadingParser) Match(tokens []*tokenizer.Token) *HeadingParser {
cursor
++
cursor
++
}
}
if
len
(
contentTokens
)
==
0
{
if
len
(
contentTokens
)
==
0
{
return
0
,
false
}
return
cursor
,
true
}
func
(
p
*
HeadingParser
)
Parse
(
tokens
[]
*
tokenizer
.
Token
)
ast
.
Node
{
size
,
ok
:=
p
.
Match
(
tokens
)
if
size
==
0
||
!
ok
{
return
nil
return
nil
}
}
return
&
HeadingParser
{
level
:=
0
for
_
,
token
:=
range
tokens
{
if
token
.
Type
==
tokenizer
.
Hash
{
level
++
}
else
{
break
}
}
contentTokens
:=
tokens
[
level
+
1
:
size
]
children
:=
ParseInline
(
contentTokens
,
[]
InlineParser
{
NewBoldParser
(),
NewCodeParser
(),
NewTextParser
(),
})
return
&
ast
.
Heading
{
Level
:
level
,
Level
:
level
,
C
ontentTokens
:
contentTokens
,
C
hildren
:
children
,
}
}
}
}
plugin/gomark/parser/heading_test.go
View file @
b20e0097
...
@@ -5,13 +5,14 @@ import (
...
@@ -5,13 +5,14 @@ import (
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/require"
"github.com/usememos/memos/plugin/gomark/ast"
"github.com/usememos/memos/plugin/gomark/parser/tokenizer"
"github.com/usememos/memos/plugin/gomark/parser/tokenizer"
)
)
func
TestHeadingParser
(
t
*
testing
.
T
)
{
func
TestHeadingParser
(
t
*
testing
.
T
)
{
tests
:=
[]
struct
{
tests
:=
[]
struct
{
text
string
text
string
heading
*
HeadingParser
heading
ast
.
Node
}{
}{
{
{
text
:
"*Hello world"
,
text
:
"*Hello world"
,
...
@@ -19,48 +20,22 @@ func TestHeadingParser(t *testing.T) {
...
@@ -19,48 +20,22 @@ func TestHeadingParser(t *testing.T) {
},
},
{
{
text
:
"## Hello World"
,
text
:
"## Hello World"
,
heading
:
&
HeadingParser
{
heading
:
&
ast
.
Heading
{
Level
:
2
,
Level
:
2
,
ContentTokens
:
[]
*
tokenizer
.
Token
{
Children
:
[]
ast
.
Node
{
{
&
ast
.
Text
{
Type
:
tokenizer
.
Text
,
Content
:
"Hello World"
,
Value
:
"Hello"
,
},
{
Type
:
tokenizer
.
Space
,
Value
:
" "
,
},
{
Type
:
tokenizer
.
Text
,
Value
:
"World"
,
},
},
},
},
},
},
},
},
{
{
text
:
"# # Hello World"
,
text
:
"# # Hello World"
,
heading
:
&
HeadingParser
{
heading
:
&
ast
.
Heading
{
Level
:
1
,
Level
:
1
,
ContentTokens
:
[]
*
tokenizer
.
Token
{
Children
:
[]
ast
.
Node
{
{
&
ast
.
Text
{
Type
:
tokenizer
.
Hash
,
Content
:
"# Hello World"
,
Value
:
"#"
,
},
{
Type
:
tokenizer
.
Space
,
Value
:
" "
,
},
{
Type
:
tokenizer
.
Text
,
Value
:
"Hello"
,
},
{
Type
:
tokenizer
.
Space
,
Value
:
" "
,
},
{
Type
:
tokenizer
.
Text
,
Value
:
"World"
,
},
},
},
},
},
},
...
@@ -72,16 +47,26 @@ func TestHeadingParser(t *testing.T) {
...
@@ -72,16 +47,26 @@ func TestHeadingParser(t *testing.T) {
{
{
text
:
`# 123
text
:
`# 123
Hello World`
,
Hello World`
,
heading
:
&
HeadingParser
{
heading
:
&
ast
.
Heading
{
Level
:
1
,
Level
:
1
,
ContentTokens
:
[]
*
tokenizer
.
Token
{
Children
:
[]
ast
.
Node
{
{
&
ast
.
Text
{
Type
:
tokenizer
.
Text
,
Content
:
"123 "
,
Value
:
"123"
,
},
},
},
},
},
{
{
Type
:
tokenizer
.
Space
,
text
:
"### **Hello** World"
,
Value
:
" "
,
heading
:
&
ast
.
Heading
{
Level
:
3
,
Children
:
[]
ast
.
Node
{
&
ast
.
Bold
{
Symbol
:
"*"
,
Content
:
"Hello"
,
},
&
ast
.
Text
{
Content
:
" World"
,
},
},
},
},
},
},
...
@@ -90,7 +75,6 @@ Hello World`,
...
@@ -90,7 +75,6 @@ Hello World`,
for
_
,
test
:=
range
tests
{
for
_
,
test
:=
range
tests
{
tokens
:=
tokenizer
.
Tokenize
(
test
.
text
)
tokens
:=
tokenizer
.
Tokenize
(
test
.
text
)
heading
:=
NewHeadingParser
()
require
.
Equal
(
t
,
test
.
heading
,
NewHeadingParser
()
.
Parse
(
tokens
))
require
.
Equal
(
t
,
test
.
heading
,
heading
.
Match
(
tokens
))
}
}
}
}
plugin/gomark/parser/image.go
View file @
b20e0097
package
parser
package
parser
import
"github.com/usememos/memos/plugin/gomark/parser/tokenizer"
import
(
"github.com/usememos/memos/plugin/gomark/ast"
"github.com/usememos/memos/plugin/gomark/parser/tokenizer"
)
type
ImageParser
struct
{
type
ImageParser
struct
{}
AltText
string
URL
string
var
defaultImageParser
=
&
ImageParser
{}
}
func
NewImageParser
()
*
ImageParser
{
func
NewImageParser
()
*
ImageParser
{
return
&
ImageParser
{}
return
defaultImageParser
}
}
func
(
*
ImageParser
)
Match
(
tokens
[]
*
tokenizer
.
Token
)
*
ImageParser
{
func
(
*
ImageParser
)
Match
(
tokens
[]
*
tokenizer
.
Token
)
(
int
,
bool
)
{
if
len
(
tokens
)
<
5
{
if
len
(
tokens
)
<
5
{
return
nil
return
0
,
false
}
}
if
tokens
[
0
]
.
Type
!=
tokenizer
.
ExclamationMark
{
if
tokens
[
0
]
.
Type
!=
tokenizer
.
ExclamationMark
{
return
nil
return
0
,
false
}
}
if
tokens
[
1
]
.
Type
!=
tokenizer
.
LeftSquareBracket
{
if
tokens
[
1
]
.
Type
!=
tokenizer
.
LeftSquareBracket
{
return
nil
return
0
,
false
}
}
cursor
,
altText
:=
2
,
""
cursor
,
altText
:=
2
,
""
for
;
cursor
<
len
(
tokens
)
-
2
;
cursor
++
{
for
;
cursor
<
len
(
tokens
)
-
2
;
cursor
++
{
if
tokens
[
cursor
]
.
Type
==
tokenizer
.
Newline
{
if
tokens
[
cursor
]
.
Type
==
tokenizer
.
Newline
{
return
nil
return
0
,
false
}
}
if
tokens
[
cursor
]
.
Type
==
tokenizer
.
RightSquareBracket
{
if
tokens
[
cursor
]
.
Type
==
tokenizer
.
RightSquareBracket
{
break
break
...
@@ -32,24 +34,42 @@ func (*ImageParser) Match(tokens []*tokenizer.Token) *ImageParser {
...
@@ -32,24 +34,42 @@ func (*ImageParser) Match(tokens []*tokenizer.Token) *ImageParser {
altText
+=
tokens
[
cursor
]
.
Value
altText
+=
tokens
[
cursor
]
.
Value
}
}
if
tokens
[
cursor
+
1
]
.
Type
!=
tokenizer
.
LeftParenthesis
{
if
tokens
[
cursor
+
1
]
.
Type
!=
tokenizer
.
LeftParenthesis
{
return
nil
return
0
,
false
}
}
matched
,
url
:=
false
,
""
cursor
+=
2
for
_
,
token
:=
range
tokens
[
cursor
+
2
:
]
{
contentTokens
,
matched
:=
[]
*
tokenizer
.
Token
{},
false
for
_
,
token
:=
range
tokens
[
cursor
:
]
{
if
token
.
Type
==
tokenizer
.
Newline
||
token
.
Type
==
tokenizer
.
Space
{
if
token
.
Type
==
tokenizer
.
Newline
||
token
.
Type
==
tokenizer
.
Space
{
return
nil
return
0
,
false
}
}
if
token
.
Type
==
tokenizer
.
RightParenthesis
{
if
token
.
Type
==
tokenizer
.
RightParenthesis
{
matched
=
true
matched
=
true
break
break
}
}
url
+=
token
.
Value
contentTokens
=
append
(
contentTokens
,
token
)
}
}
if
!
matched
||
url
==
""
{
if
!
matched
||
len
(
contentTokens
)
==
0
{
return
0
,
false
}
return
cursor
+
len
(
contentTokens
)
+
1
,
true
}
func
(
p
*
ImageParser
)
Parse
(
tokens
[]
*
tokenizer
.
Token
)
ast
.
Node
{
size
,
ok
:=
p
.
Match
(
tokens
)
if
size
==
0
||
!
ok
{
return
nil
return
nil
}
}
return
&
ImageParser
{
AltText
:
altText
,
altTextTokens
:=
[]
*
tokenizer
.
Token
{}
URL
:
url
,
for
_
,
token
:=
range
tokens
[
2
:
]
{
if
token
.
Type
==
tokenizer
.
RightSquareBracket
{
break
}
altTextTokens
=
append
(
altTextTokens
,
token
)
}
contentTokens
:=
tokens
[
2
+
len
(
altTextTokens
)
+
2
:
size
-
1
]
return
&
ast
.
Image
{
AltText
:
tokenizer
.
Stringify
(
altTextTokens
),
URL
:
tokenizer
.
Stringify
(
contentTokens
),
}
}
}
}
plugin/gomark/parser/image_test.go
View file @
b20e0097
...
@@ -5,17 +5,18 @@ import (
...
@@ -5,17 +5,18 @@ import (
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/require"
"github.com/usememos/memos/plugin/gomark/ast"
"github.com/usememos/memos/plugin/gomark/parser/tokenizer"
"github.com/usememos/memos/plugin/gomark/parser/tokenizer"
)
)
func
TestImageParser
(
t
*
testing
.
T
)
{
func
TestImageParser
(
t
*
testing
.
T
)
{
tests
:=
[]
struct
{
tests
:=
[]
struct
{
text
string
text
string
image
*
ImageParser
image
ast
.
Node
}{
}{
{
{
text
:
""
,
text
:
""
,
image
:
&
ImageParser
{
image
:
&
ast
.
Image
{
AltText
:
""
,
AltText
:
""
,
URL
:
"https://example.com"
,
URL
:
"https://example.com"
,
},
},
...
@@ -30,7 +31,7 @@ func TestImageParser(t *testing.T) {
...
@@ -30,7 +31,7 @@ func TestImageParser(t *testing.T) {
},
},
{
{
text
:
""
,
text
:
""
,
image
:
&
ImageParser
{
image
:
&
ast
.
Image
{
AltText
:
"al te"
,
AltText
:
"al te"
,
URL
:
"https://example.com"
,
URL
:
"https://example.com"
,
},
},
...
@@ -38,6 +39,6 @@ func TestImageParser(t *testing.T) {
...
@@ -38,6 +39,6 @@ func TestImageParser(t *testing.T) {
}
}
for
_
,
test
:=
range
tests
{
for
_
,
test
:=
range
tests
{
tokens
:=
tokenizer
.
Tokenize
(
test
.
text
)
tokens
:=
tokenizer
.
Tokenize
(
test
.
text
)
require
.
Equal
(
t
,
test
.
image
,
NewImageParser
()
.
Match
(
tokens
))
require
.
Equal
(
t
,
test
.
image
,
NewImageParser
()
.
Parse
(
tokens
))
}
}
}
}
plugin/gomark/parser/italic_test.go
View file @
b20e0097
...
@@ -89,7 +89,6 @@ func TestItalicParser(t *testing.T) {
...
@@ -89,7 +89,6 @@ func TestItalicParser(t *testing.T) {
for
_
,
test
:=
range
tests
{
for
_
,
test
:=
range
tests
{
tokens
:=
tokenizer
.
Tokenize
(
test
.
text
)
tokens
:=
tokenizer
.
Tokenize
(
test
.
text
)
italic
:=
NewItalicParser
()
require
.
Equal
(
t
,
test
.
italic
,
NewItalicParser
()
.
Match
(
tokens
))
require
.
Equal
(
t
,
test
.
italic
,
italic
.
Match
(
tokens
))
}
}
}
}
plugin/gomark/parser/line_break.go
View file @
b20e0097
...
@@ -29,5 +29,5 @@ func (p *LineBreakParser) Parse(tokens []*tokenizer.Token) ast.Node {
...
@@ -29,5 +29,5 @@ func (p *LineBreakParser) Parse(tokens []*tokenizer.Token) ast.Node {
return
nil
return
nil
}
}
return
ast
.
NewLineBreak
()
return
&
ast
.
LineBreak
{}
}
}
plugin/gomark/parser/paragraph.go
View file @
b20e0097
...
@@ -42,5 +42,7 @@ func (p *ParagraphParser) Parse(tokens []*tokenizer.Token) ast.Node {
...
@@ -42,5 +42,7 @@ func (p *ParagraphParser) Parse(tokens []*tokenizer.Token) ast.Node {
NewBoldParser
(),
NewBoldParser
(),
NewTextParser
(),
NewTextParser
(),
})
})
return
ast
.
NewParagraph
(
children
)
return
&
ast
.
Paragraph
{
Children
:
children
,
}
}
}
plugin/gomark/parser/paragraph_test.go
View file @
b20e0097
...
@@ -32,7 +32,6 @@ func TestParagraphParser(t *testing.T) {
...
@@ -32,7 +32,6 @@ func TestParagraphParser(t *testing.T) {
for
_
,
test
:=
range
tests
{
for
_
,
test
:=
range
tests
{
tokens
:=
tokenizer
.
Tokenize
(
test
.
text
)
tokens
:=
tokenizer
.
Tokenize
(
test
.
text
)
parser
:=
NewParagraphParser
()
require
.
Equal
(
t
,
test
.
paragraph
,
NewParagraphParser
()
.
Parse
(
tokens
))
require
.
Equal
(
t
,
test
.
paragraph
,
parser
.
Parse
(
tokens
))
}
}
}
}
plugin/gomark/parser/parser_test.go
View file @
b20e0097
...
@@ -89,7 +89,6 @@ func TestParser(t *testing.T) {
...
@@ -89,7 +89,6 @@ func TestParser(t *testing.T) {
for
_
,
test
:=
range
tests
{
for
_
,
test
:=
range
tests
{
tokens
:=
tokenizer
.
Tokenize
(
test
.
text
)
tokens
:=
tokenizer
.
Tokenize
(
test
.
text
)
nodes
:=
Parse
(
tokens
)
require
.
Equal
(
t
,
test
.
nodes
,
Parse
(
tokens
))
require
.
Equal
(
t
,
test
.
nodes
,
nodes
)
}
}
}
}
plugin/gomark/parser/text.go
View file @
b20e0097
...
@@ -24,7 +24,9 @@ func (*TextParser) Match(tokens []*tokenizer.Token) (int, bool) {
...
@@ -24,7 +24,9 @@ func (*TextParser) Match(tokens []*tokenizer.Token) (int, bool) {
func
(
*
TextParser
)
Parse
(
tokens
[]
*
tokenizer
.
Token
)
ast
.
Node
{
func
(
*
TextParser
)
Parse
(
tokens
[]
*
tokenizer
.
Token
)
ast
.
Node
{
if
len
(
tokens
)
==
0
{
if
len
(
tokens
)
==
0
{
return
ast
.
NewText
(
""
)
return
&
ast
.
Text
{}
}
return
&
ast
.
Text
{
Content
:
tokens
[
0
]
.
String
(),
}
}
return
ast
.
NewText
(
tokens
[
0
]
.
String
())
}
}
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