Editing Module:Citation/CS1/COinS

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

Latest revision Your text
Line 1: Line 1:
  +
--[[
  +
History of changes since last sync: 2015-12-12
  +
 
]]
  +
  +
local coins = {};
  +
   
 
--[[--------------------------< F O R W A R D D E C L A R A T I O N S >--------------------------------------
 
--[[--------------------------< F O R W A R D D E C L A R A T I O N S >--------------------------------------
 
]]
 
]]
   
local is_set, in_array, remove_wiki_link, strip_apostrophe_markup; -- functions in Module:Citation/CS1/Utilities
+
local is_set, in_array, remove_wiki_link; -- functions in Module:Citation/CS1/Utilities
   
 
local cfg; -- table of configuration tables that are defined in Module:Citation/CS1/Configuration
 
local cfg; -- table of configuration tables that are defined in Module:Citation/CS1/Configuration
  +
  +
 
--[[--------------------------< S T R I P _ A P O S T R O P H E _ M A R K U P >--------------------------------
  +
  +
Strip wiki italic and bold markup from argument so that it doesn't contaminate COinS metadata.
  +
This function strips common patterns of apostrophe markup. We presume that editors who have taken the time to
  +
markup a title have, as a result, provided valid markup. When they don't, some single apostrophes are left behind.
  +
 
]]
  +
 
local function strip_apostrophe_markup (argument)
  +
if not is_set (argument) then return argument; end
  +
  +
if argument:find ( "''", 1, true ) == nil then -- Is there at least one double apostrophe? If not, exit.
 
return argument;
 
end
  +
  +
while true do
  +
if argument:find ( "'''''", 1, true ) then -- bold italic (5)
 
argument=argument:gsub("%'%'%'%'%'", ""); -- remove all instances of it
  +
elseif argument:find ( "''''", 1, true ) then -- italic start and end without content (4)
  +
argument=argument:gsub("%'%'%'%'", "");
  +
elseif argument:find ( "'''", 1, true ) then -- bold (3)
  +
argument=argument:gsub("%'%'%'", "");
  +
elseif argument:find ( "''", 1, true ) then -- italic (2)
  +
argument=argument:gsub("%'%'", "");
  +
else
  +
break;
 
end
  +
end
  +
return argument; -- done
  +
end
   
   
Line 12: Line 51:
 
Makes a title for COinS from Title and / or ScriptTitle (or any other name-script pairs)
 
Makes a title for COinS from Title and / or ScriptTitle (or any other name-script pairs)
   
Apostrophe markup (bold, italics) is stripped from each value so that the COinS metadata isn't corrupted with strings
+
Apostrophe markup (bold, italics) is stripped from each value so that the COinS metadata isn't correupted with strings
 
of %27%27...
 
of %27%27...
   
Line 33: Line 72:
 
end
 
end
 
return title .. script; -- return the concatenation
 
return title .. script; -- return the concatenation
end
 
 
 
--[[--------------------------< E S C A P E _ L U A _ M A G I C _ C H A R S >----------------------------------
 
 
Returns a string where all of lua's magic characters have been escaped. This is important because functions like
 
string.gsub() treat their pattern and replace strings as patterns, not literal strings.
 
]]
 
 
local function escape_lua_magic_chars (argument)
 
argument = argument:gsub("%%", "%%%%"); -- replace % with %%
 
argument = argument:gsub("([%^%$%(%)%.%[%]%*%+%-%?])", "%%%1"); -- replace all other lua magic pattern characters
 
return argument;
 
 
end
 
end
   
Line 95: Line 121:
   
 
local function coins_replace_math_stripmarker (value)
 
local function coins_replace_math_stripmarker (value)
local stripmarker = cfg.stripmarkers['math'];
+
local stripmarker = '\127UNIQ%-%-math%-[%a%d]+%-QINU\127'; -- math stripmarker pattern
 
local rendering = value:match (stripmarker); -- is there a math stripmarker
 
local rendering = value:match (stripmarker); -- is there a math stripmarker
   
Line 122: Line 148:
 
Cleanup parameter values for the metadata by removing or replacing invisible characters and certain html entities.
 
Cleanup parameter values for the metadata by removing or replacing invisible characters and certain html entities.
   
2015-12-10: there is a bug in mw.text.unstripNoWiki (). It replaces math stripmarkers with the appropriate content
+
2015-12-10: there is a bug in mw.text.unstripNoWiki (). It replaced math stripmarkers with the appropriate content
 
when it shouldn't. See https://phabricator.wikimedia.org/T121085 and Wikipedia_talk:Lua#stripmarkers_and_mw.text.unstripNoWiki.28.29
 
when it shouldn't. See https://phabricator.wikimedia.org/T121085 and Wikipedia_talk:Lua#stripmarkers_and_mw.text.unstripNoWiki.28.29
   
Line 132: Line 158:
 
local function coins_cleanup (value)
 
local function coins_cleanup (value)
 
local replaced = true; -- default state to get the do loop running
 
local replaced = true; -- default state to get the do loop running
  +
 
 
while replaced do -- loop until all math stripmarkers replaced
 
while replaced do -- loop until all math stripmarkers replaced
 
replaced, value = coins_replace_math_stripmarker (value); -- replace math stripmarker with text representation of the equation
 
replaced, value = coins_replace_math_stripmarker (value); -- replace math stripmarker with text representation of the equation
 
end
 
end
   
value = value:gsub (cfg.stripmarkers['math'], "MATH RENDER ERROR"); -- one or more couldn't be replaced; insert vague error message
+
value = value:gsub ('\127UNIQ%-%-math%-[%a%d]+%-QINU\127', "MATH RENDER ERROR"); -- one or more couldn't be replaced; insert vague error message
 
 
 
value = mw.text.unstripNoWiki (value); -- replace nowiki stripmarkers with their content
 
value = mw.text.unstripNoWiki (value); -- replace nowiki stripmarkers with their content
value = value:gsub ('<span class="nowrap" style="padding%-left:0%.1em;">&#39;(s?)</span>', "'%1"); -- replace {{'}} or {{'s}} with simple apostrophe or apostrophe-s
+
value = value:gsub ('<span class="nowrap" style="padding%-left:0%.1em;">&#39;s</span>', "'s"); -- replace {{'s}} template with simple apostrophe-s
  +
value = value:gsub ('&zwj;\226\128\138\039\226\128\139', "'"); -- replace {{'}} with simple apostrophe
  +
value = value:gsub ('\226\128\138\039\226\128\139', "'"); -- replace {{'}} with simple apostrophe (as of 2015-12-11)
 
value = value:gsub ('&nbsp;', ' '); -- replace &nbsp; entity with plain space
 
value = value:gsub ('&nbsp;', ' '); -- replace &nbsp; entity with plain space
 
value = value:gsub ('\226\128\138', ' '); -- replace hair space with plain space
 
value = value:gsub ('\226\128\138', ' '); -- replace hair space with plain space
  +
value = value:gsub ('&zwj;', ''); -- remove &zwj; entities
if not mw.ustring.find (value, cfg.indic_script) then -- don't remove zero width joiner characters from indic script
 
value = value:gsub ('&zwj;', ''); -- remove &zwj; entities
+
value = value:gsub ('[\226\128\141\226\128\139]', '') -- remove zero-width joiner, zero-width space
value = mw.ustring.gsub (value, '[\226\128\141\226\128\139\194\173]', ''); -- remove zero-width joiner, zero-width space, soft hyphen
+
value = value:gsub ('[\194\173\009\010\013]', ' '); -- replace soft hyphen, horizontal tab, line feed, carriage return with plain space
end
 
value = value:gsub ('[\009\010\013]', ' '); -- replace horizontal tab, line feed, carriage return with plain space
 
 
return value;
 
return value;
 
end
 
end
Line 180: Line 206:
 
});
 
});
 
 
if in_array (class, {'arxiv', 'biorxiv', 'citeseerx', 'ssrn', 'journal', 'news', 'magazine'}) or (in_array (class, {'conference', 'interview', 'map', 'press release', 'web'}) and is_set(data.Periodical)) or
+
if in_array (class, {'arxiv', 'journal', 'news'}) or (in_array (class, {'conference', 'interview', 'map', 'press release', 'web'}) and is_set(data.Periodical)) or
 
('citation' == class and is_set(data.Periodical) and not is_set (data.Encyclopedia)) then
 
('citation' == class and is_set(data.Periodical) and not is_set (data.Encyclopedia)) then
 
OCinSoutput.rft_val_fmt = "info:ofi/fmt:kev:mtx:journal"; -- journal metadata identifier
 
OCinSoutput.rft_val_fmt = "info:ofi/fmt:kev:mtx:journal"; -- journal metadata identifier
if in_array (class, {'arxiv', 'biorxiv', 'citeseerx', 'ssrn'}) then -- set genre according to the type of citation template we are rendering
+
if 'arxiv' == class then -- set genre according to the type of citation template we are rendering
OCinSoutput["rft.genre"] = "preprint"; -- cite arxiv, cite biorxiv, cite citeseerx, cite ssrn
+
OCinSoutput["rft.genre"] = "preprint"; -- cite arxiv
 
elseif 'conference' == class then
 
elseif 'conference' == class then
 
OCinSoutput["rft.genre"] = "conference"; -- cite conference (when Periodical set)
 
OCinSoutput["rft.genre"] = "conference"; -- cite conference (when Periodical set)
Line 208: Line 234:
 
elseif 'conference' == class then -- cite conference when Periodical not set
 
elseif 'conference' == class then -- cite conference when Periodical not set
 
OCinSoutput["rft.genre"] = "conference";
 
OCinSoutput["rft.genre"] = "conference";
OCinSoutput["rft.atitle"] = data.Chapter; -- conference paper as chapter in proceedings (book)
 
 
elseif in_array (class, {'book', 'citation', 'encyclopaedia', 'interview', 'map'}) then
 
elseif in_array (class, {'book', 'citation', 'encyclopaedia', 'interview', 'map'}) then
 
if is_set (data.Chapter) then
 
if is_set (data.Chapter) then
Line 240: Line 265:
 
 
 
for k, v in pairs( data.ID_list ) do -- what to do about these? For now assume that they are common to all?
 
for k, v in pairs( data.ID_list ) do -- what to do about these? For now assume that they are common to all?
  +
-- if k == 'ISBN' then v = clean_isbn( v ) end
 
if k == 'ISBN' then v = v:gsub( "[^-0-9X]", "" ); end
 
if k == 'ISBN' then v = v:gsub( "[^-0-9X]", "" ); end
 
local id = cfg.id_handlers[k].COinS;
 
local id = cfg.id_handlers[k].COinS;
Line 251: Line 277:
 
end
 
end
   
  +
--[[
  +
for k, v in pairs( data.ID_list ) do -- what to do about these? For now assume that they are common to all?
  +
local id, value = cfg.id_handlers[k].COinS;
  +
if k == 'ISBN' then value = clean_isbn( v ); else value = v; end
  +
if string.sub( id or "", 1, 4 ) == 'info' then
  +
OCinSoutput["rft_id"] = table.concat{ id, "/", v };
  +
else
  +
OCinSoutput[ id ] = value;
  +
end
  +
end
  +
]]
 
local last, first;
 
local last, first;
 
for k, v in ipairs( data.Authors ) do
 
for k, v in ipairs( data.Authors ) do
Line 275: Line 312:
 
 
 
-- sort with version string always first, and combine.
 
-- sort with version string always first, and combine.
--table.sort( OCinSoutput );
+
table.sort( OCinSoutput );
 
table.insert( OCinSoutput, 1, "ctx_ver=" .. ctx_ver ); -- such as "Z39.88-2004"
 
table.insert( OCinSoutput, 1, "ctx_ver=" .. ctx_ver ); -- such as "Z39.88-2004"
 
return table.concat(OCinSoutput, "&");
 
return table.concat(OCinSoutput, "&");
Line 290: Line 327:
 
cfg = cfg_table_ptr;
 
cfg = cfg_table_ptr;
   
is_set = utilities_page_ptr.is_set; -- import functions from selected Module:Citation/CS1/Utilities module
+
is_set = utilities_page_ptr.is_set; -- import functions from select Module:Citation/CS1/Utilities module
 
in_array = utilities_page_ptr.in_array;
 
in_array = utilities_page_ptr.in_array;
 
remove_wiki_link = utilities_page_ptr.remove_wiki_link;
 
remove_wiki_link = utilities_page_ptr.remove_wiki_link;
strip_apostrophe_markup = utilities_page_ptr.strip_apostrophe_markup;
 
 
end
 
end
   
   
--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
 
]]
 
   
 
return {
 
return {
Please note that all contributions to Climate Change AI Wiki are considered to be released under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) (see Climate Change AI Wiki:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!
Cancel Editing help (opens in new window)

Template used on this page: