--[[
This file is part of the `arabluatex' package

copyright (C) 2016  Robert Alessi

Please send error reports and suggestions for improvements to
Robert Alessi <alessi@robertalessi.net>

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
--]]

require("arabluatex_voc")
require("arabluatex_fullvoc")
require("arabluatex_novoc")

local function protectarb(str)
   str = string.gsub(str, "(\\arb.?)(%[.-%])(%b{})", "\\@arb%2%3")
   str = string.gsub(str, "\\par", "\\p@r{}")
   str = string.gsub(str, "\\@@par", "\\p@r{}")
return str
end

local function unprotectarb(str)
   str = string.gsub(str, "(\\@arb)(%[.-%])(%b{})", "\\arb%2%3")
   str = string.gsub(str, "\\p@r{}", "\\par")
return str
end

local function breakcmd(str)
   -- \RL
   str = string.gsub(str, "\\(RL.-)(%b{})",
		function(tag, body)
		body = string.sub(body, 2, -2)
		return string.format("}\\%s{%s}\\arb{", tag, body)
		end)
   -- \LR
   str = string.gsub(str, "\\(LR.-)(%b{})",
		function(tag, body)
		body = string.sub(body, 2, -2)
		return string.format("}\\%s{%s}\\arb{", tag, body)
		end)
   -- Footnote
   str = string.gsub(str, "\\(Footnote.-)(%b{})",
		function(tag, body)
		body = string.sub(body, 2, -2)
		return string.format("}\\%s{%s}\\arb{", tag, body)
		end)
	-- Marginpar
   str = string.gsub(str, "\\(Marginpar.-)(%b{})",
		function(tag, body)
		body = string.sub(body, 2, -2)
		return string.format("}\\%s{%s}\\arb{", tag, body)
		end)
   -- Abjad (Needs polyglossia)
   str = string.gsub(str, "\\(abjad.-)(%b{})",
	function(tag, body)
	body = string.sub(body, 2, -2)
	return string.format("}\\aemph{\\txarb{\\%s{%s}}}\\arb{", tag, body)
	end)
   return str
end

local function holdcmd(str)
	str = string.gsub(str, "\\(arb)(%b{})", function(tag, body)
	body = string.sub(body, 2, -2)
	body = string.gsub(body, "\\(.-)(%b{})", function(btag, bbody)
	bbody = string.sub(bbody, 2, -2)
	if string.find(btag, "@") then
	return holdcmd(string.format("}\\%s{%s}\\arb{", btag, bbody))	
	else
	return holdcmd(string.format("}\\%s{\\arb{%s}}\\arb{", btag, bbody))
	end
	end)
	return string.format("\\%s{%s}", tag, body)
	end)
	str = string.gsub(str, "\\arb{}", "")
return str
end

local function arbnum(str)
   str = string.gsub(str, "([0-9%,%-%/]+)", function(num)
	return string.reverse(num)
   end)
   return str
end

local function indnum(str)
   str = string.gsub(str, "([0-9%,%-%/]+)", function(num)
	return string.reverse(num)
   end)
   for i = 1,#numbers do
      str = string.gsub(str, numbers[i].a, numbers[i].b)
   end
   return str
end

local function voc(str)
   str = string.gsub(str, "\\arb(%b{})", function(inside)
   inside = string.sub(inside, 2, -2)
    for i = 1,#hamza do
		inside = string.gsub(inside, hamza[i].a, hamza[i].b)
	end
	for i = 1,#tanwin do
		inside  = string.gsub(inside, tanwin[i].a, tanwin[i].b)
	end
	for i = 1,#trigraphs do
		inside = string.gsub(inside, trigraphs[i].a, trigraphs[i].b)
	end
	for i = 1,#digraphs do
		inside = string.gsub(inside, digraphs[i].a, digraphs[i].b)
	end
	for i = 1,#single do
		inside = string.gsub(inside, single[i].a, single[i].b)
	end
	for i = 1,#longv do
		inside = string.gsub(inside, longv[i].a, longv[i].b)
	end
	for i = 1,#shortv do
		inside = string.gsub(inside, shortv[i].a, shortv[i].b)
	end
	for i = 1,#null do
		inside = string.gsub(inside, null[i].a, null[i].b)
	end
	inside = indnum(inside)
    return string.format("\\txarb{%s}", inside)
  end)
return str
end

local function fullvoc(str)
   str = string.gsub(str, "\\arb(%b{})", function(inside)
   inside = string.sub(inside, 2, -2)
    for i = 1,#hamzafv do
		inside = string.gsub(inside, hamzafv[i].a, hamzafv[i].b)
	end
	for i = 1,#tanwin do
		inside  = string.gsub(inside, tanwin[i].a, tanwin[i].b)
	end
	for i = 1,#trigraphsfv do
		inside = string.gsub(inside, trigraphsfv[i].a, trigraphsfv[i].b)
	end
	for i = 1,#digraphsfv do
		inside = string.gsub(inside, digraphsfv[i].a, digraphsfv[i].b)
	end
	for i = 1,#single do
		inside = string.gsub(inside, single[i].a, single[i].b)
	end
	for i = 1,#longv do
		inside = string.gsub(inside, longv[i].a, longv[i].b)
	end
	for i = 1,#shortv do
		inside = string.gsub(inside, shortv[i].a, shortv[i].b)
	end
	for i = 1,#null do
		inside = string.gsub(inside, null[i].a, null[i].b)
	end
	inside = indnum(inside)
    return string.format("\\txarb{%s}", inside)
  end)
return str
end

local function novoc(str)
   str = string.gsub(str, "\\arb(%b{})", function(inside)
   inside = string.sub(inside, 2, -2)
    for i = 1,#hamza do
		inside = string.gsub(inside, hamza[i].a, hamza[i].b)
	end
	for i = 1,#tanwinnv do
	  inside  = string.gsub(inside, tanwinnv[i].a, tanwinnv[i].b)
	end
	for i = 1,#trigraphs do
		inside = string.gsub(inside, trigraphs[i].a, trigraphs[i].b)
	end
	for i = 1,#digraphs do
		inside = string.gsub(inside, digraphs[i].a, digraphs[i].b)
	end
	for i = 1,#single do
		inside = string.gsub(inside, single[i].a, single[i].b)
	end
	for i = 1,#longvnv do
		inside = string.gsub(inside, longvnv[i].a, longvnv[i].b)
	end
	for i = 1,#shortvnv do
	  inside = string.gsub(inside, shortvnv[i].a, shortvnv[i].b)
	end
	for i = 1,#null do
		inside = string.gsub(inside, null[i].a, null[i].b)
	end
	inside = indnum(inside)
    return string.format("\\txarb{%s}", inside)
  end)
return str
end

function processvoc(str)
   str = "\\arb{".. str.."}"
   str = protectarb(str)
   str = breakcmd(str)
   str = holdcmd(str)
   str = voc(str)
   str = unprotectarb(str)
return str
end

function processfullvoc(str)
   str = "\\arb{".. str.."}"
   str = protectarb(str)
   str = breakcmd(str)
   str = holdcmd(str)
   str = fullvoc(str)
   str = unprotectarb(str)
return str
end

function processnovoc(str)
   str = "\\arb{".. str.."}"
   str = protectarb(str)
   str = breakcmd(str)
   str = holdcmd(str)
   str = novoc(str)
   str = unprotectarb(str)
return str
end

--print(processvoc("'at_A .sadIquN 'il_A ju.hA ya.tlubu min-hu .himAra-hu li-yarkiba-hu fI safraTiN qa.sIraTiN wa-qAla la-hu sawfa 'u`Idu-hu 'ilay-ka fI 'l-masA'i wa-'adfa`u la-ka 'ujraTaN 'at_A .sadIquN 'il_A ju.hA ya.tlubu min-hu .himAra-hu li-yarkiba-hu fI safraTiN qa.sIraTiN wa-qAla la-hu sawfa 'u`Idu-hu 'ilay-ka fI 'l-masA'i wa-'adfa`u la-ka 'ujraTaN"))
--print(arbnum("bop 0123456789"))
--print(processvoc("daxala \\arb[novoc]{mubtasimaN}"))
--print(processvoc("\\emph{daxala} \\arb[novoc]{mufakkiruN}\\Footnote{\\arb{kataba \\arb[novoc]{mubtasimaN}} Je pense que c'est bien \\arb{kataba}} faqa.t"))
--print(processvoc("daxala \\abjad{45} mubtasimaN"))
--print(process("daxala\\Footnote{Et là c'est toujours \\arb{mubtasimaN}?"))
--print(process("\\emph{daxala}\\Footnote{texte arabe: \\arb{\\emph{kataba}}} \\textbf{\\emph{mubtasimaN}} faqa.t"))