defaultHighlight function

Parameters:

  • code string
  • lang string

Returns:

  • string
  • bool
Show/Hide Function Body
{
	switch lang {
	case "go":
		return highlightGo(code), true
	case "rtml":
		return highlightRTML(code), true
	default:
		return "", false
	}
}

highlightGo function

Parameters:

  • code string

Returns:

  • string
Show/Hide Function Body
{
	esc := html.EscapeString(code)
	esc = goCommentRe.ReplaceAllStringFunc(esc, func(m string) string {
		return `<span class="hl-comment">` + m + `</span>`
	})
	esc = goStringRe.ReplaceAllStringFunc(esc, func(m string) string {
		return `<span class="hl-string">` + m + `</span>`
	})
	esc = goKeywordRe.ReplaceAllString(esc, `<span class="hl-kw">$1</span>`)
	return esc
}

highlightRTML function

Parameters:

  • code string

Returns:

  • string
Show/Hide Function Body
{
	esc := html.EscapeString(code)
	esc = rtmlTagRe.ReplaceAllStringFunc(esc, func(m string) string {
		s := rtmlAttrRe.ReplaceAllString(m, ` <span class="hl-attr">$1</span>=`)
		s = rtmlCmdAttrRe.ReplaceAllString(s, ` <span class="hl-cmd">$1</span>`)
		s = rtmlStringRe.ReplaceAllStringFunc(s, func(str string) string {
			quote := "&#34;"
			inner := str[len(quote) : len(str)-len(quote)]
			inner = rtmlCmdRe.ReplaceAllStringFunc(inner, func(cmd string) string {
				return `<span class="hl-cmd">` + cmd + `</span>`
			})
			return `<span class="hl-string">` + quote + inner + quote + `</span>`
		})
		return `<span class="hl-tag">` + s + `</span>`
	})
	esc = rtmlStandaloneRe.ReplaceAllString(esc, `$1<span class="hl-cmd">$2</span>`)
	esc = rtmlInterpRe.ReplaceAllStringFunc(esc, func(m string) string {
		return `<span class="hl-var">` + m + `</span>`
	})
	return esc
}

TestHighlightGo function

Parameters:

  • t *testing.T
Show/Hide Function Body
{
	code := "package main\n// comment\nvar s = \"hi\""
	out, ok := Highlight(code, "go")
	if !ok {
		t.Fatalf("unexpected highlight failure: %s", out)
	}
	if !strings.Contains(out, `<span class="hl-kw">package</span>`) {
		t.Fatalf("missing keyword highlighting: %s", out)
	}
	if !strings.Contains(out, `<span class="hl-comment">// comment</span>`) {
		t.Fatalf("missing comment highlighting: %s", out)
	}
	if !strings.Contains(out, `<span class="hl-string">&#34;hi&#34;</span>`) {
		t.Fatalf("missing string highlighting: %s", out)
	}
}

TestHighlightRTML function

Parameters:

  • t *testing.T
Show/Hide Function Body
{
	code := "<div class=\"x\">{name}</div>\n<button @on:click:save>ok</button>\n@for:item in items"
	out, ok := Highlight(code, "rtml")
	if !ok {
		t.Fatalf("unexpected highlight failure: %s", out)
	}
	tag := "<span class=\"hl-tag\">&lt;div <span class=\"hl-attr\">class</span>=<span class=\"hl-string\">&#34;x&#34;</span>&gt;</span>"
	if !strings.Contains(out, tag) {
		t.Fatalf("missing tag highlighting: %s", out)
	}
	if !strings.Contains(out, `<span class="hl-var">{name}</span>`) {
		t.Fatalf("missing variable highlighting: %s", out)
	}
	if !strings.Contains(out, `<span class="hl-cmd">@on:click:save</span>`) {
		t.Fatalf("missing command attribute highlighting: %s", out)
	}
	if !strings.Contains(out, `<span class="hl-cmd">@for:item</span>`) {
		t.Fatalf("missing standalone command highlighting: %s", out)
	}
}

TestOverrideHighlight function

Parameters:

  • t *testing.T
Show/Hide Function Body
{
	prev := Highlight
	defer func() { Highlight = prev }()
	Highlight = func(code, lang string) (string, bool) {
		if code == "c" && lang == "l" {
			return "ok", true
		}
		return "", false
	}
	if out, ok := Highlight("c", "l"); !ok || out != "ok" {
		t.Fatalf("override failed: %v %v", out, ok)
	}
}

Plugin struct

Methods:

Build


Parameters:
  • json.RawMessage

Returns:
  • error

Show/Hide Method Body
{ return nil }

Install


Parameters:
  • a *core.App

Show/Hide Method Body
{
	js.ExposeFunc("rfwHighlight", func(this js.Value, args []js.Value) any {
		if len(args) < 2 {
			return ""
		}
		code := args[0].String()
		lang := args[1].String()
		if res, ok := Highlight(code, lang); ok {
			return res
		}
		return ""
	})

	js.ExposeFunc("rfwHighlightAll", func(this js.Value, args []js.Value) any {
		HighlightAll()
		return nil
	})

	doc := dom.Doc()
	style := doc.CreateElement("style")
	style.SetHTML(`.hl-kw{color:#ff7b72}.hl-tag{color:#7ee787}.hl-attr{color:#e3b341}.hl-string{color:#a5d6ff}.hl-comment{color:#8b949e;font-style:italic}.hl-var{color:#d2a8ff}.hl-cmd{color:#ffa657}`)
	doc.Query("head").Call("appendChild", style.Value)
}

New function

Returns:

  • *Plugin
Show/Hide Function Body
{ return &Plugin{} }

HighlightAll function

HighlightAll finds all

 blocks in the document and replaces

their contents with highlighted HTML using the registered Highlight

function. The language is detected from `language-` classes or the

`data-lang` attribute.

Show/Hide Function Body
{
	doc := dom.Doc()
	codes := doc.QueryAll("pre code")
	length := codes.Length()
	for i := 0; i < length; i++ {
		el := codes.Index(i)
		cls := el.Get("className").String()
		lang := ""
		for _, c := range strings.Split(cls, " ") {
			lc := strings.ToLower(c)
			if strings.HasPrefix(lc, "language-") {
				lang = strings.TrimPrefix(lc, "language-")
				break
			}
		}
		if lang == "" {
			lang = strings.ToLower(el.Get("dataset").Get("lang").String())
		}
		code := el.Get("textContent").String()
		if res, ok := Highlight(code, lang); ok {
			el.SetHTML(res)
		}
	}
}

html import

Import example:

import "html"

regexp import

Import example:

import "regexp"

strings import

Import example:

import "strings"

strings import

Import example:

import "strings"

testing import

Import example:

import "testing"

encoding/json import

Import example:

import "encoding/json"

strings import

Import example:

import "strings"

github.com/rfwlab/rfw/v1/core import

Import example:

import "github.com/rfwlab/rfw/v1/core"

github.com/rfwlab/rfw/v1/dom import

Import example:

import "github.com/rfwlab/rfw/v1/dom"

Imported as:

dom

github.com/rfwlab/rfw/v1/js import

Import example:

import "github.com/rfwlab/rfw/v1/js"

Imported as:

js