forked from public/foundryvtt-wh4-lang-fr-fr
		
	
		
			
				
	
	
		
			89 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| --[[
 | |
| 	Licensed according to the included 'LICENSE' document
 | |
| 	Author: Thomas Harning Jr <harningt@gmail.com>
 | |
| ]]
 | |
| local string_char = require("string").char
 | |
| local pairs = pairs
 | |
| 
 | |
| local jsonutil = require("json.util")
 | |
| local util_merge = jsonutil.merge
 | |
| 
 | |
| local _ENV = nil
 | |
| 
 | |
| local normalEncodingMap = {
 | |
| 	['"'] = '\\"',
 | |
| 	['\\'] = '\\\\',
 | |
| 	['/'] = '\\/',
 | |
| 	['\b'] = '\\b',
 | |
| 	['\f'] = '\\f',
 | |
| 	['\n'] = '\\n',
 | |
| 	['\r'] = '\\r',
 | |
| 	['\t'] = '\\t',
 | |
| 	['\v'] = '\\v' -- not in official spec, on report, removing
 | |
| }
 | |
| 
 | |
| local xEncodingMap = {}
 | |
| for char, encoded in pairs(normalEncodingMap) do
 | |
| 	xEncodingMap[char] = encoded
 | |
| end
 | |
| 
 | |
| -- Pre-encode the control characters to speed up encoding...
 | |
| -- NOTE: UTF-8 may not work out right w/ JavaScript
 | |
| -- JavaScript uses 2 bytes after a \u... yet UTF-8 is a
 | |
| -- byte-stream encoding, not pairs of bytes (it does encode
 | |
| -- some letters > 1 byte, but base case is 1)
 | |
| for i = 0, 255 do
 | |
| 	local c = string_char(i)
 | |
| 	if c:match('[%z\1-\031\128-\255]') and not normalEncodingMap[c] then
 | |
| 		-- WARN: UTF8 specializes values >= 0x80 as parts of sequences...
 | |
| 		--       without \x encoding, do not allow encoding > 7F
 | |
| 		normalEncodingMap[c] = ('\\u%.4X'):format(i)
 | |
| 		xEncodingMap[c] = ('\\x%.2X'):format(i)
 | |
| 	end
 | |
| end
 | |
| 
 | |
| local defaultOptions = {
 | |
| 	xEncode = false, -- Encode single-bytes as \xXX
 | |
| 	processor = nil, -- Simple processor for the string prior to quoting
 | |
| 	-- / is not required to be quoted but it helps with certain decoding
 | |
| 	-- Required encoded characters, " \, and 00-1F  (0 - 31)
 | |
| 	encodeSet = '\\"/%z\1-\031',
 | |
| 	encodeSetAppend = nil -- Chars to append to the default set
 | |
| }
 | |
| 
 | |
| local modeOptions = {}
 | |
| 
 | |
| local function mergeOptions(options, mode)
 | |
| 	jsonutil.doOptionMerge(options, false, 'strings', defaultOptions, mode and modeOptions[mode])
 | |
| end
 | |
| 
 | |
| local function getEncoder(options)
 | |
| 	options = options and util_merge({}, defaultOptions, options) or defaultOptions
 | |
| 	local encodeSet = options.encodeSet
 | |
| 	if options.encodeSetAppend then
 | |
| 		encodeSet = encodeSet .. options.encodeSetAppend
 | |
| 	end
 | |
| 	local encodingMap = options.xEncode and xEncodingMap or normalEncodingMap
 | |
| 	local encodeString
 | |
| 	if options.processor then
 | |
| 		local processor = options.processor
 | |
| 		encodeString = function(s, state)
 | |
| 			return '"' .. processor(s:gsub('[' .. encodeSet .. ']', encodingMap)) .. '"'
 | |
| 		end
 | |
| 	else
 | |
| 		encodeString = function(s, state)
 | |
| 			return '"' .. s:gsub('[' .. encodeSet .. ']', encodingMap) .. '"'
 | |
| 		end
 | |
| 	end
 | |
| 	return {
 | |
| 		string = encodeString
 | |
| 	}
 | |
| end
 | |
| 
 | |
| local strings = {
 | |
| 	mergeOptions = mergeOptions,
 | |
| 	getEncoder = getEncoder
 | |
| }
 | |
| 
 | |
| return strings
 |