Module:TNT

From Vampire Huntress Legend Series Wiki
Jump to navigation Jump to search
Sankofa.jpg
The wiki for all things in the Vampire Huntress Legend Series!
Check out the articles for all the novels, characters, comics and more!
About the series

The Vampire Huntress Legend Series (VHLS) is a twelve book series written by Leslie Banks under the pseudonym L.A. Banks. The series centers around a young twenty-something year old woman named Damali Richards who is a spoken word artist as well as The Neteru, a human who is born every thousand years to fight the Dark Realms. Her most dangerous and most constant enemy from The Dark Realms are vampires.

The entire series is based on the never ending struggle between good and evil. The Vampire Huntress Legend Series is also about the strong bonds of love. Love that exists in the form of family love, friendship love, love of self, love for the world (environment) and the love between man and woman.

The series spans the original twelve books, four part comic sequel, six short stories and a spin off book trilogy that remains unfinished due to the death of Banks in 2011. Additionally, the official Vampire Huntress Legend website contained additional between-the-books content, official character art, bios, dossiers and more. Read more...


Novels
Minion.jpg The Awakening (First Edition).jpg The Hunted (First Edition).jpg The Bitten (First Edition).jpg The Forbidden (First Edition).jpg The Damned (First Edition, First Print).png
01: Minion 02: The Awakening 03: The Hunted 04: The Bitten 05: The Forbidden 06: The Damned
The Forsaken (First Edition).jpg The Wicked (First Edition).jpg The Cursed (First Edition - BTB).jpg The Darkness (First Edition).jpg The Shadows (First Edition).jpg The Thirteenth (First Edition).jpg
07: The Forsaken 08: The Wicked 09: The Cursed 10: The Darkness 11: The Shadows 12: The Thirteenth
Anthologies Vampire Huntress: Dawn and Darkness
Stroke of Midnight cover art.jpg Love At First Bite.jpg Dawn and Darkness Ashes to Ashes original cover.jpg Dawn and Darkness Dust to Dust Half Cover.jpg Dawn and Darknes Bygones to Blood cover.jpg Dawn and Darkness Ride or Die cover.jpg
3.5: Make it Last Forever 7.5: Ride the Night Wind Book One: Ashes to Ashes Book Two: Dust to Dust Book Three: Bygones to Blood Book Four: Ride or Die
Neteru Academy Books Additional Content
Shadow Walker cover art.jpg Wiki.png Wiki.png Vampire Huntress Legend Sampler cover art.jpg Secret desires.jpg Wiki.png
01: Shadow Walker 02: Shadow Seekers (Unreleased) 03: Shadow Slayers (Unreleased) Vampire Huntress Legend Sampler Secret Desires Exotic Contraband:
LA Banks' VHL Concept Art Book
Official Website Content Promotional Stories
Wiki.png Wiki.png Wiki.png Wiki.png Nothing Like the First Time.png Atlantis Rising.png
Between the Books Damali's Journal Inside the Mind of a Vampire Carlos' Black Box Nothing Like the First Time Atlantis Rising
Featured Articles
Damali web.jpg
Damali Richards
Carlos Rivera profile.jpg
Carlos Rivera
Wiki.png
Vampire Council
Wiki.png
Vampires
Wiki.png
Guardians
Wiki community

How to help
Register
Please feel free to contribute by creating new articles or expanding on existing ones.
Check out the Projects page to see which pages are in need of work.
Feel free to use the Sandbox to test out large or complex edits before adding them to a page.
Register an account to keep track of your contributions.


Main page sections: Top · Flex · Bottom · Featured. Changes for the main page can be proposed here.

--
-- INTRO:   (!!! DO NOT RENAME THIS PAGE !!!)
--    This module allows any template or module to be copy/pasted between
--    wikis without any translation changes. All translation text is stored
--    in the global  Data:*.tab  pages on Commons, and used everywhere.
--
-- SEE:   https://www.mediawiki.org/wiki/Multilingual_Templates_and_Modules
--
-- ATTENTION:
--    Please do NOT rename this module - it has to be identical on all wikis.
--    This code is maintained at https://www.mediawiki.org/wiki/Module:TNT
--    Please do not modify it anywhere else, as it may get copied and override your changes.
--    Suggestions can be made at https://www.mediawiki.org/wiki/Module_talk:TNT
--
-- DESCRIPTION:
--    The "msg" function uses a Commons dataset to translate a message
--    with a given key (e.g. source-table), plus optional arguments
--    to the wiki markup in the current content language.
--    Use lang=xx to set language.  Example:
--
--    {{#invoke:TNT | msg
--     | I18n/Template:Graphs.tab  <!-- https://commons.wikimedia.org/wiki/Data:I18n/Template:Graphs.tab -->
--     | source-table              <!-- uses a translation message with id = "source-table" -->
--     | param1 }}                 <!-- optional parameter -->
--
--
--    The "doc" function will generate the <templatedata> parameter documentation for templates.
--    This way all template parameters can be stored and localized in a single Commons dataset.
--    NOTE: "doc" assumes that all documentation is located in Data:Templatedata/* on Commons.
--
--    {{#invoke:TNT | doc | Graph:Lines }}
--        uses https://commons.wikimedia.org/wiki/Data:Templatedata/Graph:Lines.tab
--        if the current page is Template:Graph:Lines/doc
--

local p = {}
local i18nDataset = 'I18n/Module:TNT.tab'

-- Forward declaration of the local functions
local sanitizeDataset, loadData, link, formatMessage

function p.msg(frame)
	local dataset, id
	local params = {}
	local lang = nil
	for k, v in pairs(frame.args) do
		if k == 1 then
			dataset = mw.text.trim(v)
		elseif k == 2 then
			id = mw.text.trim(v)
		elseif type(k) == 'number' then
			table.insert(params, mw.text.trim(v))
		elseif k == 'lang' and v ~= '_' then
			lang = mw.text.trim(v)
		end
	end
	return formatMessage(dataset, id, params, lang)
end

-- Identical to p.msg() above, but used from other lua modules
-- Parameters:  name of dataset, message key, optional arguments
-- Example with 2 params:  format('I18n/Module:TNT', 'error_bad_msgkey', 'my-key', 'my-dataset')
function p.format(dataset, key, ...)
	local checkType = require('libraryUtil').checkType
	checkType('format', 1, dataset, 'string')
	checkType('format', 2, key, 'string')
	return formatMessage(dataset, key, {...})
end


-- Identical to p.msg() above, but used from other lua modules with the language param
-- Parameters:  language code, name of dataset, message key, optional arguments
-- Example with 2 params:  formatInLanguage('es', I18n/Module:TNT', 'error_bad_msgkey', 'my-key', 'my-dataset')
function p.formatInLanguage(lang, dataset, key, ...)
	local checkType = require('libraryUtil').checkType
	checkType('formatInLanguage', 1, lang, 'string')
	checkType('formatInLanguage', 2, dataset, 'string')
	checkType('formatInLanguage', 3, key, 'string')
	return formatMessage(dataset, key, {...}, lang)
end

-- Obsolete function that adds a 'c:' prefix to the first param.
-- "Sandbox/Sample.tab" -> 'c:Data:Sandbox/Sample.tab'
function p.link(frame)
	return link(frame.args[1])
end

function p.doc(frame)
	local dataset = 'Templatedata/' .. sanitizeDataset(frame.args[1])
	return frame:extensionTag('templatedata', p.getTemplateData(dataset)) ..
		   formatMessage(i18nDataset, 'edit_doc', {link(dataset)})
end

function p.getTemplateData(dataset)
	-- TODO: add '_' parameter once lua starts reindexing properly for "all" languages
	local data = loadData(dataset)
	local names = {}
	for _, field in pairs(data.schema.fields) do
		table.insert(names, field.name)
	end

	local params = {}
	local paramOrder = {}
	for _, row in pairs(data.data) do
		local newVal = {}
		local name = nil
		for pos, val in pairs(row) do
			local columnName = names[pos]
			if columnName == 'name' then
				name = val
			else
				newVal[columnName] = val
			end
		end
		if name then
			params[name] = newVal
			table.insert(paramOrder, name)
		end
	end

	-- Work around json encoding treating {"1":{...}} as an [{...}]
	params['zzz123']=''

	local json = mw.text.jsonEncode({
		params=params,
		paramOrder=paramOrder,
		description=data.description
	})

	json = string.gsub(json,'"zzz123":"",?', "")

	return json
end

-- Local functions

sanitizeDataset = function(dataset)
	if not dataset then
		return nil
	end
	dataset = mw.text.trim(dataset)
	if dataset == '' then
		return nil
	elseif string.sub(dataset,-4) ~= '.tab' then
		return dataset .. '.tab'
	else
		return dataset
	end
end

loadData = function(dataset, lang)
	dataset = sanitizeDataset(dataset)
	if not dataset then
		error(formatMessage(i18nDataset, 'error_no_dataset', {}))
	end

	-- Give helpful error to thirdparties who try and copy this module.
	if not mw.ext or not mw.ext.data or not mw.ext.data.get then
		error('Missing JsonConfig extension; Cannot load https://commons.wikimedia.org/wiki/Data:' .. dataset)
	end

	local data = mw.ext.data.get(dataset, lang)

	if data == false then
		if dataset == i18nDataset then
			-- Prevent cyclical calls
			error('Missing Commons dataset ' .. i18nDataset)
		else
			error(formatMessage(i18nDataset, 'error_bad_dataset', {link(dataset)}))
		end
	end
	return data
end

-- Given a dataset name, convert it to a title with the 'commons:data:' prefix
link = function(dataset)
	return 'c:Data:' .. mw.text.trim(dataset or '')
end

formatMessage = function(dataset, key, params, lang)
	for _, row in pairs(loadData(dataset, lang).data) do
		local id, msg = unpack(row)
		if id == key then
			local result = mw.message.newRawMessage(msg, unpack(params or {}))
			return result:plain()
		end
	end
	if dataset == i18nDataset then
		-- Prevent cyclical calls
		error('Invalid message key "' .. key .. '"')
	else
		error(formatMessage(i18nDataset, 'error_bad_msgkey', {key, link(dataset)}))
	end
end

return p