- SyncG15Office files each submission as a G15Office task with its screenshot through a fetchguard client limited to the configured host; a River job with 3 attempts, PHP's messages on failure, nothing sent when unconfigured - the replay of PHP's recorded G15Office exchange (classes/testdata) asserts the task JSON, headers and the screenshot part - settings screen (cabana field types only), read-only submissions list, manage_settings permission and navigation - embed.js served byte for byte at /plugins/golem15/feedback/assets/js/embed.js - feedback:import-settings copies the WinterCMS settings row once
178 lines
3.6 KiB
Go
178 lines
3.6 KiB
Go
package classes
|
|
|
|
import "strings"
|
|
|
|
// StrLimit is Laravel's Str::limit: value as it is when its display width
|
|
// (mb_strwidth) is at most limit, else the widest prefix that fits
|
|
// (mb_strimwidth), right-trimmed, followed by end.
|
|
func StrLimit(value string, limit int, end string) string {
|
|
if StrWidth(value) <= limit {
|
|
return value
|
|
}
|
|
width := 0
|
|
cut := len(value)
|
|
for i, r := range value {
|
|
w := runeWidth(r)
|
|
if width+w > limit {
|
|
cut = i
|
|
break
|
|
}
|
|
width += w
|
|
}
|
|
return strings.TrimRight(value[:cut], " \t\n\r\x00\x0B") + end
|
|
}
|
|
|
|
// StrWidth is mb_strwidth(value, 'UTF-8'): 2 columns for each East Asian
|
|
// wide or fullwidth character, 1 for every other one.
|
|
func StrWidth(value string) int {
|
|
n := 0
|
|
for _, r := range value {
|
|
n += runeWidth(r)
|
|
}
|
|
return n
|
|
}
|
|
|
|
func runeWidth(r rune) int {
|
|
lo, hi := 0, len(wideRanges)
|
|
for lo < hi {
|
|
mid := (lo + hi) / 2
|
|
switch {
|
|
case r < wideRanges[mid][0]:
|
|
hi = mid
|
|
case r > wideRanges[mid][1]:
|
|
lo = mid + 1
|
|
default:
|
|
return 2
|
|
}
|
|
}
|
|
return 1
|
|
}
|
|
|
|
// wideRanges are the code points PHP's mbstring counts as two columns
|
|
// (generated from mb_strwidth over U+0000..U+3FFFF on PHP 8.5).
|
|
var wideRanges = [][2]rune{
|
|
{0x1100, 0x115F},
|
|
{0x231A, 0x231B},
|
|
{0x2329, 0x232A},
|
|
{0x23E9, 0x23EC},
|
|
{0x23F0, 0x23F0},
|
|
{0x23F3, 0x23F3},
|
|
{0x25FD, 0x25FE},
|
|
{0x2614, 0x2615},
|
|
{0x2630, 0x2637},
|
|
{0x2648, 0x2653},
|
|
{0x267F, 0x267F},
|
|
{0x268A, 0x268F},
|
|
{0x2693, 0x2693},
|
|
{0x26A1, 0x26A1},
|
|
{0x26AA, 0x26AB},
|
|
{0x26BD, 0x26BE},
|
|
{0x26C4, 0x26C5},
|
|
{0x26CE, 0x26CE},
|
|
{0x26D4, 0x26D4},
|
|
{0x26EA, 0x26EA},
|
|
{0x26F2, 0x26F3},
|
|
{0x26F5, 0x26F5},
|
|
{0x26FA, 0x26FA},
|
|
{0x26FD, 0x26FD},
|
|
{0x2705, 0x2705},
|
|
{0x270A, 0x270B},
|
|
{0x2728, 0x2728},
|
|
{0x274C, 0x274C},
|
|
{0x274E, 0x274E},
|
|
{0x2753, 0x2755},
|
|
{0x2757, 0x2757},
|
|
{0x2795, 0x2797},
|
|
{0x27B0, 0x27B0},
|
|
{0x27BF, 0x27BF},
|
|
{0x2B1B, 0x2B1C},
|
|
{0x2B50, 0x2B50},
|
|
{0x2B55, 0x2B55},
|
|
{0x2E80, 0x2E99},
|
|
{0x2E9B, 0x2EF3},
|
|
{0x2F00, 0x2FD5},
|
|
{0x2FF0, 0x303E},
|
|
{0x3041, 0x3096},
|
|
{0x3099, 0x30FF},
|
|
{0x3105, 0x312F},
|
|
{0x3131, 0x318E},
|
|
{0x3190, 0x31E5},
|
|
{0x31EF, 0x321E},
|
|
{0x3220, 0x3247},
|
|
{0x3250, 0xA48C},
|
|
{0xA490, 0xA4C6},
|
|
{0xA960, 0xA97C},
|
|
{0xAC00, 0xD7A3},
|
|
{0xF900, 0xFAFF},
|
|
{0xFE10, 0xFE19},
|
|
{0xFE30, 0xFE52},
|
|
{0xFE54, 0xFE66},
|
|
{0xFE68, 0xFE6B},
|
|
{0xFF01, 0xFF60},
|
|
{0xFFE0, 0xFFE6},
|
|
{0x16FE0, 0x16FE4},
|
|
{0x16FF0, 0x16FF6},
|
|
{0x17000, 0x18CD5},
|
|
{0x18CFF, 0x18D1E},
|
|
{0x18D80, 0x18DF2},
|
|
{0x1AFF0, 0x1AFF3},
|
|
{0x1AFF5, 0x1AFFB},
|
|
{0x1AFFD, 0x1AFFE},
|
|
{0x1B000, 0x1B122},
|
|
{0x1B132, 0x1B132},
|
|
{0x1B150, 0x1B152},
|
|
{0x1B155, 0x1B155},
|
|
{0x1B164, 0x1B167},
|
|
{0x1B170, 0x1B2FB},
|
|
{0x1D300, 0x1D356},
|
|
{0x1D360, 0x1D376},
|
|
{0x1F004, 0x1F004},
|
|
{0x1F0CF, 0x1F0CF},
|
|
{0x1F18E, 0x1F18E},
|
|
{0x1F191, 0x1F19A},
|
|
{0x1F200, 0x1F202},
|
|
{0x1F210, 0x1F23B},
|
|
{0x1F240, 0x1F248},
|
|
{0x1F250, 0x1F251},
|
|
{0x1F260, 0x1F265},
|
|
{0x1F300, 0x1F320},
|
|
{0x1F32D, 0x1F335},
|
|
{0x1F337, 0x1F37C},
|
|
{0x1F37E, 0x1F393},
|
|
{0x1F3A0, 0x1F3CA},
|
|
{0x1F3CF, 0x1F3D3},
|
|
{0x1F3E0, 0x1F3F0},
|
|
{0x1F3F4, 0x1F3F4},
|
|
{0x1F3F8, 0x1F43E},
|
|
{0x1F440, 0x1F440},
|
|
{0x1F442, 0x1F4FC},
|
|
{0x1F4FF, 0x1F53D},
|
|
{0x1F54B, 0x1F54E},
|
|
{0x1F550, 0x1F567},
|
|
{0x1F57A, 0x1F57A},
|
|
{0x1F595, 0x1F596},
|
|
{0x1F5A4, 0x1F5A4},
|
|
{0x1F5FB, 0x1F64F},
|
|
{0x1F680, 0x1F6C5},
|
|
{0x1F6CC, 0x1F6CC},
|
|
{0x1F6D0, 0x1F6D2},
|
|
{0x1F6D5, 0x1F6D8},
|
|
{0x1F6DC, 0x1F6DF},
|
|
{0x1F6EB, 0x1F6EC},
|
|
{0x1F6F4, 0x1F6FC},
|
|
{0x1F7E0, 0x1F7EB},
|
|
{0x1F7F0, 0x1F7F0},
|
|
{0x1F90C, 0x1F93A},
|
|
{0x1F93C, 0x1F945},
|
|
{0x1F947, 0x1F9FF},
|
|
{0x1FA70, 0x1FA7C},
|
|
{0x1FA80, 0x1FA8A},
|
|
{0x1FA8E, 0x1FAC6},
|
|
{0x1FAC8, 0x1FAC8},
|
|
{0x1FACD, 0x1FADC},
|
|
{0x1FADF, 0x1FAEA},
|
|
{0x1FAEF, 0x1FAF8},
|
|
{0x20000, 0x2FFFD},
|
|
{0x30000, 0x3FFFD},
|
|
}
|