Module:Section link

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.

-- This module implements {{section link}}.
require('Module:No globals');

local checkType = require('libraryUtil').checkType

local p = {}

local function makeSectionLink(page, section, display)
	display = display or section
	page = page or ''
	-- MediaWiki doesn't allow these in `page`, so only need to do for `section`
	if type(section) == 'string' then
		section = string.gsub(section, "{", "{")
		section = string.gsub(section, "}", "}")
	end
	return string.format('[[%s#%s|%s]]', page, section, display)
end

local function normalizeTitle(title)
	title = mw.ustring.gsub(mw.ustring.gsub(title, "'", ""), '"', '')
	title = mw.ustring.gsub(title, "%b<>", "")
	return mw.title.new(title).prefixedText
end

function p._main(page, sections, options, title)
	-- Validate input.
	checkType('_main', 1, page, 'string', true)
	checkType('_main', 3, options, 'table', true)
	if sections == nil then
		sections = {}
	elseif type(sections) == 'string' then
		sections = {sections}
	elseif type(sections) ~= 'table' then
		error(string.format(
			"type error in argument #2 to '_main' " ..
			"(string, table or nil expected, got %s)",
			type(sections)
		), 2)
	end
	options = options or {}
	title = title or mw.title.getCurrentTitle()

	-- Deal with blank page names elegantly
	if page and not page:find('%S') then
		page = nil
		options.nopage = true
	end

	-- Make the link(s).
	local isShowingPage = not options.nopage
	if #sections <= 1 then
		local linkPage = page or ''
		local section = sections[1] or 'Notes'
		local display = '§&nbsp;' .. section
		if isShowingPage then
			page = page or title.prefixedText
			if options.display and options.display ~= '' then
				if normalizeTitle(options.display) == normalizeTitle(page) then
					display = options.display .. ' ' .. display
				else
					error(string.format(
						'Display title "%s" was ignored since it is ' ..
						"not equivalent to the page's actual title",
						options.display
					), 0)
				end
			else
				display = page .. ' ' .. display
			end
		end
		return makeSectionLink(linkPage, section, display)
	else
		-- Multiple sections. First, make a list of the links to display.
		local ret = {}
		for i, section in ipairs(sections) do
			ret[i] = makeSectionLink(page, section)
		end

		-- Assemble the list of links into a string with mw.text.listToText.
		-- We use the default separator for mw.text.listToText, but a custom
		-- conjunction. There is also a special case conjunction if we only
		-- have two links.
		local conjunction
		if #sections == 2 then
			conjunction = '&#8203; and '
		else
			conjunction = ', and '
		end
		ret = mw.text.listToText(ret, nil, conjunction)

		-- Add the intro text.
		local intro = '§§&nbsp;'
		if isShowingPage then
			intro = (page or title.prefixedText) .. ' ' .. intro
		end
		ret = intro .. ret

		return ret
	end
end

function p.main(frame)
	local yesno = require('Module:Yesno')
	local args = require('Module:Arguments').getArgs(frame, {
		wrappers = 'Template:Section link',
		valueFunc = function (key, value)
			value = value:match('^%s*(.-)%s*$') -- Trim whitespace
			-- Allow blank first parameters, as the wikitext template does this.
			if value ~= '' or key == 1 then
				return value
			end
		end
	})

	for k, v in pairs(args) do													-- replace underscores in the positional parameter values
		if 'number' == type(k) then
			if not yesno (args['keep-underscores']) then						-- unless |keep-underscores=yes
				args[k] = mw.uri.decode (v, 'WIKI');							-- percent-decode; replace underscores with space characters
			else
				args[k] = mw.uri.decode (v, 'PATH');							-- percent-decode; retain underscores
			end
		end
	end

	-- Sort the arguments.
	local page
	local sections, options = {}, {}
	for k, v in pairs(args) do
		if k == 1 then
			-- Doing this in the loop because of a bug in [[Module:Arguments]]
			-- when using pairs with deleted arguments.
			page = mw.text.decode(v, true)
		elseif type(k) == 'number' then
			sections[k] = v
		else
			options[k] = v
		end
	end
	
	options.nopage = yesno (options.nopage);									-- make boolean
	
	-- Extract section from page, if present
	if page then
		local p, s = page:match('^(.-)#(.*)$')
		if p then page, sections[1] = p, s end
	end

	-- Compress the sections array.
	local function compressArray(t)
		local nums, ret = {}, {}
		for num in pairs(t) do
			nums[#nums + 1] = num
		end
		table.sort(nums)
		for i, num in ipairs(nums) do
			ret[i] = t[num]
		end
		return ret
	end
	sections = compressArray(sections)

	return p._main(page, sections, options)
end

return p