Difference between revisions of "Module:Ruby"
Dinoguy1000 (talk | contribs) (from sandbox - allow arbitrary markup in/around the ruby markup) |
Dinoguy1000 (talk | contribs) m (Protected "Module:Ruby": High traffic page ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))) |
||
(3 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
+ | -- <pre> | ||
local p = {} | local p = {} | ||
function p.split( frame ) | function p.split( frame ) | ||
− | + | -- | |
− | + | -- implements {{Ruby/split}} | |
− | + | -- | |
+ | local args | ||
+ | if frame == mw.getCurrentFrame() then | ||
+ | args = frame:getParent().args | ||
+ | else | ||
+ | args = frame | ||
+ | end | ||
+ | if not args[1] then | ||
+ | return -- nothing was passed to the module | ||
+ | end | ||
− | + | args[1] = mw.text.trim( args[1] ) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | if not mw.ustring.find( args[1], '<ruby' ) then | |
+ | return args[1] -- if there's no Ruby markup in the input, just return it | ||
+ | end | ||
− | + | args[2] = args[2] and ( mw.text.trim( args[2] ) == 'base' and '' or mw.text.trim( args[2] ) ) or '' | |
− | |||
− | |||
− | + | local first, parts, match | |
+ | first = mw.ustring.match( args[1], '^(.-)<ruby' ) or '' -- grab anything before the first <ruby> tag since otherwise it'll be lost | ||
+ | parts = mw.text.split( args[1], '<ruby' ) | ||
+ | match = args[2] == '' and '<rb[^>]*>(.-)</rb>' or '<rt[^>]*>(.-)</rt>' | ||
− | + | for i = 1, #parts do | |
− | + | parts[i] = ( mw.ustring.match( parts[i], match ) or '' ) | |
− | + | .. ( mw.ustring.match( parts[i], '</ruby>(.*)$' ) or '' ) -- grab anything between </ruby> and the next <ruby> (or the end of the string, if this is the last part) | |
− | + | end | |
− | + | return first, table.concat( parts, '' ) | |
− | |||
− | |||
− | |||
− | |||
− | |||
end | end | ||
return p | return p | ||
+ | -- </pre> |
Revision as of 01:38, 13 June 2019
-- <pre>
local p = {}
function p.split( frame )
--
-- implements {{Ruby/split}}
--
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
else
args = frame
end
if not args[1] then
return -- nothing was passed to the module
end
args[1] = mw.text.trim( args[1] )
if not mw.ustring.find( args[1], '<ruby' ) then
return args[1] -- if there's no Ruby markup in the input, just return it
end
args[2] = args[2] and ( mw.text.trim( args[2] ) == 'base' and '' or mw.text.trim( args[2] ) ) or ''
local first, parts, match
first = mw.ustring.match( args[1], '^(.-)<ruby' ) or '' -- grab anything before the first <ruby> tag since otherwise it'll be lost
parts = mw.text.split( args[1], '<ruby' )
match = args[2] == '' and '<rb[^>]*>(.-)</rb>' or '<rt[^>]*>(.-)</rt>'
for i = 1, #parts do
parts[i] = ( mw.ustring.match( parts[i], match ) or '' )
.. ( mw.ustring.match( parts[i], '</ruby>(.*)$' ) or '' ) -- grab anything between </ruby> and the next <ruby> (or the end of the string, if this is the last part)
end
return first, table.concat( parts, '' )
end
return p
-- </pre>