Strip markup.

This commit is contained in:
Nuno Cruces 2022-06-14 13:03:32 +01:00
parent b94ee718ba
commit b5c699b40d
8 changed files with 82 additions and 5 deletions

View file

@ -1,4 +1,5 @@
#!/bin/bash #!/usr/bin/env bash
set -Eeuo pipefail
TAG=$(git tag --points-at HEAD) TAG=$(git tag --points-at HEAD)
echo 'package main; const tag = "'$TAG'"' > tag.go echo 'package main; const tag = "'$TAG'"' > tag.go

View file

@ -21,6 +21,7 @@ import (
"github.com/ncruces/go-strftime" "github.com/ncruces/go-strftime"
"github.com/ncruces/zenity" "github.com/ncruces/zenity"
"github.com/ncruces/zenity/internal/zencmd"
"github.com/ncruces/zenity/internal/zenutil" "github.com/ncruces/zenity/internal/zenutil"
) )
@ -58,6 +59,7 @@ var (
// Message options // Message options
noWrap bool noWrap bool
noMarkup bool
ellipsize bool ellipsize bool
// Entry options // Entry options
@ -219,8 +221,8 @@ func setupFlags() {
// Message options // Message options
flag.StringVar(&icon, "icon-name", "", "Set the dialog `icon` (dialog-error, dialog-information, dialog-question, dialog-warning)") flag.StringVar(&icon, "icon-name", "", "Set the dialog `icon` (dialog-error, dialog-information, dialog-question, dialog-warning)")
flag.BoolVar(&noWrap, "no-wrap", false, "Do not enable text wrapping") flag.BoolVar(&noWrap, "no-wrap", false, "Do not enable text wrapping")
flag.BoolVar(&noMarkup, "no-markup", false, "Do not enable Pango markup")
flag.BoolVar(&ellipsize, "ellipsize", false, "Enable ellipsizing in the dialog text") flag.BoolVar(&ellipsize, "ellipsize", false, "Enable ellipsizing in the dialog text")
flag.Bool("no-markup", true, "Do not enable Pango markup")
// Entry options // Entry options
flag.StringVar(&entryText, "entry-text", "", "Set the entry `text`") flag.StringVar(&entryText, "entry-text", "", "Set the entry `text`")
@ -463,6 +465,12 @@ func loadFlags() []zenity.Option {
if ellipsize { if ellipsize {
opts = append(opts, zenity.Ellipsize()) opts = append(opts, zenity.Ellipsize())
} }
if noMarkup == false {
switch {
case errorDlg, infoDlg, warningDlg, questionDlg:
text = zencmd.StripMarkup(text)
}
}
// Entry options // Entry options

View file

@ -9,6 +9,7 @@ import (
"strings" "strings"
"github.com/ncruces/zenity" "github.com/ncruces/zenity"
"github.com/ncruces/zenity/internal/zencmd"
"github.com/ncruces/zenity/internal/zenutil" "github.com/ncruces/zenity/internal/zenutil"
) )
@ -27,7 +28,7 @@ func notify(opts ...zenity.Option) error {
var cmd, msg string var cmd, msg string
if n := strings.IndexByte(line, ':'); n >= 0 { if n := strings.IndexByte(line, ':'); n >= 0 {
cmd = strings.TrimSpace(line[:n]) cmd = strings.TrimSpace(line[:n])
msg = strings.TrimSpace(zenutil.Unescape(line[n+1:])) msg = strings.TrimSpace(zencmd.Unescape(line[n+1:]))
} else { } else {
fmt.Fprint(os.Stderr, "Could not parse command from stdin") fmt.Fprint(os.Stderr, "Could not parse command from stdin")
} }

29
internal/zencmd/markup.go Normal file
View file

@ -0,0 +1,29 @@
package zencmd
import (
"encoding/xml"
"io"
"strings"
)
// StripMarkup is internal.
func StripMarkup(s string) string {
// Strips XML markup described in:
// https://docs.gtk.org/Pango/pango_markup.html
dec := xml.NewDecoder(strings.NewReader(s))
var buf strings.Builder
for {
t, err := dec.Token()
if err == io.EOF {
return buf.String()
}
if err != nil {
return s
}
if t, ok := t.(xml.CharData); ok {
buf.Write(t)
}
}
}

View file

@ -0,0 +1,36 @@
package zencmd
import (
"testing"
)
var markupTests = []struct {
data string
want string
}{
// success cases
{"", ``},
{"abc", `abc`},
{"&lt;", `<`},
{"&amp;", `&`},
{"&quot;", `"`},
{"<i></i>", ``},
{"<i>abc</i>", `abc`},
{"<i>&quot;</i>", `"`},
{"<!--abc-->", ``},
// failure cases
{"<", `<`},
{"<i", `<i`},
{"<i>", `<i>`},
{"<i></b>", `<i></b>`},
{"<i>&amp</i>", `<i>&amp</i>`},
}
func TestStripMarkup(t *testing.T) {
for _, test := range markupTests {
if got := StripMarkup(test.data); got != test.want {
t.Errorf("StripMarkup(%q) = %q; want %q", test.data, got, test.want)
}
}
}

2
internal/zencmd/pkg.go Normal file
View file

@ -0,0 +1,2 @@
// Package zencmd is internal. DO NOT USE.
package zencmd

View file

@ -1,4 +1,4 @@
package zenutil package zencmd
import "strings" import "strings"

View file

@ -1,4 +1,4 @@
package zenutil package zencmd
import ( import (
"testing" "testing"