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
dbc85fe7
Unverified
Commit
dbc85fe7
authored
May 26, 2023
by
boojack
Committed by
GitHub
May 26, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: image and link parser (#1744)
* feat: image and link parser * chore: update
parent
523ef2bb
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
252 additions
and
18 deletions
+252
-18
heading_test.go
plugin/gomark/parser/heading_test.go
+5
-5
image.go
plugin/gomark/parser/image.go
+55
-0
image_test.go
plugin/gomark/parser/image_test.go
+42
-0
link.go
plugin/gomark/parser/link.go
+58
-0
link_test.go
plugin/gomark/parser/link_test.go
+60
-0
paragraph_test.go
plugin/gomark/parser/paragraph_test.go
+4
-4
tokenizer.go
plugin/gomark/parser/tokenizer/tokenizer.go
+23
-8
tokenizer_test.go
plugin/gomark/parser/tokenizer/tokenizer_test.go
+5
-1
No files found.
plugin/gomark/parser/heading_test.go
View file @
dbc85fe7
...
@@ -13,11 +13,11 @@ func TestHeadingParser(t *testing.T) {
...
@@ -13,11 +13,11 @@ func TestHeadingParser(t *testing.T) {
heading
*
HeadingParser
heading
*
HeadingParser
}{
}{
{
{
text
:
"*Hello world
!
"
,
text
:
"*Hello world"
,
heading
:
nil
,
heading
:
nil
,
},
},
{
{
text
:
"## Hello World
!
"
,
text
:
"## Hello World"
,
heading
:
&
HeadingParser
{
heading
:
&
HeadingParser
{
Level
:
2
,
Level
:
2
,
ContentTokens
:
[]
*
tokenizer
.
Token
{
ContentTokens
:
[]
*
tokenizer
.
Token
{
...
@@ -31,7 +31,7 @@ func TestHeadingParser(t *testing.T) {
...
@@ -31,7 +31,7 @@ func TestHeadingParser(t *testing.T) {
},
},
{
{
Type
:
tokenizer
.
Text
,
Type
:
tokenizer
.
Text
,
Value
:
"World
!
"
,
Value
:
"World"
,
},
},
},
},
},
},
...
@@ -65,12 +65,12 @@ func TestHeadingParser(t *testing.T) {
...
@@ -65,12 +65,12 @@ func TestHeadingParser(t *testing.T) {
},
},
},
},
{
{
text
:
" # 123123 Hello World
!
"
,
text
:
" # 123123 Hello World"
,
heading
:
nil
,
heading
:
nil
,
},
},
{
{
text
:
`# 123
text
:
`# 123
Hello World
!
`
,
Hello World`
,
heading
:
&
HeadingParser
{
heading
:
&
HeadingParser
{
Level
:
1
,
Level
:
1
,
ContentTokens
:
[]
*
tokenizer
.
Token
{
ContentTokens
:
[]
*
tokenizer
.
Token
{
...
...
plugin/gomark/parser/image.go
0 → 100644
View file @
dbc85fe7
package
parser
import
"github.com/usememos/memos/plugin/gomark/parser/tokenizer"
type
ImageParser
struct
{
AltText
string
URL
string
}
func
NewImageParser
()
*
ImageParser
{
return
&
ImageParser
{}
}
func
(
*
ImageParser
)
Match
(
tokens
[]
*
tokenizer
.
Token
)
*
ImageParser
{
if
len
(
tokens
)
<
5
{
return
nil
}
if
tokens
[
0
]
.
Type
!=
tokenizer
.
ExclamationMark
{
return
nil
}
if
tokens
[
1
]
.
Type
!=
tokenizer
.
LeftSquareBracket
{
return
nil
}
cursor
,
altText
:=
2
,
""
for
;
cursor
<
len
(
tokens
)
-
2
;
cursor
++
{
if
tokens
[
cursor
]
.
Type
==
tokenizer
.
Newline
{
return
nil
}
if
tokens
[
cursor
]
.
Type
==
tokenizer
.
RightSquareBracket
{
break
}
altText
+=
tokens
[
cursor
]
.
Value
}
if
tokens
[
cursor
+
1
]
.
Type
!=
tokenizer
.
LeftParenthesis
{
return
nil
}
matched
,
url
:=
false
,
""
for
_
,
token
:=
range
tokens
[
cursor
+
2
:
]
{
if
token
.
Type
==
tokenizer
.
Newline
||
token
.
Type
==
tokenizer
.
Space
{
return
nil
}
if
token
.
Type
==
tokenizer
.
RightParenthesis
{
matched
=
true
break
}
url
+=
token
.
Value
}
if
!
matched
||
url
==
""
{
return
nil
}
return
&
ImageParser
{
AltText
:
altText
,
URL
:
url
,
}
}
plugin/gomark/parser/image_test.go
0 → 100644
View file @
dbc85fe7
package
parser
import
(
"testing"
"github.com/stretchr/testify/require"
"github.com/usememos/memos/plugin/gomark/parser/tokenizer"
)
func
TestImageParser
(
t
*
testing
.
T
)
{
tests
:=
[]
struct
{
text
string
image
*
ImageParser
}{
{
text
:
""
,
image
:
&
ImageParser
{
AltText
:
""
,
URL
:
"https://example.com"
,
},
},
{
text
:
"! [](https://example.com)"
,
image
:
nil
,
},
{
text
:
""
,
image
:
nil
,
},
{
text
:
""
,
image
:
&
ImageParser
{
AltText
:
"al te"
,
URL
:
"https://example.com"
,
},
},
}
for
_
,
test
:=
range
tests
{
tokens
:=
tokenizer
.
Tokenize
(
test
.
text
)
require
.
Equal
(
t
,
test
.
image
,
NewImageParser
()
.
Match
(
tokens
))
}
}
plugin/gomark/parser/link.go
0 → 100644
View file @
dbc85fe7
package
parser
import
"github.com/usememos/memos/plugin/gomark/parser/tokenizer"
type
LinkParser
struct
{
ContentTokens
[]
*
tokenizer
.
Token
URL
string
}
func
NewLinkParser
()
*
LinkParser
{
return
&
LinkParser
{}
}
func
(
*
LinkParser
)
Match
(
tokens
[]
*
tokenizer
.
Token
)
*
LinkParser
{
if
len
(
tokens
)
<
4
{
return
nil
}
if
tokens
[
0
]
.
Type
!=
tokenizer
.
LeftSquareBracket
{
return
nil
}
cursor
,
contentTokens
:=
1
,
[]
*
tokenizer
.
Token
{}
for
;
cursor
<
len
(
tokens
)
-
2
;
cursor
++
{
if
tokens
[
cursor
]
.
Type
==
tokenizer
.
Newline
{
return
nil
}
if
tokens
[
cursor
]
.
Type
==
tokenizer
.
RightSquareBracket
{
break
}
contentTokens
=
append
(
contentTokens
,
tokens
[
cursor
])
}
if
tokens
[
cursor
+
1
]
.
Type
!=
tokenizer
.
LeftParenthesis
{
return
nil
}
matched
,
url
:=
false
,
""
for
_
,
token
:=
range
tokens
[
cursor
+
2
:
]
{
if
token
.
Type
==
tokenizer
.
Newline
||
token
.
Type
==
tokenizer
.
Space
{
return
nil
}
if
token
.
Type
==
tokenizer
.
RightParenthesis
{
matched
=
true
break
}
url
+=
token
.
Value
}
if
!
matched
||
url
==
""
{
return
nil
}
if
len
(
contentTokens
)
==
0
{
contentTokens
=
append
(
contentTokens
,
&
tokenizer
.
Token
{
Type
:
tokenizer
.
Text
,
Value
:
url
,
})
}
return
&
LinkParser
{
ContentTokens
:
contentTokens
,
URL
:
url
,
}
}
plugin/gomark/parser/link_test.go
0 → 100644
View file @
dbc85fe7
package
parser
import
(
"testing"
"github.com/stretchr/testify/require"
"github.com/usememos/memos/plugin/gomark/parser/tokenizer"
)
func
TestLinkParser
(
t
*
testing
.
T
)
{
tests
:=
[]
struct
{
text
string
link
*
LinkParser
}{
{
text
:
"[](https://example.com)"
,
link
:
&
LinkParser
{
ContentTokens
:
[]
*
tokenizer
.
Token
{
{
Type
:
tokenizer
.
Text
,
Value
:
"https://example.com"
,
},
},
URL
:
"https://example.com"
,
},
},
{
text
:
"! [](https://example.com)"
,
link
:
nil
,
},
{
text
:
"[alte]( htt ps :/ /example.com)"
,
link
:
nil
,
},
{
text
:
"[hello world](https://example.com)"
,
link
:
&
LinkParser
{
ContentTokens
:
[]
*
tokenizer
.
Token
{
{
Type
:
tokenizer
.
Text
,
Value
:
"hello"
,
},
{
Type
:
tokenizer
.
Space
,
Value
:
" "
,
},
{
Type
:
tokenizer
.
Text
,
Value
:
"world"
,
},
},
URL
:
"https://example.com"
,
},
},
}
for
_
,
test
:=
range
tests
{
tokens
:=
tokenizer
.
Tokenize
(
test
.
text
)
require
.
Equal
(
t
,
test
.
link
,
NewLinkParser
()
.
Match
(
tokens
))
}
}
plugin/gomark/parser/paragraph_test.go
View file @
dbc85fe7
...
@@ -17,7 +17,7 @@ func TestParagraphParser(t *testing.T) {
...
@@ -17,7 +17,7 @@ func TestParagraphParser(t *testing.T) {
paragraph
:
nil
,
paragraph
:
nil
,
},
},
{
{
text
:
"Hello world
!
"
,
text
:
"Hello world"
,
paragraph
:
&
ParagraphParser
{
paragraph
:
&
ParagraphParser
{
ContentTokens
:
[]
*
tokenizer
.
Token
{
ContentTokens
:
[]
*
tokenizer
.
Token
{
{
{
...
@@ -30,14 +30,14 @@ func TestParagraphParser(t *testing.T) {
...
@@ -30,14 +30,14 @@ func TestParagraphParser(t *testing.T) {
},
},
{
{
Type
:
tokenizer
.
Text
,
Type
:
tokenizer
.
Text
,
Value
:
"world
!
"
,
Value
:
"world"
,
},
},
},
},
},
},
},
},
{
{
text
:
`Hello
text
:
`Hello
world
!
`
,
world`
,
paragraph
:
&
ParagraphParser
{
paragraph
:
&
ParagraphParser
{
ContentTokens
:
[]
*
tokenizer
.
Token
{
ContentTokens
:
[]
*
tokenizer
.
Token
{
{
{
...
@@ -53,7 +53,7 @@ world!`,
...
@@ -53,7 +53,7 @@ world!`,
},
},
{
{
text
:
`Hello \n
text
:
`Hello \n
world
!
`
,
world`
,
paragraph
:
&
ParagraphParser
{
paragraph
:
&
ParagraphParser
{
ContentTokens
:
[]
*
tokenizer
.
Token
{
ContentTokens
:
[]
*
tokenizer
.
Token
{
{
{
...
...
plugin/gomark/parser/tokenizer/tokenizer.go
View file @
dbc85fe7
...
@@ -7,6 +7,11 @@ const (
...
@@ -7,6 +7,11 @@ const (
Star
TokenType
=
"*"
Star
TokenType
=
"*"
Hash
TokenType
=
"#"
Hash
TokenType
=
"#"
Backtick
TokenType
=
"`"
Backtick
TokenType
=
"`"
LeftSquareBracket
TokenType
=
"["
RightSquareBracket
TokenType
=
"]"
LeftParenthesis
TokenType
=
"("
RightParenthesis
TokenType
=
")"
ExclamationMark
TokenType
=
"!"
Newline
TokenType
=
"
\n
"
Newline
TokenType
=
"
\n
"
Space
TokenType
=
" "
Space
TokenType
=
" "
)
)
...
@@ -37,10 +42,20 @@ func Tokenize(text string) []*Token {
...
@@ -37,10 +42,20 @@ func Tokenize(text string) []*Token {
tokens
=
append
(
tokens
,
NewToken
(
Star
,
"*"
))
tokens
=
append
(
tokens
,
NewToken
(
Star
,
"*"
))
case
'#'
:
case
'#'
:
tokens
=
append
(
tokens
,
NewToken
(
Hash
,
"#"
))
tokens
=
append
(
tokens
,
NewToken
(
Hash
,
"#"
))
case
'\n'
:
tokens
=
append
(
tokens
,
NewToken
(
Newline
,
"
\n
"
))
case
'`'
:
case
'`'
:
tokens
=
append
(
tokens
,
NewToken
(
Backtick
,
"`"
))
tokens
=
append
(
tokens
,
NewToken
(
Backtick
,
"`"
))
case
'['
:
tokens
=
append
(
tokens
,
NewToken
(
LeftSquareBracket
,
"["
))
case
']'
:
tokens
=
append
(
tokens
,
NewToken
(
RightSquareBracket
,
"]"
))
case
'('
:
tokens
=
append
(
tokens
,
NewToken
(
LeftParenthesis
,
"("
))
case
')'
:
tokens
=
append
(
tokens
,
NewToken
(
RightParenthesis
,
")"
))
case
'!'
:
tokens
=
append
(
tokens
,
NewToken
(
ExclamationMark
,
"!"
))
case
'\n'
:
tokens
=
append
(
tokens
,
NewToken
(
Newline
,
"
\n
"
))
case
' '
:
case
' '
:
tokens
=
append
(
tokens
,
NewToken
(
Space
,
" "
))
tokens
=
append
(
tokens
,
NewToken
(
Space
,
" "
))
default
:
default
:
...
...
plugin/gomark/parser/tokenizer/tokenizer_test.go
View file @
dbc85fe7
...
@@ -28,7 +28,11 @@ func TestTokenize(t *testing.T) {
...
@@ -28,7 +28,11 @@ func TestTokenize(t *testing.T) {
},
},
{
{
Type
:
Text
,
Type
:
Text
,
Value
:
"world!"
,
Value
:
"world"
,
},
{
Type
:
ExclamationMark
,
Value
:
"!"
,
},
},
},
},
},
},
...
...
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