summaryrefslogtreecommitdiffstats
path: root/markup
diff options
context:
space:
mode:
authorOMOTO Tsukasa <tsukasa@oomo.to>2023-08-30 20:08:45 +0900
committerGitHub <noreply@github.com>2023-08-30 13:08:45 +0200
commitd7dcc76d27dc55b10b9a5c4294c4a883d0bdfb2e (patch)
treea285aaffd7d96357410da2d715263ceea3f44b2d /markup
parent9bf76fd7e8829355650ad94255776e2fbb269674 (diff)
markup/goldmark: Add CJK extension
Fixes #10472
Diffstat (limited to 'markup')
-rw-r--r--markup/goldmark/convert.go13
-rw-r--r--markup/goldmark/convert_test.go73
-rw-r--r--markup/goldmark/goldmark_config/config.go17
3 files changed, 103 insertions, 0 deletions
diff --git a/markup/goldmark/convert.go b/markup/goldmark/convert.go
index 20bbfc210..fa2ab548b 100644
--- a/markup/goldmark/convert.go
+++ b/markup/goldmark/convert.go
@@ -136,6 +136,19 @@ func newMarkdown(pcfg converter.ProviderConfig) goldmark.Markdown {
extensions = append(extensions, extension.Footnote)
}
+ if cfg.Extensions.CJK.Enable {
+ opts := []extension.CJKOption{}
+ if cfg.Extensions.CJK.EastAsianLineBreaks {
+ opts = append(opts, extension.WithEastAsianLineBreaks())
+ }
+
+ if cfg.Extensions.CJK.EscapedSpace {
+ opts = append(opts, extension.WithEscapedSpace())
+ }
+ c := extension.NewCJK(opts...)
+ extensions = append(extensions, c)
+ }
+
if cfg.Parser.AutoHeadingID {
parserOptions = append(parserOptions, parser.WithAutoHeadingID())
}
diff --git a/markup/goldmark/convert_test.go b/markup/goldmark/convert_test.go
index a2f7b9597..ed791448b 100644
--- a/markup/goldmark/convert_test.go
+++ b/markup/goldmark/convert_test.go
@@ -626,3 +626,76 @@ unsafe = false
return testconfig.GetTestConfig(nil, cfg)
}
+
+func TestConvertCJK(t *testing.T) {
+ c := qt.New(t)
+
+ content := `
+私は太郎です。
+プログラミングが好きです。\ 運動が苦手です。
+`
+
+ confStr := `
+[markup]
+[markup.goldmark]
+`
+
+ cfg := config.FromTOMLConfigString(confStr)
+ conf := testconfig.GetTestConfig(nil, cfg)
+
+ b := convert(c, conf, content)
+ got := string(b.Bytes())
+
+ c.Assert(got, qt.Contains, "<p>私は太郎です。\nプログラミングが好きです。\\ 運動が苦手です。</p>\n")
+}
+
+func TestConvertCJKWithExtensionWithEastAsianLineBreaksOption(t *testing.T) {
+ c := qt.New(t)
+
+ content := `
+私は太郎です。
+プログラミングが好きで、
+運動が苦手です。
+`
+
+ confStr := `
+[markup]
+[markup.goldmark]
+[markup.goldmark.extensions.CJK]
+enable=true
+eastAsianLineBreaks=true
+`
+
+ cfg := config.FromTOMLConfigString(confStr)
+ conf := testconfig.GetTestConfig(nil, cfg)
+
+ b := convert(c, conf, content)
+ got := string(b.Bytes())
+
+ c.Assert(got, qt.Contains, "<p>私は太郎です。プログラミングが好きで、運動が苦手です。</p>\n")
+}
+
+func TestConvertCJKWithExtensionWithEscapedSpaceOption(t *testing.T) {
+ c := qt.New(t)
+
+ content := `
+私は太郎です。
+プログラミングが好きです。\ 運動が苦手です。
+`
+
+ confStr := `
+[markup]
+[markup.goldmark]
+[markup.goldmark.extensions.CJK]
+enable=true
+escapedSpace=true
+`
+
+ cfg := config.FromTOMLConfigString(confStr)
+ conf := testconfig.GetTestConfig(nil, cfg)
+
+ b := convert(c, conf, content)
+ got := string(b.Bytes())
+
+ c.Assert(got, qt.Contains, "<p>私は太郎です。\nプログラミングが好きです。運動が苦手です。</p>\n")
+}
diff --git a/markup/goldmark/goldmark_config/config.go b/markup/goldmark/goldmark_config/config.go
index a6fe0e624..dfbcc5a90 100644
--- a/markup/goldmark/goldmark_config/config.go
+++ b/markup/goldmark/goldmark_config/config.go
@@ -43,6 +43,11 @@ var Default = Config{
Linkify: true,
LinkifyProtocol: "https",
TaskList: true,
+ CJK: CJK{
+ Enable: false,
+ EastAsianLineBreaks: false,
+ EscapedSpace: false,
+ },
},
Renderer: Renderer{
Unsafe: false,
@@ -76,6 +81,7 @@ type Extensions struct {
Linkify bool
LinkifyProtocol string
TaskList bool
+ CJK CJK
}
// Typographer holds typographer configuration.
@@ -105,6 +111,17 @@ type Typographer struct {
Apostrophe string
}
+type CJK struct {
+ // Whether to enable CJK support.
+ Enable bool
+
+ // Whether softline breaks between east asian wide characters should be ignored.
+ EastAsianLineBreaks bool
+
+ // Whether a '\' escaped half-space(0x20) should not be rendered.
+ EscapedSpace bool
+}
+
type Renderer struct {
// Whether softline breaks should be rendered as '<br>'
HardWraps bool