Module:String2: Difference between revisions

From the Croc Wiki, the Croc encyclopedia
Jump to navigationJump to search
Content added Content deleted
(added function "label" which capitalize only first letter for fetched wikidata labels d:Help:Label#Capitalization. Almost same as "sentence" function except that "label" doesn't lowering the rest of text.)
(update from sandbox -- fix for when the text passed is an html list)
Line 13: Line 13:
p.sentence = function (frame )
p.sentence = function (frame )
local s = mw.text.trim( frame.args[1] or "" )
local s = mw.text.trim( frame.args[1] or "" )
local s1 = ""
-- if it's a list chop off and (store as s1) everything up to the first <li>
local lipos = string.find(s, "<li>" )
if lipos then
s1 = string.sub(s, 1, lipos + 3)
s = string.sub(s, lipos + 4)
end
-- s1 is either "" or the first part of the list markup, so we can continue
-- and prepend s1 to the returned string
if string.find(s, "^%[%[[^|]+|[^%]]+%]%]") then
if string.find(s, "^%[%[[^|]+|[^%]]+%]%]") then
-- this is a piped wikilink, so we capitalise the text, not the pipe
-- this is a piped wikilink, so we capitalise the text, not the pipe
local b, c = string.find(s, "|%A*%a") -- find the first letter after the pipe
local b, c = string.find(s, "|%A*%a") -- find the first letter after the pipe
return string.sub(s, 1, c-1) .. string.upper(string.sub(s, c, c)) .. string.sub(s, c+1)
return s1 .. string.sub(s, 1, c-1) .. string.upper(string.sub(s, c, c)) .. string.sub(s, c+1)
end
end
local letterpos = string.find(s, '%a')
local letterpos = string.find(s, '%a')
Line 23: Line 32:
local letter = string.sub(s, letterpos, letterpos)
local letter = string.sub(s, letterpos, letterpos)
local rest = string.sub(s, letterpos + 1)
local rest = string.sub(s, letterpos + 1)
return first .. string.upper(letter) .. string.lower(rest)
return s1 .. first .. string.upper(letter) .. string.lower(rest)
else
else
return s
return s1 .. s
end
end
end
end

Revision as of 19:59, February 23, 2018

Documentation for this module may be created at Module:String2/doc

local p = {}

p.upper = function(frame)
	local s = mw.text.trim(frame.args[1] or "")
	return string.upper(s)
end

p.lower = function(frame)
	local s = mw.text.trim(frame.args[1] or "")
	return string.lower(s)
end

p.sentence = function (frame )
	local s =  mw.text.trim( frame.args[1] or "" )
	local s1 = ""
	-- if it's a list chop off and (store as s1) everything up to the first <li>
	local lipos = string.find(s, "<li>" )
	if lipos then
		s1 = string.sub(s, 1, lipos + 3)
		s = string.sub(s, lipos + 4)
	end
	-- s1 is either "" or the first part of the list markup, so we can continue
	-- and prepend s1 to the returned string
	if string.find(s, "^%[%[[^|]+|[^%]]+%]%]") then
		-- this is a piped wikilink, so we capitalise the text, not the pipe
		local b, c = string.find(s, "|%A*%a") -- find the first letter after the pipe
		return s1 .. string.sub(s, 1, c-1) .. string.upper(string.sub(s, c, c)) .. string.sub(s, c+1)
	end
	local letterpos = string.find(s, '%a')
	if letterpos then
		local first = string.sub(s, 1, letterpos - 1)
		local letter = string.sub(s, letterpos, letterpos)
		local rest = string.sub(s, letterpos + 1)
		return s1 .. first .. string.upper(letter) .. string.lower(rest)
	else
		return s1 .. s
	end
end

p.title = function (frame )
	-- http://grammar.yourdictionary.com/capitalization/rules-for-capitalization-in-titles.html
	-- recommended by The U.S. Government Printing Office Style Manual:
	-- "Capitalize all words in titles of publications and documents,
	-- except a, an, the, at, by, for, in, of, on, to, up, and, as, but, or, and nor."
	local alwayslower = {['a'] = 1, ['an'] = 1, ['the'] = 1, 
		['and'] = 1, ['but'] = 1, ['or'] = 1, ['for'] = 1,
		['nor'] = 1, ['on'] = 1, ['in'] = 1, ['at'] = 1, ['to'] = 1,
		['from'] = 1, ['by'] = 1, ['of'] = 1, ['up'] = 1 }
	local res = ''
	local s =  mw.text.trim( frame.args[1] or "" )
	local words = mw.text.split( s, " ")
	for i, s in ipairs(words) do
		s = string.lower( s )
		if( i > 1 ) then
			if( alwayslower[s] ~= 1 ) then
				s = mw.getContentLanguage():ucfirst(s)
			end
		else
			s = mw.getContentLanguage():ucfirst(s)
		end
		words[i] = s
	end
	return table.concat(words, " ")
end

p.label = function (frame )
	-- Capitalizing only first letter for fetched Wikidata labels.
	-- Wikidata English labels generally begin with a lowercase letter. [[:d:Help:Label#Capitalization]]
	local s =  mw.text.trim( frame.args[1] or "" )
	if string.find(s, "^%[%[[^|]+|[^%]]+%]%]") then
		-- this is a piped wikilink, so we capitalise the text, not the pipe
		local b, c = string.find(s, "|%A*%a") -- find the first letter after the pipe
		return string.sub(s, 1, c-1) .. string.upper(string.sub(s, c, c)) .. string.sub(s, c+1)
	end
	local letterpos = string.find(s, '%a')
	if letterpos then
		local first = string.sub(s, 1, letterpos - 1)
		local letter = string.sub(s, letterpos, letterpos)
		local rest = string.sub(s, letterpos + 1)
		return first .. string.upper(letter) .. rest
	else
		return s
	end
end

return p