--- spelling-main.lua --- 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. -- --- Main Lua file. -- -- @author Stephan Hennig -- @copyright 2012, 2013 Stephan Hennig -- @release version 0.41 -- -- Module identification. if luatexbase.provides_module then luatexbase.provides_module( { name = 'spelling', date = '2013/05/25', version = '0.41', description = 'support for spell-checking of LuaTeX documents', author = 'Stephan Hennig', licence = 'LPPL ver. 1.3c', } ) end --- Global table of modules. -- The work of the spelling package can be separated into four -- stages:
-- --
-- --
Stage 1
--
-- --
Stage 2 (call-back pre_linebreak_filter)
--
-- --
Stage 3 (\AtBeginShipout)
--
-- --
Stage 4 (call-back stop_run)
--
-- --
-- -- The code of the spelling package is organized in modules reflecting -- these stages. References to modules are stored in a table. Table -- indices correspond to the stages as shown above. The table of module -- references is shared in a global table (`PKG_spelling`) so that -- public module functions are accessible from within external code.
-- -- -- -- @class table -- @name stage stage = {} --- Table of package-wide resources that are shared among several --- modules. -- -- @class table -- @name res -- -- @field rules_bad Table.
-- -- This table contains all bad rules. Spellings can be matched against -- these rules. -- -- @field rules_good Table.
-- -- This table contains all good match rules. Spellings can be matched -- against these rules. -- -- @field text_document Table.
-- -- Data structure that stores the text of a document. The text document -- data structure stores the text of a document. The data structure is -- quite simple. A text document is an ordered list (an array) of -- paragraphs. A paragraph is an ordered list (an array) of words. A -- word is a single UTF-8 encoded string.
-- -- During the LuTeX run, node lists are scanned for strings before -- hyphenation takes place. The strings found in a node list are stored -- in the current paragraph. After finishing scanning a node list, the -- current paragraph is inserted into the text document. At the end of -- the LuaTeX run, all paragraphs of the text document are broken into -- lines of a fixed length and the lines are written to a file.
-- -- Here's the rationale of this approach: -- -- -- -- @field whatsit_uid Number.
-- -- Unique ID for marking user-defined whatsit nodes created by this -- package. The ID is generated at run-time. See this GitHub issue. -- local res = { rules_bad, rules_good, text_document, whatsit_ids, } --- Global package table. -- This global table provides access to package-wide variables from -- within other chunks. -- -- @class table -- @name PKG_spelling PKG_spelling = {} --- Determine unique IDs for user-defined whatsit nodes used by this -- package. Package luatexbase provides user-defined whatsit node ID -- allocation since version v0.6 (TL 2013). For older package versions, -- we start allocating at an arbitrary hard-coded value of 13**8 -- (ca. 2**30). Note, for compatibility with LuaTeX 0.70.2, the value -- must be less than 2^31. -- -- @return Table mapping names to IDs. local function __allocate_whatsit_ids() local ids = {} -- Allocation support present? if luatexbase.new_user_whatsit_id then ids.start_tag = luatexbase.new_user_whatsit_id('start_tag', 'spelling') ids.end_tag = luatexbase.new_user_whatsit_id('end_tag', 'spelling') else local uid = 13^8 ids.start_tag = uid + 1 ids.end_tag = uid + 2 end return ids end --- Package initialisation. -- local function __init() -- Create resources. res.rules_bad = {} res.rules_good = {} res.text_document = {} res.whatsit_ids = __allocate_whatsit_ids() -- Provide global access to package ressources during module loading. PKG_spelling.res = res -- Load sub-modules: -- * bad and good string loading -- * match rule handling stage[1] = require 'spelling-stage-1' -- * node list tagging -- * spell-checking -- * bad string highlighting stage[2] = require 'spelling-stage-2' -- * text storage stage[3] = require 'spelling-stage-3' -- * text output stage[4] = require 'spelling-stage-4' -- Remove global reference to package ressources. PKG_spelling.res = nil -- Provide global access to module references. PKG_spelling.stage = stage -- Enable text storage. stage[3].enable_text_storage() end -- Initialize package. __init()