htmljson

package module
v1.1.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 21, 2024 License: MIT Imports: 7 Imported by: 1

README ΒΆ

🫐 htmljson: rich rendering of JSON as HTML in Go

codecov Go Report Card Go Reference Mentioned in Awesome Go OpenSSF Scorecard

  • pure Go
  • no Javascript
  • no dependencies
  • no reflect
  • no fmt
  • 300 LOC
  • customizable rendering
  • JSON Path for elements access

// JSON has to be any
var v any
json.Unmarshal(exampleJSON, &v)

htmlPage := htmljson.DefaultPageMarshalerm.Marshal(v)
// JSON has to be any
var v any
json.Unmarshal(exampleJSON, &v)

// customize how to render HTML elements
s := htmljson.Marshaler{
    Null:   htmljson.NullHTML,
    Bool:   htmljson.BoolHTML,
    String: htmljson.StringHTML,
    Number: func(k string, v float64, s string) string {
        if k == "$.cakes.strawberry-cake.size" {
            return `<div class="json-value json-number" style="color:red;">` + s + `</div>`
        }
        if v > 10 {
            return `<div class="json-value json-number" style="color:blue;">` + s + `</div>`
        }
        return `<div class="json-value json-number">` + s + `</div>`
    },
    Array: htmljson.DefaultArrayHTML,
    Map:   htmljson.DefaultMapHTML,
    Row:   htmljson.DefaultRowHTML{Padding: 4}.Marshal,
}

m := htmljson.DefaultPageMarshaler
m.Marshaler = &s

// write HTML page
htmlPage := m.Marshal(v)

Documentation ΒΆ

Index ΒΆ

Constants ΒΆ

This section is empty.

Variables ΒΆ

View Source
var DefaultArrayHTML = ArrayMarshaler{
	OpenBracket:  `<div class="json-lang">[</div>`,
	CloseBracket: `<div class="json-lang">]</div>`,
	Comma:        `<div class="json-lang">,</div>`,
}
View Source
var DefaultMapHTML = MapMarshaler{
	OpenBracket:  `<div class="json-lang">{</div>`,
	CloseBracket: `<div class="json-lang">}</div>`,
	Comma:        `<div class="json-lang">,</div>`,
	Colon:        `<div class="json-lang">:</div>`,
	Key:          func(key string, v string) string { return `<div class="json-key json-string">"` + v + `"</div>` },
}
View Source
var DefaultMarshaler = Marshaler{
	Null:   NullHTML,
	Bool:   BoolHTML,
	String: StringHTML,
	Number: NumberHTML,
	Array:  DefaultArrayHTML,
	Map:    DefaultMapHTML,
	Row:    DefaultRowHTML{Padding: 4}.Marshal,
}

DefaultMarshaler adds basic HTML div classes for further styling.

View Source
var DefaultPageMarshaler = PageMarshaler{
	Title:            "htmljson",
	Template:         defaultPageTemplate,
	TemplateTitleKey: `{{.Title}}`,
	TemplateJSONKey:  `{{.HTMLJSON}}`,
	Marshaler:        &DefaultMarshaler,
}

Functions ΒΆ

func BoolHTML ΒΆ

func BoolHTML(k string, v bool) string

func NullHTML ΒΆ

func NullHTML(k string) string

func NumberHTML ΒΆ

func NumberHTML(k string, v float64, s string) string

func StringHTML ΒΆ

func StringHTML(k string, v string) string

Types ΒΆ

type ArrayMarshaler ΒΆ

type ArrayMarshaler struct {
	OpenBracket  string
	CloseBracket string
	Comma        string
}

type DefaultRowHTML ΒΆ

type DefaultRowHTML struct {
	Padding int
}

func (DefaultRowHTML) Marshal ΒΆ

func (s DefaultRowHTML) Marshal(v string, depth int) string

type JSONPathCollector ΒΆ

type JSONPathCollector struct {
	Keys map[string]any
}

JSONPathCollector provides HTML renderers as its methods and collects which JSON path keys have been passed to it and which values. This is useful for testing.

func NewJSONPathCollector ΒΆ

func NewJSONPathCollector() *JSONPathCollector

func (*JSONPathCollector) Bool ΒΆ

func (c *JSONPathCollector) Bool(k string, v bool) string

func (*JSONPathCollector) MapKey ΒΆ

func (c *JSONPathCollector) MapKey(k string, v string) string

func (*JSONPathCollector) Null ΒΆ

func (c *JSONPathCollector) Null(k string) string

func (*JSONPathCollector) Number ΒΆ

func (c *JSONPathCollector) Number(k string, v float64, s string) string

func (*JSONPathCollector) String ΒΆ

func (c *JSONPathCollector) String(k string, v string) string

type MapMarshaler ΒΆ

type MapMarshaler struct {
	OpenBracket  string
	CloseBracket string
	Comma        string
	Colon        string
	Key          func(key string, v string) string
}

type Marshaler ΒΆ

type Marshaler struct {
	Null   func(key string) string
	Bool   func(key string, v bool) string
	String func(key string, v string) string
	Number func(key string, v float64, s string) string
	Array  ArrayMarshaler
	Map    MapMarshaler
	Row    func(s string, padding int) string
	// contains filtered or unexported fields
}

Marshaler converts JSON stored as Go `any` object represented into HTML. Visually HTML is similar to pretty printed JSON with indentation. Rendering is customized by providing renderers for specific JSON elements. This facilitates CSS styling, CSS animations, and JavaScript events. JSON element renderers receive JSON path and value of element. Should be used only for types: bool, float64, string, []any, map[string]any, nil. You can get allowed input easily with json.Unmarshal to any. Safe for repeated use. Not safe for concurrent use.

func (*Marshaler) Marshal ΒΆ

func (s *Marshaler) Marshal(v any) []byte

Marshaler converts JSON stored as Go `any` object represented into HTML.

func (*Marshaler) MarshalTo ΒΆ

func (s *Marshaler) MarshalTo(w io.Writer, v any) error

MarshalTo converts JSON stored as Go `any` object represented into HTML.

type PageMarshaler ΒΆ added in v1.1.0

type PageMarshaler struct {
	Title            string
	Template         []byte
	TemplateTitleKey string
	TemplateJSONKey  string

	Marshaler interface {
		MarshalTo(w io.Writer, v any) error
	}
	// contains filtered or unexported fields
}

PageMarshaler encodes JSON via marshaller into HTML page by placing Title and content appropriately.

func (*PageMarshaler) Marshal ΒΆ added in v1.1.0

func (m *PageMarshaler) Marshal(v any) []byte

func (*PageMarshaler) MarshalTo ΒΆ added in v1.1.0

func (m *PageMarshaler) MarshalTo(w io.Writer, v any) error

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL