]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
markup/goldmark: Add CJK extension
authorOMOTO Tsukasa <tsukasa@oomo.to>
Wed, 30 Aug 2023 11:08:45 +0000 (20:08 +0900)
committerGitHub <noreply@github.com>
Wed, 30 Aug 2023 11:08:45 +0000 (13:08 +0200)
Fixes #10472

docs/data/docs.yaml
markup/goldmark/convert.go
markup/goldmark/convert_test.go
markup/goldmark/goldmark_config/config.go

index 545ec74fbb64e5364a7cedea79d4a40d16cde97e..900c668ca692d5a28b38fcc864875bb0eca4b5fb 100644 (file)
@@ -1037,6 +1037,9 @@ config:
           rightAngleQuote: '&raquo;'
           rightDoubleQuote: '&rdquo;'
           rightSingleQuote: '&rsquo;'
+        CJK:
+          eastAsianLineBreaks: false
+          escapedSpace: false
       parser:
         attribute:
           block: false
index 20bbfc2107b95781ef97863888abe603d1cafb87..fa2ab548b27491242c2a0792d94d0755fd53755b 100644 (file)
@@ -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())
        }
index a2f7b9597768f6569c38ec7ef75649ca55849d4b..ed791448b93ffbee3272d4386d4db6841b4f4ecb 100644 (file)
@@ -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")
+}
index a6fe0e62413ceb28f500a686fcec7838d6abd466..dfbcc5a90bcd1d539a2f0fee9b5e86fb11253c39 100644 (file)
@@ -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