<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://fictionbase.org/mw/index.php?action=history&amp;feed=atom&amp;title=Module%3AStoryCard</id>
	<title>Module:StoryCard - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://fictionbase.org/mw/index.php?action=history&amp;feed=atom&amp;title=Module%3AStoryCard"/>
	<link rel="alternate" type="text/html" href="https://fictionbase.org/mw/index.php?title=Module:StoryCard&amp;action=history"/>
	<updated>2026-05-02T14:43:14Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://fictionbase.org/mw/index.php?title=Module:StoryCard&amp;diff=16&amp;oldid=prev</id>
		<title>SuperHamster: Creating</title>
		<link rel="alternate" type="text/html" href="https://fictionbase.org/mw/index.php?title=Module:StoryCard&amp;diff=16&amp;oldid=prev"/>
		<updated>2026-03-03T08:41:19Z</updated>

		<summary type="html">&lt;p&gt;Creating&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s)&lt;br /&gt;
	if s == nil then return nil end&lt;br /&gt;
	s = tostring(s)&lt;br /&gt;
	s = mw.text.trim(s)&lt;br /&gt;
	if s == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	return s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function split_semicolons(s)&lt;br /&gt;
	s = trim(s)&lt;br /&gt;
	if not s then return {} end&lt;br /&gt;
	local parts = mw.text.split(s, &amp;quot;%s*;%s*&amp;quot;, false)&lt;br /&gt;
	local out = {}&lt;br /&gt;
	for _, part in ipairs(parts) do&lt;br /&gt;
		part = trim(part)&lt;br /&gt;
		if part then table.insert(out, part) end&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeNsLink(ns, label)&lt;br /&gt;
	label = trim(label)&lt;br /&gt;
	if not label then return nil end&lt;br /&gt;
	local target = mw.ustring.gsub(label, &amp;quot;%s+&amp;quot;, &amp;quot;_&amp;quot;)&lt;br /&gt;
	return string.format(&amp;quot;[[%s:%s|%s]]&amp;quot;, ns, target, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function safeInt(s)&lt;br /&gt;
	s = trim(s)&lt;br /&gt;
	if not s then return nil end&lt;br /&gt;
	s = mw.ustring.gsub(s, &amp;quot;[^0-9]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	if s == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	return tonumber(s)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function fmtWords(n)&lt;br /&gt;
	if not n then return nil end&lt;br /&gt;
	local s = tostring(n)&lt;br /&gt;
	local out = s:reverse():gsub(&amp;quot;(%d%d%d)&amp;quot;, &amp;quot;%1,&amp;quot;):reverse()&lt;br /&gt;
	if out:sub(1,1) == &amp;quot;,&amp;quot; then out = out:sub(2) end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function addChips(container, raw, ns, maxItems)&lt;br /&gt;
	local items = split_semicolons(raw)&lt;br /&gt;
	if #items == 0 then return end&lt;br /&gt;
	local shown = 0&lt;br /&gt;
	for _, item in ipairs(items) do&lt;br /&gt;
		if maxItems and shown &amp;gt;= maxItems then break end&lt;br /&gt;
		local w = makeNsLink(ns, item) or item&lt;br /&gt;
		container:tag(&amp;quot;span&amp;quot;):addClass(&amp;quot;storycard-chip&amp;quot;):wikitext(w)&lt;br /&gt;
		shown = shown + 1&lt;br /&gt;
	end&lt;br /&gt;
	local remaining = #items - shown&lt;br /&gt;
	if remaining &amp;gt; 0 then&lt;br /&gt;
		container:tag(&amp;quot;span&amp;quot;):addClass(&amp;quot;storycard-chip storycard-chip-muted&amp;quot;):wikitext(&amp;quot;+&amp;quot; .. tostring(remaining))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
	local title = trim(args.title) or &amp;quot;Untitled&amp;quot;&lt;br /&gt;
	local page = trim(args.page)&lt;br /&gt;
	local author = trim(args.author)&lt;br /&gt;
	local publication = trim(args.publication)&lt;br /&gt;
	local year = trim(args.year)&lt;br /&gt;
	local words = fmtWords(safeInt(args.words))&lt;br /&gt;
&lt;br /&gt;
	local root = mw.html.create(&amp;quot;div&amp;quot;):addClass(&amp;quot;storycard&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local titleNode = root:tag(&amp;quot;div&amp;quot;):addClass(&amp;quot;storycard-title&amp;quot;)&lt;br /&gt;
	if page then&lt;br /&gt;
		titleNode:wikitext(string.format(&amp;quot;[[%s|%s]]&amp;quot;, page, title))&lt;br /&gt;
	else&lt;br /&gt;
		titleNode:wikitext(title)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local meta = root:tag(&amp;quot;div&amp;quot;):addClass(&amp;quot;storycard-meta&amp;quot;)&lt;br /&gt;
	if author then&lt;br /&gt;
		meta:tag(&amp;quot;span&amp;quot;):addClass(&amp;quot;storycard-metaitem&amp;quot;):wikitext(makeNsLink(&amp;quot;Author&amp;quot;, author) or author)&lt;br /&gt;
	end&lt;br /&gt;
	if publication then&lt;br /&gt;
		meta:tag(&amp;quot;span&amp;quot;):addClass(&amp;quot;storycard-metaitem&amp;quot;):wikitext(makeNsLink(&amp;quot;Publication&amp;quot;, publication) or publication)&lt;br /&gt;
	end&lt;br /&gt;
	if year then&lt;br /&gt;
		meta:tag(&amp;quot;span&amp;quot;):addClass(&amp;quot;storycard-metaitem&amp;quot;):wikitext(makeNsLink(&amp;quot;Year&amp;quot;, year) or year)&lt;br /&gt;
	end&lt;br /&gt;
	if words then&lt;br /&gt;
		meta:tag(&amp;quot;span&amp;quot;):addClass(&amp;quot;storycard-metaitem&amp;quot;):wikitext(words .. &amp;quot; words&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local chips = root:tag(&amp;quot;div&amp;quot;):addClass(&amp;quot;storycard-chips&amp;quot;)&lt;br /&gt;
	addChips(chips, args.genres, &amp;quot;Genre&amp;quot;, 3)&lt;br /&gt;
	addChips(chips, args.tags, &amp;quot;Tag&amp;quot;, 4)&lt;br /&gt;
&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>SuperHamster</name></author>
	</entry>
</feed>