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
7236552b
Commit
7236552b
authored
Jan 19, 2024
by
Steven
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: implement subscript and superscript parsers
parent
1f5899d2
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
235 additions
and
0 deletions
+235
-0
ast.go
plugin/gomark/ast/ast.go
+2
-0
inline.go
plugin/gomark/ast/inline.go
+28
-0
parser.go
plugin/gomark/parser/parser.go
+2
-0
subscript.go
plugin/gomark/parser/subscript.go
+53
-0
subscript_test.go
plugin/gomark/parser/subscript_test.go
+47
-0
superscript.go
plugin/gomark/parser/superscript.go
+53
-0
superscript_test.go
plugin/gomark/parser/superscript_test.go
+47
-0
tokenizer.go
plugin/gomark/parser/tokenizer/tokenizer.go
+3
-0
No files found.
plugin/gomark/ast/ast.go
View file @
7236552b
...
...
@@ -30,6 +30,8 @@ const (
EscapingCharacterNode
MathNode
HighlightNode
SubscriptNode
SuperscriptNode
)
type
Node
interface
{
...
...
plugin/gomark/ast/inline.go
View file @
7236552b
...
...
@@ -205,3 +205,31 @@ func (*Highlight) Type() NodeType {
func
(
n
*
Highlight
)
Restore
()
string
{
return
fmt
.
Sprintf
(
"==%s=="
,
n
.
Content
)
}
type
Subscript
struct
{
BaseInline
Content
string
}
func
(
*
Subscript
)
Type
()
NodeType
{
return
SubscriptNode
}
func
(
n
*
Subscript
)
Restore
()
string
{
return
fmt
.
Sprintf
(
"~%s~"
,
n
.
Content
)
}
type
Superscript
struct
{
BaseInline
Content
string
}
func
(
*
Superscript
)
Type
()
NodeType
{
return
SuperscriptNode
}
func
(
n
*
Superscript
)
Restore
()
string
{
return
fmt
.
Sprintf
(
"^%s^"
,
n
.
Content
)
}
plugin/gomark/parser/parser.go
View file @
7236552b
...
...
@@ -83,6 +83,8 @@ var defaultInlineParsers = []InlineParser{
NewItalicParser
(),
NewHighlightParser
(),
NewCodeParser
(),
NewSubscriptParser
(),
NewSuperscriptParser
(),
NewMathParser
(),
NewTagParser
(),
NewStrikethroughParser
(),
...
...
plugin/gomark/parser/subscript.go
0 → 100644
View file @
7236552b
package
parser
import
(
"errors"
"github.com/usememos/memos/plugin/gomark/ast"
"github.com/usememos/memos/plugin/gomark/parser/tokenizer"
)
type
SubscriptParser
struct
{}
func
NewSubscriptParser
()
*
SubscriptParser
{
return
&
SubscriptParser
{}
}
func
(
*
SubscriptParser
)
Match
(
tokens
[]
*
tokenizer
.
Token
)
(
int
,
bool
)
{
if
len
(
tokens
)
<
3
{
return
0
,
false
}
if
tokens
[
0
]
.
Type
!=
tokenizer
.
Tilde
{
return
0
,
false
}
contentTokens
:=
[]
*
tokenizer
.
Token
{}
matched
:=
false
for
_
,
token
:=
range
tokens
[
1
:
]
{
if
token
.
Type
==
tokenizer
.
Newline
{
return
0
,
false
}
if
token
.
Type
==
tokenizer
.
Tilde
{
matched
=
true
break
}
contentTokens
=
append
(
contentTokens
,
token
)
}
if
!
matched
||
len
(
contentTokens
)
==
0
{
return
0
,
false
}
return
len
(
contentTokens
)
+
2
,
true
}
func
(
p
*
SubscriptParser
)
Parse
(
tokens
[]
*
tokenizer
.
Token
)
(
ast
.
Node
,
error
)
{
size
,
ok
:=
p
.
Match
(
tokens
)
if
size
==
0
||
!
ok
{
return
nil
,
errors
.
New
(
"not matched"
)
}
contentTokens
:=
tokens
[
1
:
size
-
1
]
return
&
ast
.
Subscript
{
Content
:
tokenizer
.
Stringify
(
contentTokens
),
},
nil
}
plugin/gomark/parser/subscript_test.go
0 → 100644
View file @
7236552b
package
parser
import
(
"testing"
"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/restore"
)
func
TestSubscriptParser
(
t
*
testing
.
T
)
{
tests
:=
[]
struct
{
text
string
subscript
ast
.
Node
}{
{
text
:
"~Hello world!"
,
subscript
:
nil
,
},
{
text
:
"~Hello~"
,
subscript
:
&
ast
.
Subscript
{
Content
:
"Hello"
,
},
},
{
text
:
"~ Hello ~"
,
subscript
:
&
ast
.
Subscript
{
Content
:
" Hello "
,
},
},
{
text
:
"~1~ Hello ~ ~"
,
subscript
:
&
ast
.
Subscript
{
Content
:
"1"
,
},
},
}
for
_
,
test
:=
range
tests
{
tokens
:=
tokenizer
.
Tokenize
(
test
.
text
)
node
,
_
:=
NewSubscriptParser
()
.
Parse
(
tokens
)
require
.
Equal
(
t
,
restore
.
Restore
([]
ast
.
Node
{
test
.
subscript
}),
restore
.
Restore
([]
ast
.
Node
{
node
}))
}
}
plugin/gomark/parser/superscript.go
0 → 100644
View file @
7236552b
package
parser
import
(
"errors"
"github.com/usememos/memos/plugin/gomark/ast"
"github.com/usememos/memos/plugin/gomark/parser/tokenizer"
)
type
SuperscriptParser
struct
{}
func
NewSuperscriptParser
()
*
SuperscriptParser
{
return
&
SuperscriptParser
{}
}
func
(
*
SuperscriptParser
)
Match
(
tokens
[]
*
tokenizer
.
Token
)
(
int
,
bool
)
{
if
len
(
tokens
)
<
3
{
return
0
,
false
}
if
tokens
[
0
]
.
Type
!=
tokenizer
.
Caret
{
return
0
,
false
}
contentTokens
:=
[]
*
tokenizer
.
Token
{}
matched
:=
false
for
_
,
token
:=
range
tokens
[
1
:
]
{
if
token
.
Type
==
tokenizer
.
Newline
{
return
0
,
false
}
if
token
.
Type
==
tokenizer
.
Caret
{
matched
=
true
break
}
contentTokens
=
append
(
contentTokens
,
token
)
}
if
!
matched
||
len
(
contentTokens
)
==
0
{
return
0
,
false
}
return
len
(
contentTokens
)
+
2
,
true
}
func
(
p
*
SuperscriptParser
)
Parse
(
tokens
[]
*
tokenizer
.
Token
)
(
ast
.
Node
,
error
)
{
size
,
ok
:=
p
.
Match
(
tokens
)
if
size
==
0
||
!
ok
{
return
nil
,
errors
.
New
(
"not matched"
)
}
contentTokens
:=
tokens
[
1
:
size
-
1
]
return
&
ast
.
Superscript
{
Content
:
tokenizer
.
Stringify
(
contentTokens
),
},
nil
}
plugin/gomark/parser/superscript_test.go
0 → 100644
View file @
7236552b
package
parser
import
(
"testing"
"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/restore"
)
func
TestSuperscriptParser
(
t
*
testing
.
T
)
{
tests
:=
[]
struct
{
text
string
superscript
ast
.
Node
}{
{
text
:
"^Hello world!"
,
superscript
:
nil
,
},
{
text
:
"^Hello^"
,
superscript
:
&
ast
.
Superscript
{
Content
:
"Hello"
,
},
},
{
text
:
"^ Hello ^"
,
superscript
:
&
ast
.
Superscript
{
Content
:
" Hello "
,
},
},
{
text
:
"^1^ Hello ^ ^"
,
superscript
:
&
ast
.
Superscript
{
Content
:
"1"
,
},
},
}
for
_
,
test
:=
range
tests
{
tokens
:=
tokenizer
.
Tokenize
(
test
.
text
)
node
,
_
:=
NewSuperscriptParser
()
.
Parse
(
tokens
)
require
.
Equal
(
t
,
restore
.
Restore
([]
ast
.
Node
{
test
.
superscript
}),
restore
.
Restore
([]
ast
.
Node
{
node
}))
}
}
plugin/gomark/parser/tokenizer/tokenizer.go
View file @
7236552b
...
...
@@ -22,6 +22,7 @@ const (
EqualSign
TokenType
=
"="
Pipe
TokenType
=
"|"
Colon
TokenType
=
":"
Caret
TokenType
=
"^"
Backslash
TokenType
=
"
\\
"
Newline
TokenType
=
"
\n
"
Space
TokenType
=
" "
...
...
@@ -86,6 +87,8 @@ func Tokenize(text string) []*Token {
tokens
=
append
(
tokens
,
NewToken
(
Pipe
,
"|"
))
case
':'
:
tokens
=
append
(
tokens
,
NewToken
(
Colon
,
":"
))
case
'^'
:
tokens
=
append
(
tokens
,
NewToken
(
Caret
,
"^"
))
case
'\\'
:
tokens
=
append
(
tokens
,
NewToken
(
Backslash
,
`\`
))
case
'\n'
:
...
...
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