<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="id">
	<id>https://wiki.javasatu.com/index.php?action=history&amp;feed=atom&amp;title=Modul%3AJapanese_calendar</id>
	<title>Modul:Japanese calendar - Riwayat revisi</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.javasatu.com/index.php?action=history&amp;feed=atom&amp;title=Modul%3AJapanese_calendar"/>
	<link rel="alternate" type="text/html" href="https://wiki.javasatu.com/index.php?title=Modul:Japanese_calendar&amp;action=history"/>
	<updated>2026-04-14T12:53:10Z</updated>
	<subtitle>Riwayat revisi halaman ini di wiki</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki.javasatu.com/index.php?title=Modul:Japanese_calendar&amp;diff=1806&amp;oldid=prev</id>
		<title>Adminjavasatu: ←Membuat halaman berisi '-- Modul ini mendefinikan klas &quot;era&quot; untuk memproses era dalam kalender Jepang. -- Juga memuat fungsi mengekspor properti klas ke #invoke.  local eras = mw.loadData( 'Module:Japanese calendar/data' ) local halfToFull = require( 'Module:Convert character width' ).full -- Converts half-width characters to full-width characters.  -------------------------------------------------------------------- -- Helper functions -------------------------------------------------...'</title>
		<link rel="alternate" type="text/html" href="https://wiki.javasatu.com/index.php?title=Modul:Japanese_calendar&amp;diff=1806&amp;oldid=prev"/>
		<updated>2023-09-21T13:10:50Z</updated>

		<summary type="html">&lt;p&gt;←Membuat halaman berisi &amp;#039;-- Modul ini mendefinikan klas &amp;quot;era&amp;quot; untuk memproses era dalam kalender Jepang. -- Juga memuat fungsi mengekspor properti klas ke #invoke.  local eras = mw.loadData( &amp;#039;Module:Japanese calendar/data&amp;#039; ) local halfToFull = require( &amp;#039;Module:Convert character width&amp;#039; ).full -- Converts half-width characters to full-width characters.  -------------------------------------------------------------------- -- Helper functions -------------------------------------------------...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Halaman baru&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Modul ini mendefinikan klas &amp;quot;era&amp;quot; untuk memproses era dalam kalender Jepang.&lt;br /&gt;
-- Juga memuat fungsi mengekspor properti klas ke #invoke.&lt;br /&gt;
&lt;br /&gt;
local eras = mw.loadData( 'Module:Japanese calendar/data' )&lt;br /&gt;
local halfToFull = require( 'Module:Convert character width' ).full -- Converts half-width characters to full-width characters.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function yearToEraIndex( year )&lt;br /&gt;
    year = tonumber( year )&lt;br /&gt;
    if type( year ) ~= 'number' then return end&lt;br /&gt;
    for i, t in ipairs( eras ) do&lt;br /&gt;
        if year &amp;gt; t.startYear then&lt;br /&gt;
            return i&lt;br /&gt;
        elseif year == t.startYear then&lt;br /&gt;
            if eras[ i + 1 ] and eras[ i + 1 ].startYear == t.startYear then -- This checks for occasions when there were more than two eras in the same year. At the moment, that only applies to the year 686.&lt;br /&gt;
                return i + 1&lt;br /&gt;
            else&lt;br /&gt;
                return i&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function textToEraIndex( s )&lt;br /&gt;
    if not s or s == '' then return end&lt;br /&gt;
    for i, t in ipairs( eras ) do&lt;br /&gt;
        if s == t.article or s == t.kanji then&lt;br /&gt;
            return i&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------&lt;br /&gt;
-- Era class definition&lt;br /&gt;
--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local era = {}&lt;br /&gt;
era.__index = era&lt;br /&gt;
&lt;br /&gt;
function era:new( init )&lt;br /&gt;
    init = type( init ) == 'table' and init or {}&lt;br /&gt;
    local obj = {}&lt;br /&gt;
    &lt;br /&gt;
    -- Grab the data from the init table.&lt;br /&gt;
    obj.gregorianYear = tonumber( init.year )&lt;br /&gt;
    local initText = type( init.era ) == 'string' and init.era or nil&lt;br /&gt;
    local initIndex = tonumber( init.index )&lt;br /&gt;
    if not ( initIndex and initIndex &amp;gt;= 1 and math.floor( initIndex ) == initIndex and initIndex ~= math.huge ) then -- Check that initIndex is a positive integer.&lt;br /&gt;
        initIndex = nil&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Calculate the era data from the input. First we find the era from the era index, although this is only supposed&lt;br /&gt;
    -- to be for internal use. Next we find the era from the era name or the kanji if possible, as this allows us to&lt;br /&gt;
    -- specify the last year of one era rather than the first year of the next one, if that is the desired behaviour.&lt;br /&gt;
    local eraIndex&lt;br /&gt;
    if initIndex then&lt;br /&gt;
        eraIndex = initIndex&lt;br /&gt;
    elseif initText then&lt;br /&gt;
        eraIndex = textToEraIndex( initText )&lt;br /&gt;
    elseif obj.gregorianYear then&lt;br /&gt;
        eraIndex = yearToEraIndex( obj.gregorianYear )&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- If the data entry was found for the era, process it and add it to the object.&lt;br /&gt;
    if not eraIndex then return end&lt;br /&gt;
    local eraData = eras[ eraIndex ]&lt;br /&gt;
    if not eraData or not eraData.article or eraData.article == '' then return end -- Exit if we are not dealing with a valid era.&lt;br /&gt;
    &lt;br /&gt;
    obj.startYear = eraData.startYear&lt;br /&gt;
    obj.endYear = eraData.endYear&lt;br /&gt;
    obj.article = eraData.article&lt;br /&gt;
    obj.kanji = eraData.kanji&lt;br /&gt;
    obj.label = eraData.label&lt;br /&gt;
    &lt;br /&gt;
    -- Create a link to the era article if possible.&lt;br /&gt;
    if obj.label and obj.article then&lt;br /&gt;
        obj.link = mw.ustring.format( '[[%s|%s]]', obj.article, obj.label )&lt;br /&gt;
    elseif obj.article then&lt;br /&gt;
        obj.link = mw.ustring.format( '[[%s]]', obj.article )&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Allow matching years to different eras, but only for the first year of the next era. For example, Taisho 15 is also Showa 1, but there is no such thing as Taisho 16.&lt;br /&gt;
    -- So, the code era:new{ year = 1926, era = &amp;quot;Taishō&amp;quot; } will return an object with an eraYear of 15, and era:new{ year = 1926 } will return an object with an eraYear of 1.&lt;br /&gt;
    local nextEraData = eras[ eraIndex - 1 ]&lt;br /&gt;
    local nextStartYear = nextEraData and nextEraData.startYear&lt;br /&gt;
    if obj.gregorianYear&lt;br /&gt;
        and ( -- If there is a later era, only allow the first year of that era or an earlier year.&lt;br /&gt;
            not nextStartYear&lt;br /&gt;
            or ( nextStartYear and obj.gregorianYear &amp;lt;= nextStartYear )&lt;br /&gt;
        )&lt;br /&gt;
        and obj.gregorianYear &amp;gt;= obj.startYear -- Don't allow negative years.&lt;br /&gt;
        and obj.article ~= '' -- Don't allow periods between named eras.&lt;br /&gt;
        and ( obj.endYear and obj.gregorianYear &amp;lt;= obj.endYear or true ) -- If this era has an end year, don't allow years that are greater than the end year.&lt;br /&gt;
        then&lt;br /&gt;
        obj.eraYear = obj.gregorianYear - obj.startYear + 1&lt;br /&gt;
        if obj.eraYear == 1 then&lt;br /&gt;
            obj.eraYearKanji = '元'&lt;br /&gt;
        else&lt;br /&gt;
            obj.eraYearKanji = halfToFull( obj.eraYear )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Make sure obj.label is available even if it is the same as the article name.&lt;br /&gt;
    obj.label = obj.label or obj.article&lt;br /&gt;
    &lt;br /&gt;
    -- Add methods to get the next and previous eras.&lt;br /&gt;
    function obj:getNextEra()&lt;br /&gt;
        if not eraIndex then return end       &lt;br /&gt;
        return era:new{ index = eraIndex - 1, year = obj.gregorianYear }&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    function obj:getPreviousEra()&lt;br /&gt;
        if not eraIndex then return end            &lt;br /&gt;
        return era:new{ index = eraIndex + 1, year = obj.gregorianYear }&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Gets the era object for the &amp;quot;old&amp;quot; era. In most cases this is the same as the current era object, but&lt;br /&gt;
    -- if the era year for the current object is 1, this method will return the era object for the previous&lt;br /&gt;
    -- era. If the method can't find a valid previous era it will return the object for the current era.&lt;br /&gt;
    function obj:getOldEra()&lt;br /&gt;
        if obj.eraYear == 1 then&lt;br /&gt;
            local prevEra = obj:getPreviousEra()&lt;br /&gt;
            if prevEra then&lt;br /&gt;
                return prevEra&lt;br /&gt;
            else&lt;br /&gt;
                return obj&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            return obj&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return setmetatable( obj, {&lt;br /&gt;
        __index = self&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------&lt;br /&gt;
-- Interface for old Japanese calendar templates&lt;br /&gt;
--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function getStartYear( obj )&lt;br /&gt;
    return obj.startYear&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getEndYear( obj )&lt;br /&gt;
    return obj.endYear&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getEraYear( obj )&lt;br /&gt;
    return obj.eraYear&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getEraYearKanji( obj )&lt;br /&gt;
    return obj.eraYearKanji&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getArticle( obj )&lt;br /&gt;
    return obj.article&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getLabel( obj )&lt;br /&gt;
    return obj.label&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getLink( obj )&lt;br /&gt;
    return obj.link&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getKanji( obj )&lt;br /&gt;
    return obj.kanji&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getLabelAndEraYear( obj, kanji )&lt;br /&gt;
    local eraYear = kanji and obj.eraYearKanji or obj.eraYear&lt;br /&gt;
    if obj.label and eraYear then&lt;br /&gt;
        return mw.ustring.format( '%s %s', obj.label, tostring( eraYear ) )&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getLinkAndEraYear( obj, kanji )&lt;br /&gt;
    local eraYear = kanji and obj.eraYearKanji or obj.eraYear&lt;br /&gt;
    if obj.link and eraYear then&lt;br /&gt;
        return mw.ustring.format( '%s %s', obj.link, tostring( eraYear ) )&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getLabelAndEraYearKanji( obj )&lt;br /&gt;
    return getLabelAndEraYear( obj, true )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getLinkAndEraYearKanji( obj )&lt;br /&gt;
    return getLinkAndEraYear( obj, true )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process the arguments from #invoke.&lt;br /&gt;
local function makeWrapper( func )&lt;br /&gt;
    return function( frame )&lt;br /&gt;
        -- If called via #invoke, use the args passed into the invoking&lt;br /&gt;
        -- template, or the args passed to #invoke if any exist. Otherwise&lt;br /&gt;
        -- assume args are being passed directly in from the debug console&lt;br /&gt;
        -- or from another Lua module.&lt;br /&gt;
        local origArgs&lt;br /&gt;
        if frame == mw.getCurrentFrame() then&lt;br /&gt;
            origArgs = frame:getParent().args&lt;br /&gt;
            for k, v in pairs( frame.args ) do&lt;br /&gt;
                origArgs = frame.args&lt;br /&gt;
                break&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            origArgs = frame&lt;br /&gt;
        end&lt;br /&gt;
        -- Trim whitespace and remove blank arguments.&lt;br /&gt;
        local args = {}&lt;br /&gt;
        for k, v in pairs( origArgs ) do&lt;br /&gt;
            if type( v ) == 'string' then&lt;br /&gt;
                v = mw.text.trim( v )&lt;br /&gt;
            end&lt;br /&gt;
            if v ~= '' then&lt;br /&gt;
                args[k] = v&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        local myEra&lt;br /&gt;
        local otherEraArgs = {}&lt;br /&gt;
        table.insert( otherEraArgs, args.next )&lt;br /&gt;
        table.insert( otherEraArgs, args.previous )&lt;br /&gt;
        table.insert( otherEraArgs, args.old )&lt;br /&gt;
        if #otherEraArgs &amp;gt; 1 then&lt;br /&gt;
            return '&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;[[Module:Japanese calendar]] error: you can only specify one parameter out of &amp;quot;next&amp;quot;, &amp;quot;previous&amp;quot; and &amp;quot;old&amp;quot;.&amp;lt;/strong&amp;gt;'&lt;br /&gt;
        elseif args.next then&lt;br /&gt;
            myEra = era:new( args ):getNextEra()&lt;br /&gt;
        elseif args.previous then&lt;br /&gt;
            myEra = era:new( args ):getPreviousEra()&lt;br /&gt;
        elseif args.old then&lt;br /&gt;
            myEra = era:new( args ):getOldEra()&lt;br /&gt;
        else&lt;br /&gt;
            myEra = era:new( args )&lt;br /&gt;
        end&lt;br /&gt;
        return myEra and func( myEra ) or ''&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------&lt;br /&gt;
-- Return the era class and the template interface&lt;br /&gt;
--------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
return {&lt;br /&gt;
    era = function () return era end, -- Accessor function for getting the era class from other modules.&lt;br /&gt;
    baseyear = makeWrapper( getStartYear ),&lt;br /&gt;
    endyear = makeWrapper( getEndYear ),&lt;br /&gt;
    year = makeWrapper( getEraYear ),&lt;br /&gt;
    kanjiyear = makeWrapper( getEraYearKanji ),&lt;br /&gt;
    article = makeWrapper( getArticle ),&lt;br /&gt;
    label = makeWrapper( getLabel ),&lt;br /&gt;
    link = makeWrapper( getLink ),&lt;br /&gt;
    kanji = makeWrapper( getKanji ),&lt;br /&gt;
    label_year = makeWrapper( getLabelAndEraYear ),&lt;br /&gt;
    link_year = makeWrapper( getLinkAndEraYear ),&lt;br /&gt;
    label_kanjiyear = makeWrapper( getLabelAndEraYearKanji ),&lt;br /&gt;
    link_kanjiyear = makeWrapper( getLinkAndEraYearKanji )&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Adminjavasatu</name></author>
	</entry>
</feed>