require"gates.lua"

pitex = gates.new("pitex")
pitex.misc = gates.new("pitex.misc") 

function pitex.log (message, ...)
	texio.write_nl(string.format("\n" .. message .. "\n", ...))
end
function pitex.error (...)
	tex.error ("! PiTeX error: " .. string.format(...) .. ".")
end

pitex.callback = gates.new("pitex.callback")

-- Creates a gate with a callback's name and put it in that callback, if not
-- already there. Adds the subgate(s).
function pitex.callback.register (c, f)
  if pitex.callback.type(c) == 2 then
    pitex.callback.add(f, c)
  else
    pitex.callback.list{c}
    pitex.callback.add(f, c)
    callback.register(c, pitex.callback.execute[c])
  end
end

-- Latin1 to UTF-8.
local char = unicode.utf8.char
local function convert_char (ch)
  return char(string.byte(ch))
end
function pitex.callback.convert (buf)
	return string.gsub(buf,".",convert_char)
end

pitex.callback.register("process_input_buffer", "convert")

function remove_conversion ()
  pitex.callback.close("convert", "process_input_buffer")
end
function restore_conversion ()
  pitex.callback.open("convert", "process_input_buffer")
end

require("nodeinspector")
new_inspection = nodeinspector.new_inspection

local french_highmarks = {
	string.byte("?"),
	string.byte("!"),
	string.byte(":"),
	string.byte(";"),
	}
local french_marks = {
	string.byte("?"),
	string.byte("!"),
	string.byte(":"),
	string.byte(";"),
	string.byte(","),
	string.byte("."),
	string.byte("("),
	string.byte("["),
	string.byte("{"),
	}

local function french_punctuation (head, ...)
	for _, glue in ipairs(arg) do
		if glue.id == 10 then
			head = node.remove(head, glue)
 			node.free(glue)
		end
	end
	local kern = node.new(11, 1)
	kern.kern = tex.sp(".15em")
	node.insert_after(head, arg[1], kern)
end

pitex.callback.french_punctuation = new_inspection(
	french_punctuation,
  {{id = 37, _char = french_marks}, {true, id = 37, char = french_highmarks}},
	{{id = 10, subtype = 0}, {id = 11, subtype = 0}})

pitex.callback.register("kerning", "french_punctuation")
pitex.callback.original_kerning = node.kerning
pitex.callback.register("kerning", "original_kerning")
