Skip to content
Snippets Groups Projects
Select Git revision
  • 84fef5d5097315f07f0cb34a26d515a84f45bb45
  • master default protected
  • 1.31
  • 4.38.6
  • 4.38.5
  • 4.38.4
  • 4.38.3
  • 4.38.2
  • 4.38.1
  • 4.38.0
  • 4.37.2
  • 4.37.1
  • 4.37.0
  • 4.36.0
  • 4.35.0
  • 4.34.1
  • 4.34.0
  • 4.33.1
  • 4.33.0
  • 4.32.2
  • 4.32.1
  • 4.32.0
  • 4.31.0
23 results

generic.pcss

Blame
  • dataurl.go 1.72 KiB
    package helpers
    
    import (
    	"encoding/base64"
    	"fmt"
    	"strings"
    	"unicode/utf8"
    )
    
    // Returns the shorter of either a base64-encoded or percent-escaped data URL
    func EncodeStringAsShortestDataURL(mimeType string, text string) string {
    	encoded := base64.StdEncoding.EncodeToString([]byte(text))
    	url := fmt.Sprintf("data:%s;base64,%s", mimeType, encoded)
    	if percentURL, ok := EncodeStringAsPercentEscapedDataURL(mimeType, text); ok && len(percentURL) < len(url) {
    		return percentURL
    	}
    	return url
    }
    
    // See "scripts/dataurl-escapes.html" for how this was derived
    func EncodeStringAsPercentEscapedDataURL(mimeType string, text string) (string, bool) {
    	hex := "0123456789ABCDEF"
    	sb := strings.Builder{}
    	n := len(text)
    	i := 0
    	runStart := 0
    	sb.WriteString("data:")
    	sb.WriteString(mimeType)
    	sb.WriteByte(',')
    
    	// Scan for trailing characters that need to be escaped
    	trailingStart := n
    	for trailingStart > 0 {
    		if c := text[trailingStart-1]; c > 0x20 || c == '\t' || c == '\n' || c == '\r' {
    			break
    		}
    		trailingStart--
    	}
    
    	for i < n {
    		c, width := utf8.DecodeRuneInString(text[i:])
    
    		// We can't encode invalid UTF-8 data
    		if c == utf8.RuneError && width == 1 {
    			return "", false
    		}
    
    		// Escape this character if needed
    		if c == '\t' || c == '\n' || c == '\r' || c == '#' || i >= trailingStart ||
    			(c == '%' && i+2 < n && isHex(text[i+1]) && isHex(text[i+2])) {
    			if runStart < i {
    				sb.WriteString(text[runStart:i])
    			}
    			sb.WriteByte('%')
    			sb.WriteByte(hex[c>>4])
    			sb.WriteByte(hex[c&15])
    			runStart = i + width
    		}
    
    		i += width
    	}
    
    	if runStart < n {
    		sb.WriteString(text[runStart:])
    	}
    
    	return sb.String(), true
    }
    
    func isHex(c byte) bool {
    	return c >= '0' && c <= '9' || c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F'
    }