forked from public/foundryvtt-wh4-lang-fr-fr
		
	
		
			
				
	
	
		
			92 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| --[[
 | |
| 	Licensed according to the included 'LICENSE' document
 | |
| 	Author: Thomas Harning Jr <harningt@gmail.com>
 | |
| ]]
 | |
| local type = type
 | |
| local assert, error = assert, error
 | |
| local table_concat = require("table").concat
 | |
| local loadstring = loadstring or load
 | |
| 
 | |
| local io = require("io")
 | |
| 
 | |
| local setmetatable = setmetatable
 | |
| 
 | |
| local output_utility = require("json.encode.output_utility")
 | |
| 
 | |
| local _ENV = nil
 | |
| 
 | |
| local tableCompositeCache = setmetatable({}, {__mode = 'v'})
 | |
| 
 | |
| local TABLE_VALUE_WRITER = [[
 | |
| 	ret[#ret + 1] = %VALUE%
 | |
| ]]
 | |
| 
 | |
| local TABLE_INNER_WRITER = ""
 | |
| 
 | |
| --[[
 | |
| 	nextValues can output a max of two values to throw into the data stream
 | |
| 	expected to be called until nil is first return value
 | |
| 	value separator should either be attached to v1 or in innerValue
 | |
| ]]
 | |
| local function defaultTableCompositeWriter(nextValues, beginValue, closeValue, innerValue, composite, encode, state)
 | |
| 	if type(nextValues) == 'string' then
 | |
| 		local fun = output_utility.prepareEncoder(defaultTableCompositeWriter, nextValues, innerValue, TABLE_VALUE_WRITER, TABLE_INNER_WRITER)
 | |
| 		local ret = {}
 | |
| 		fun(composite, ret, encode, state)
 | |
| 		return beginValue .. table_concat(ret, innerValue) .. closeValue
 | |
| 	end
 | |
| end
 | |
| 
 | |
| -- no 'simple' as default action is just to return the value
 | |
| local function getDefault()
 | |
| 	return { composite = defaultTableCompositeWriter }
 | |
| end
 | |
| 
 | |
| -- BEGIN IO-WRITER OUTPUT
 | |
| local IO_INNER_WRITER = [[
 | |
| 	if %WRITE_INNER% then
 | |
| 		state.__outputFile:write(%INNER_VALUE%)
 | |
| 	end
 | |
| ]]
 | |
| local IO_VALUE_WRITER = [[
 | |
| 	state.__outputFile:write(%VALUE%)
 | |
| ]]
 | |
| 
 | |
| local function buildIoWriter(output)
 | |
| 	if not output then -- Default to stdout
 | |
| 		output = io.output()
 | |
| 	end
 | |
| 	local function ioWriter(nextValues, beginValue, closeValue, innerValue, composite, encode, state)
 | |
| 		-- HOOK OUTPUT STATE
 | |
| 		state.__outputFile = output
 | |
| 		if type(nextValues) == 'string' then
 | |
| 			local fun = output_utility.prepareEncoder(ioWriter, nextValues, innerValue, IO_VALUE_WRITER, IO_INNER_WRITER)
 | |
| 			local ret = {}
 | |
| 			output:write(beginValue)
 | |
| 			fun(composite, ret, encode, state)
 | |
| 			output:write(closeValue)
 | |
| 			return nil
 | |
| 		end
 | |
| 	end
 | |
| 
 | |
| 	local function ioSimpleWriter(encoded)
 | |
| 		if encoded then
 | |
| 			output:write(encoded)
 | |
| 		end
 | |
| 		return nil
 | |
| 	end
 | |
| 	return { composite = ioWriter, simple = ioSimpleWriter }
 | |
| end
 | |
| local function getIoWriter(output)
 | |
| 	return function()
 | |
| 		return buildIoWriter(output)
 | |
| 	end
 | |
| end
 | |
| 
 | |
| local output = {
 | |
| 	getDefault = getDefault,
 | |
| 	getIoWriter = getIoWriter
 | |
| }
 | |
| 
 | |
| return output
 |