%%% spelling.sty
%%% Copyright 2012, 2013 Stephan Hennig
%%
%% This work may be distributed and/or modified under the conditions of
%% the LaTeX Project Public License, either version 1.3 of this license
%% or (at your option) any later version.  The latest version of this
%% license is in http://www.latex-project.org/lppl.txt
%% and version 1.3 or later is part of all distributions of LaTeX
%% version 2005/12/01 or later.
%%
%% See file README for more information.
%%
\ProvidesPackage{spelling}
  [2013/05/25 v0.41 Support for spell-checking of LuaTeX documents (SH)]
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
% Test for the LuaTeX engine.
\RequirePackage{ifluatex}
\ifluatex
\else
\PackageError{spelling}{LuaTeX engine required}{You could try with the
  `lualatex' command.}
\fi
% Lua module version management.
\RequirePackage{luatexbase-modutils}
% LuaTeX call-back management.
\RequirePackage{luatexbase-mcb}
% User-defined whatsit node ID allocation.
\RequirePackage{luatexbase-attr}
% Load main Lua file.
\directlua name {spelling}{
  % The main Lua file is not a module, so we must pass a full path to
  % `dofile`.
  local f = kpse.find_file('spelling-main.lua', 'lua')
  dofile(f)
}
% Words are extracted after pages have been built.  In lack of a proper
% Lua call-back, we're hooking into shipout from the LaTeX side.
\RequirePackage{atbegshi}
\AtBeginShipout{%
  \directlua name {spelling-atbeginshipout}{
    PKG_spelling.cb_AtBeginShipout(\the\AtBeginShipoutBox)
  }%
}
% Provide command for reading-in a list of bad spellings.
\newcommand*{\spellingreadbad}[1]{%
  \directlua{
    PKG_spelling.stage[1].parse_bad_plain_list_file('\luaescapestring{#1}')
  }%
}
% Provide command for reading-in a list of good spellings.
\newcommand*{\spellingreadgood}[1]{%
  \directlua{
    PKG_spelling.stage[1].parse_good_plain_list_file('\luaescapestring{#1}')
  }%
}
% Provide command for reading bad spellings from a LanguageTool XML
% file.
\newcommand*{\spellingreadLT}[1]{%
  \directlua{
    PKG_spelling.stage[1].parse_XML_LanguageTool_file('\luaescapestring{#1}')
  }%
}
% Provide command for reading match rules from a file.  Argument must be
% a file name.
\newcommand*{\spellingmatchrules}[1]{%
  \directlua{
    PKG_spelling.stage[1].read_match_rules('\luaescapestring{#1}')
  }%
}
% Provide command for enabling/disabling visual feedback.
\newcommand*{\spellinghighlight}[1]{%
  \directlua{
    if '\luaescapestring{#1}' == 'on' then
      PKG_spelling.stage[2].enable_word_highlighting()
    else
      PKG_spelling.stage[2].disable_word_highlighting()
    end
  }%
}
% Provide command for setting visual feedback colour.
\newcommand*{\spellinghighlightcolor}[1]{%
  \directlua{
    PKG_spelling.stage[2].set_highlight_color('\luaescapestring{#1}')
  }%
}
% Provide command for enabling/disabling text ouput.
\newcommand*{\spellingoutput}[1]{%
  \directlua{
    if '\luaescapestring{#1}' == 'on' then
      PKG_spelling.stage[4].enable_text_output()
    else
      PKG_spelling.stage[4].disable_text_output()
    end
  }%
}
% Provide command for setting text output file name.
\newcommand*{\spellingoutputname}[1]{%
  \directlua{
    PKG_spelling.stage[4].set_output_file_name('\luaescapestring{#1}')
  }%
}
% Provide command for setting text output file line length.
\newcommand*{\spellingoutputlinelength}[1]{%
  \directlua{
    PKG_spelling.stage[4].set_output_line_length(\luaescapestring{#1})
  }%
}
% Provide command for enabling/disabling text extraction.
\newcommand*{\spellingextract}[1]{%
  \directlua{
    if '\luaescapestring{#1}' == 'on' then
      PKG_spelling.stage[2].enable_text_tagging()
    else
      PKG_spelling.stage[2].disable_text_tagging()
    end
  }%
}
% Provide command to declare code point mappings.
\newcommand*{\spellingmapping}[2]{%
  \directlua{
    local r = PKG_spelling.stage[2].set_mapping(\luaescapestring{#1}, '\luaescapestring{#2}')
    if r == false then
      texio.write_nl('package spelling: invalid mapping: \luaescapestring{#1} => \luaescapestring{#2}')
    end
  }%
}
% Provide command to clear all existing code point mappings.
\newcommand*{\spellingclearallmappings}{%
  \directlua{
    PKG_spelling.stage[2].clear_all_mappings()
  }%
}
% Provide command to specify table paragraph behaviour.
\newcommand*{\spellingtablepar}[1]{%
  \directlua{
    PKG_spelling.stage[3].set_table_paragraphs(\luaescapestring{#1})
  }%
}
%
% Read bad and good spellings from default sources.
\directlua{
  PKG_spelling.stage[1].parse_default_bad_and_good()
}%
%
% Enable visual feedback.
\spellinghighlight{on}
% Enable text ouput at the end of the LuaTeX run.
\spellingoutput{on}
% Enable text extraction.
\spellingextract{on}