| Latest revision |
Your text |
| Line 7: |
Line 7: |
| -- the expected key does not have a localization entry | | -- the expected key does not have a localization entry |
| local KEY_OVERRIDES = { | | local KEY_OVERRIDES = { |
| BurnDurationBase_label = 'AfterburnDurationBase_label',
| |
| BurnDurationBase_postfix = 'AfterburnDurationBase_postfix',
| |
| MoveSlowPercent_label = 'MovementSlow_label', | | MoveSlowPercent_label = 'MovementSlow_label', |
| BonusHealthRegen_label = 'HealthRegen_label', | | BonusHealthRegen_label = 'HealthRegen_label', |
| Line 19: |
Line 17: |
| EvasionChance_label = 'EvasionChance_Label', | | EvasionChance_label = 'EvasionChance_Label', |
| DelayBetweenShots_label = 'DelayBetweenShots_Label', | | DelayBetweenShots_label = 'DelayBetweenShots_Label', |
| MoveSlowDuration_postfix = 'EnemyMoveSlowDuration_postfix',
| |
| StaminaRecoveryDisabledDuration_postfix = 'AbilityDuration_postfix',
| |
| PostInvisBuffDuration_label = 'BuffDuration_label',
| |
| PostInvisBuffDuration_postfix = 'BuffDuration_postfix',
| |
| ProjectileFuse_label = 'BellLifetime_label',
| |
| ProjectileFuse_postfix = 'BellLifetime_postfix',
| |
| SelfBuffDuration_label = 'BuffDuration_label',
| |
| SelfBuffDuration_postfix = 'BuffDuration_postfix',
| |
| LifeStealPercentOnHit_label = 'LifestealPercentOnHit_label',
| |
| LifeStealPercentOnHit_postfix = 'LifestealPercentOnHit_postfix',
| |
| AuraFireRateBonus_label = 'FireRateBonus_label',
| |
| AuraFireRateBonus_postfix = 'FireRateBonus_postfix',
| |
| MoveSlowDuration_label = 'SlowDuration_label',
| |
| MoveSlowDuration_postfix = 'SlowDuration_postfix',
| |
| DashRange_label = 'TargetDashRadius_label',
| |
| DashRange_postfix = 'TargetDashRadius_postfix',
| |
| SpeedOnLandDuration_label = 'BuffDuration_label',
| |
| SpeedOnLandDuration_postfix = 'BuffDuration_postfix',
| |
| SummonCount_label = 'GhoulCount_label',
| |
| TetherDuration_label = 'ImmobilizeTrap_CurseDuration_label'
| |
| } | | } |
|
| |
|
| Line 54: |
Line 32: |
| if not text or type(text) ~= "string" then return text end | | if not text or type(text) ~= "string" then return text end |
| -- Replace "n with newline character | | -- Replace "n with newline character |
| return text:gsub('"n', '<br/>') | | return text:gsub('"n', '\n') |
| end | | end |
|
| |
|
| Line 61: |
Line 39: |
| | | |
| local replacements = { | | local replacements = { |
| BonusFireRate = {icon='{{Icon/Brown|[[File:Fire_Rate.png|link=Fire Rate|20px]]}}', label_color='#ffefd7', link='Fire Rate'}, | | SpiritIcon = {icon='{{Icon/Purple|[[File:AttributeIconTechShieldHealth.png|link=Spirit Damage|12px]]}}', link='Spirit Damage'}, |
| BonusMoveSpeed = {icon='{{Icon/Green|[[File:Move_speed.png|link=Move speed|20px]]}}', label_color='#ffefd7', link='Move speed'},
| | SpiritDamage = {icon='{{Icon/Purple|[[File:AttributeIconTechShieldHealth.png|link=Spirit Damage|12px]]}}', label_color='#bc8ee8', link='Spirit Damage'}, |
| BonusSprintSpeed = {icon='{{Icon/Green|[[File:Move_speed.png|link=Sprint speed|20px]]}}', label_color='#ffefd7', link='Sprint speed'},
| | SpiritResist = {icon='{{Icon/Purple|[[File:Spirit_Armor.png|link=Damage_Resistance|20px]]}}', label_color='#bc8ee8', link='Damage_Resistance'}, |
| BonusSpiritDamage = {icon='{{Icon/NoColor|[[File:Spirit damage.png|link=Spirit Damage|20px]]}}', label_color='#bc8ee8', link='Spirit Damage'},
| |
| BonusWeaponDamage = {icon='{{Icon/NoColor|[[File:Bullet Damage.png|link=Weapon Damage|20px]]}}', label_color='#ec981a', link='Weapon Damage'}, | |
| bullet_armor_up = {icon='{{Icon/White|[[File:Barrier.png|link=Barrier|20px]]}}', label_color='#ffefd7', link='Barrier'},
| |
| bullet_damage = {icon='{{Icon/NoColor|[[File:Bullet_damage.png|link=Weapon Damage|20px]]}}', label_color='#ec981a', link='Weapon Damage'},
| |
| BulletResist = {icon='{{Icon/Brown|[[File:Bullet_Armor.png|link=Damage_Resistance|20px]]}}', label_color='#ec981a', link='Damage_Resistance'}, | |
| cast = {icon='{{Icon/White|[[File:Cast.png|link=|20px]]}}', label_color='#ffefd7', link=''},
| |
| CombatBarrier = {icon='{{Icon/White|[[File:Bullet Armor (item).png|link=Damage_Resistance|20px]]}}', label_color='#ffefd7', link='Barrier'},
| |
| cooldown = {icon='{{Icon/White|[[File:AttributeIconTechDuration.png|link=Ability Cooldown|20px]]}}', label_color='#ffefd7', link='Ability Cooldown'},
| |
| damage = {icon='{{Icon/NoColor|[[File:Damage heart.png|link=Damage|20px]]}}', label_color='#ec981a', link='Damage'},
| |
| DamageAmp = {icon='{{Icon/White|[[File:Damage heart.png|link=Damage Amp|20px]]}}', label_color='#ffefd7', link='Damage Amp'},
| |
| FireRate = {icon='{{Icon/White|[[File:Fire_Rate.png|link=Fire Rate|20px]]}}', label_color='#ffefd7', link='Fire Rate'}, | | FireRate = {icon='{{Icon/White|[[File:Fire_Rate.png|link=Fire Rate|20px]]}}', label_color='#ffefd7', link='Fire Rate'}, |
| fire_rate = {icon='{{Icon/White|[[File:Fire_Rate.png|link=Fire Rate|20px]]}}', label_color='#ffefd7', link='Fire Rate'}, | | ReducedFireRate = {icon='{{Icon/White|[[File:Fire_Rate.png|link=Fire Rate|20px]]}}', label_color='#ffefd7', link='Fire Rate'}, |
| Heal = {icon='{{Icon/Green|[[File:Healing.png|link=Health_Regen|20px]]}}', label_color='#13f278', link='Health_Regen'},
| |
| Healing = {icon='{{Icon/Green|[[File:Healing.png|link=Healing|20px]]}}', label_color='#13f278', link='Healing'},
| |
| Immobilize = {icon='{{Icon/White|[[File:Immobilize.png|link=Status Effects#Immobilized|20px]]}}', label_color='#ffefd7', link='Status Effects#Immobilized'},
| |
| invisible = {icon='{{Icon/White|[[File:Invisible.png|link=|20px]]}}', label_color='#ffefd7', link=''},
| |
| KnockBack = {icon='{{Icon/NoColor|[[File:Displacement.png|link=|20px]]}}', label_color='#ffefd7', link='Status_Effects'},
| |
| KnockUp = {icon='{{Icon/NoColor|[[File:Displacement.png|link=|20px]]}}', label_color='#ffefd7', link='Status_Effects'},
| |
| MaxHealth = {icon='{{Icon/Green|[[File:Healing.png|link=Health|20px]]}}', label_color='#13f278', link='Health'},
| |
| MeleeDamage = {icon='{{Icon/Brown|[[File:Melee damage.png|link=Melee Damage|20px]]}}', label_color='#ec981a', link='Melee Damage'}, | | MeleeDamage = {icon='{{Icon/Brown|[[File:Melee damage.png|link=Melee Damage|20px]]}}', label_color='#ec981a', link='Melee Damage'}, |
| MoveSpeed = {icon='{{Icon/Green|[[File:Move_speed.png|link=Move speed|20px]]}}', label_color='#ffefd7', link='Move speed'}, | | WeaponDamage = {icon='{{Icon/Brown|[[File:Damage.png|link=Weapon Damage|20px]]}}', label_color='#ec981a', link='Weapon Damage'}, |
| move_speed = {icon='{{Icon/Green|[[File:Move_speed.png|link=Move speed|20px]]}}', label_color='#ffefd7', link='Move speed'}, | | BulletResist = {icon='{{Icon/Brown|[[File:Bullet_Armor.png|link=Damage_Resistance|20px]]}}', label_color='#ec981a', link='Damage_Resistance'}, |
| Pull = {icon='{{Icon/NoColor|[[File:Displacement.png|link=|20px]]}}', label_color='#ffefd7', link='Status_Effects'}, | | CombatBarrier = {icon='{{Icon/White|[[File:Bullet_Armor.png|link=Damage_Resistance|20px]]}}', label_color='#ffefd7', link='Barrier'}, |
| Pulling = {icon='{{Icon/NoColor|[[File:Displacement.png|link=|20px]]}}', label_color='#ffefd7', link='Status_Effects'}, | | BonusWeaponDamage = {icon='{{Icon/Brown|[[File:Damage.png|link=Weapon Damage|20px]]}}', label_color='#ec981a', link='Weapon Damage'}, |
| Pulls = {icon='{{Icon/NoColor|[[File:Displacement.png|link=|20px]]}}', label_color='#ffefd7', link='Status_Effects'}, | | MoveSpeed = {icon='{{Icon/White|[[File:Move_speed.png|link=Move speed|20px]]}}', label_color='#ffefd7', link='Move speed'}, |
| PureDamage = {icon='{{Icon/NoColor|[[File:Damage.png|link=Pure Damage|20px]]}}', label_color='#ffefd7', link='Pure Damage'}, | | BonusSpiritDamage = {icon='{{Icon/Purple|[[File:AttributeIconTechShieldHealth.png|link=Spirit Damage|12px]]}}', label_color='#bc8ee8', link='Spirit Damage'}, |
| ReducedFireRate = {icon='{{Icon/Brown|[[File:Fire_Rate.png|link=Fire Rate|20px]]}}', label_color='#ffefd7', link='Fire Rate'}, | | BonusFireRate = {icon='{{Icon/White|[[File:Fire_Rate.png|link=Fire Rate|20px]]}}', label_color='#ffefd7', link='Fire Rate'}, |
| Regen = {icon='{{Icon/Green|[[File:Healing.png|link=Health_Regen|20px]]}}', label_color='#13f278', link='Health_Regen'}, | | Heal = {icon='{{Icon/Green|[[File:Health_regen.png|link=Health_Regen|20px]]}}', label_color='#13f278', link='Health_Regen'}, |
| revealed = {icon='{{Icon/White|[[File:Revealed.png|link=|20px]]}}', label_color='#ffefd7', link=''}, | | BonusMoveSpeed = {icon='{{Icon/White|[[File:Move_speed.png|link=Move speed|20px]]}}', label_color='#ffefd7', link='Move speed'}, |
| silence = {icon='{{Icon/White|[[File:Silence.png|link=|20px]]}}', label_color='#ffefd7', link=''}, | | Spirit = {icon='{{Icon/NoColor|[[File:Spirit_icon.png|link=Spirit Power|20px]]}}', label_color='#bc8ee8', link='Spirit Power'}, |
| Silence = {icon='{{Icon/Purple|[[File:Silence.png|link=Silence|20px]]}}', label_color='#bc8ee8', link='Silence'}, | | Stun = {icon='{{Icon/White|[[File:Status_Stun.png|link=Stun|20px]]}}', link='Stun'}, |
| | SpiritDPS = {icon='{{Icon/Purple|[[File:AttributeIconTechShieldHealth.png|link=Spirit Damage|12px]]}}', label_color='#bc8ee8', link='Spirit Damage'}, |
| | Healing = {icon='{{Icon/Green|[[File:Health_regen.png|link=Healing|20px]]}}', label_color='#13f278', link='Healing'}, |
| | Regen = {icon='{{Icon/Green|[[File:Health_regen.png|link=Health_Regen|20px]]}}', label_color='#13f278', link='Health_Regen'}, |
| Slow = {icon='{{Icon/White|[[File:MoveSlow.png|link=Movement_Slow|20px]]}}', label_color='#ffefd7', link='Movement_Slow'}, | | Slow = {icon='{{Icon/White|[[File:MoveSlow.png|link=Movement_Slow|20px]]}}', label_color='#ffefd7', link='Movement_Slow'}, |
| slow = {icon='{{Icon/White|[[File:MoveSlow.png|link=Movement_Slow|20px]]}}', label_color='#ffefd7', link='Movement_Slow'},
| |
| SlowResistance = {icon='{{Icon/White|[[File:MoveSlow.png|link=Movement_Slow#Movement_Slow_Resist|20px]]}}', label_color='#ffefd7', link='Movement_Slow#Movement_Slow_Resist'}, | | SlowResistance = {icon='{{Icon/White|[[File:MoveSlow.png|link=Movement_Slow#Movement_Slow_Resist|20px]]}}', label_color='#ffefd7', link='Movement_Slow#Movement_Slow_Resist'}, |
| Spirit = {icon='{{Icon/NoColor|[[File:Spirit_icon.png|link=Spirit Power|20px]]}}', label_color='#bc8ee8', link='Spirit Power'},
| | Immobilize = {icon='{{Icon/White|[[File:Immobilize.png|link=Status Effects#Immobilized|20px]]}}', label_color='#ffefd7', link='Status Effects#Immobilized'}, |
| SpiritDamage = {icon='{{Icon/NoColor|[[File:Spirit damage.png|link=Spirit Damage|20px]]}}', label_color='#bc8ee8', link='Spirit Damage'},
| |
| SpiritDPS = {icon='{{Icon/NoColor|[[File:Spirit damage.png|link=Spirit Damage|20px]]}}', label_color='#bc8ee8', link='Spirit Damage'},
| |
| SpiritIcon = {icon='{{Icon/NoColor|[[File:Spirit damage.png|link=Spirit Damage|20px]]}}', link='Spirit Damage'},
| |
| SpiritResist = {icon='{{Icon/Purple|[[File:Spirit_Armor.png|link=Damage_Resistance|20px]]}}', label_color='#bc8ee8', link='Damage_Resistance'},
| |
| StatDesc_TechPower = {icon='{{Icon/NoColor|[[File:Spirit damage.png|link=Spirit Damage|20px]]}}', label_color='#bc8ee8', link='Spirit Damage'},
| |
| Stun = {icon='{{Icon/White|[[File:Status_Stun.png|link=Stun|20px]]}}', link='Stun'},
| |
| stun = {icon='{{Icon/White|[[File:Stun.png|link=|20px]]}}', label_color='#ffefd7', link=''},
| |
| tech_armor_up = {icon='{{Icon/White|[[File:Barrier.png|link=Barrier|20px]]}}', label_color='#ffefd7', link='Barrier'},
| |
| tech_damage = {icon='{{Icon/NoColor|[[File:Spirit damage.png|link=Spirit Damage|20px]]}}', link='Spirit Damage'},
| |
| WeaponDamage = {icon='{{Icon/NoColor|[[File:Bullet Damage.png|link=Weapon Damage|20px]]}}', label_color='#ec981a', link='Weapon Damage'},
| |
| Heal = {icon='{{Icon/Green|[[File:Healing.png|link=Healing|20px]]}}', label_color='#13f278', link='Healing'},
| |
| Heals = {icon='{{Icon/Green|[[File:Healing.png|link=Healing|20px]]}}', label_color='#13f278', link='Healing'},
| |
| } | | } |
| | | |
| Line 116: |
Line 67: |
| text = text:gsub('<span class="highlight">(.-)</span>', "<span style= font-weight:bold>%1</span>") | | text = text:gsub('<span class="highlight">(.-)</span>', "<span style= font-weight:bold>%1</span>") |
| text = text:gsub('<span class="highlight_spirit">(.-)</span>', '<span style="font-weight:bold; color:#bc8ee8">%1</span>') | | text = text:gsub('<span class="highlight_spirit">(.-)</span>', '<span style="font-weight:bold; color:#bc8ee8">%1</span>') |
| text = text:gsub('<span class="highlight_courage">(.-)</span>', '<span style="font-weight:bold; color:#ec981a">%1</span>')
| |
| text = text:gsub('<span class="diminish">(.-)</span>', '<span style="font-style: italic;color:#C0C0C0">%1</span>') | | text = text:gsub('<span class="diminish">(.-)</span>', '<span style="font-style: italic;color:#C0C0C0">%1</span>') |
| text = text:gsub('<span class=".-">(.-)</span>', '%1') | | text = text:gsub('<span class=".-">(.-)</span>', '%1') |
| text = text:gsub('<Panel class=\"AbilityPropertyIcon StatDesc_TechPower\">', '{{Icon/Purple|[[File:Spirit damage.png|link=Spirit Damage|20px]]}}')
| |
| text = text:gsub('</Panel>', '')
| |
| | | |
| -- Process panel tags | | -- Process panels |
| text = text:gsub('<Panel class=\"AbilityPropertyIcon prop_(.-)\">', function(key)
| | text = text:gsub('<Panel class=\"AbilityPropertyIcon prop_tech_damage\">', '{{Icon/Purple|[[File:AttributeIconTechShieldHealth.png|link=Spirit Damage|12px]]}}') |
| local replacement = replacements[key]
| | |
| if replacement then
| |
| local label_color = replacement.label_color or 'inherit'
| |
| local icon = replacement.icon or ''
| |
| local link = replacement.link or ''
| |
| -- pre-process string, then check to omit link if the string is empty
| |
| local translated = frame:preprocess('{{#invoke:Lang|get_string|InlineAttribute_' .. key .. '}}')
| |
|
| |
| if translated == '' then
| |
| return string.format('<span class="no-blue-link" style="text-wrap:nowrap; font-weight:bold; color:%s;">%s</span>', label_color, icon)
| |
| else
| |
| return string.format('<span class="no-blue-link" style="text-wrap:nowrap; font-weight:bold; color:%s;">%s [[%s|%s]]</span>',
| |
| label_color,
| |
| icon,
| |
| link,
| |
| translated)
| |
| end
| |
| else
| |
| return '<span style="color:red;font-weight:bold;border-bottom:1px dotted red;" title="Missing attribute definition - Add \''..key..'\' to local replacements in [Module:Lang]">['..key..']</span>'
| |
| end
| |
| end)
| |
|
| |
| -- Process citadel_inline_attribute tags | | -- Process citadel_inline_attribute tags |
| text = text:gsub("{g:citadel_inline_attribute:'(.-)'}", function(key)
| | text = text:gsub("{g:citadel_inline_attribute:'(.-)'}", function(key) |
| local replacement = replacements[key]
| | local replacement = replacements[key] |
| if replacement then
| | if replacement then |
| local label_color = replacement.label_color or 'inherit'
| | local label_color = replacement.label_color or 'inherit' |
| local icon = replacement.icon or ''
| | local icon = replacement.icon or '' |
| local link = replacement.link or ''
| | local link = replacement.link or '' |
| -- pre-process string, then check to omit link if the string is empty
| | -- pre-process string, then check to omit link if the string is empty |
| local translated = frame:preprocess('{{#invoke:Lang|get_string|InlineAttribute_' .. key .. '}}')
| | local translated = frame:preprocess('{{#invoke:Lang|get_string|InlineAttribute_' .. key .. '}}') |
|
| | |
| if translated == '' then
| | if translated == '' then |
| return string.format('<span class="no-blue-link" style="text-wrap:nowrap; font-weight:bold; color:%s;">%s</span>', label_color, icon)
| | return string.format('<span class="no-blue-link" style="text-wrap:nowrap; font-weight:bold; color:%s;">%s</span>', label_color, icon) |
| else
| |
| return string.format('<span class="no-blue-link" style="text-wrap:nowrap; font-weight:bold; color:%s;">%s [[%s|%s]]</span>',
| |
| label_color,
| |
| icon,
| |
| link,
| |
| translated)
| |
| end
| |
| else
| |
| return '<span style="color:red;font-weight:bold;border-bottom:1px dotted red;" title="Missing attribute definition - Add \''..key..'\' to local replacements in [Module:Lang]">['..key..']</span>'
| |
| end
| |
| end)
| |
|
| |
| -- List for keybinds with mismatched names. Replace with the correct name under "citadel_keybind_[key]" in Data:Lang
| |
| keybinds = {
| |
| MoveForward = "forward",
| |
| AltCast = "alt_cast",
| |
| }
| |
|
| |
| -- Process citadel_binding/citadel_keybind tags to replace with keybind strings/templates
| |
| text = text:gsub("{g:citadel_binding:'(.-)'}", function(key)
| |
| -- convert key to lowercase
| |
| local lower_key = key:lower()
| |
| -- look up key with Module:Lang. check if it has a replacement key first
| |
| local replacement = keybinds[key] or lower_key
| |
| local translated = frame:preprocess('{{#invoke:Lang|get_string|citadel_keybind_'.. replacement ..'}}')
| |
| if translated ~= nil and translated ~= '' then
| |
| return "'''" .. translated .. "'''"
| |
| else | | else |
| return '<span style="color:red;font-weight:bold;border-bottom:1px dotted red;" title="Missing keybind - Add \''..key..'\' to local replacements in [Module:Lang]">['..key..']</span>' | | return string.format('<span class="no-blue-link" style="text-wrap:nowrap; font-weight:bold; color:%s;">%s [[%s|%s]]</span>', |
| | label_color, |
| | icon, |
| | link, |
| | translated) |
| end | | end |
| end)
| | else |
|
| | return '<span style="color:red;font-weight:bold;border-bottom:1px dotted red;" title="Missing attribute definition - Add \''..key..'\' to local replacements in [Module:Lang]">['..key..']</span>' |
| -- Force spaces around keybinds where the source data omits them
| | end |
| text = text:gsub("'''([a-zA-Z])", "''' %1")
| | end) |
|
| |
|
| -- Clean up extra spaces between a keybind and following punctuation
| | return frame:preprocess(text) |
| text = text:gsub("'''%s+:", "''':")
| |
| | |
| return frame:preprocess(text)
| |
| end | | end |
|
| |
|
| Line 204: |
Line 105: |
| local frame | | local frame |
| if type(key) == "table" and key.args then | | if type(key) == "table" and key.args then |
| frame = type(key.preprocess) == "function" and key or mw.getCurrentFrame() | | frame = key |
| | | key = frame.args[1] |
| local args = key.args
| | lang_code_override = frame.args["lang_code_override"] |
| key = args[1]
| | fallback_str = frame.args["fallback_str"] |
| lang_code_override = args["lang_code_override"] | | remove_var_index = frame.args["remove_var_index"] |
| fallback_str = args["fallback_str"] | | item_name = frame.args["item_name"] |
| remove_var_index = args["remove_var_index"] | |
| item_name = args["item_name"] | |
| else | | else |
| frame = mw.getCurrentFrame() | | frame = mw.getCurrentFrame() |
| Line 230: |
Line 129: |
| -- Localize | | -- Localize |
| local label = data[KEY_OVERRIDES[key] or key] | | local label = data[KEY_OVERRIDES[key] or key] |
|
| |
| -- Some labels use key with "_postvalue_label" instead, so check this if previous search failed
| |
| if label == nil and key ~= nil and key:sub(-6) == '_label' then
| |
| local postvalue_key = key:sub(1, -7) .. '_postvalue_label'
| |
| label = data[postvalue_key]
| |
| end
| |
|
| |
| if (label == nil) then | | if (label == nil) then |
| -- Apply fallback (without HTML processing for fallback) | | -- Apply fallback (without HTML processing for fallback) |
| Line 253: |
Line 145: |
| end | | end |
| | | |
| -- Always retrieve the last parameter if string contains "|"
| |
| if type(label) == "string" and label:find("|") then
| |
| local parts = mw.text.split(label, "|")
| |
| label = parts[#parts]
| |
| end
| |
|
| |
| -- Remove hashtags
| |
| if type(label) == "string" and label:find("#") then
| |
| local parts = mw.text.split(label, "#")
| |
| label = parts[#parts]
| |
| end
| |
|
| |
| -- Apply remove_var | | -- Apply remove_var |
| if (remove_var_index ~= nil) then | | if (remove_var_index ~= nil) then |
| Line 279: |
Line 159: |
| -- If value exists, remove non-number symbols (but keep + and -) | | -- If value exists, remove non-number symbols (but keep + and -) |
| if value then | | if value then |
| value = value:gsub("[^0-9+-.]", "") | | value = value:gsub("[^0-9+-]", "") |
| -- Return empty string if nothing left, otherwise return the filtered value | | -- Return empty string if nothing left, otherwise return the filtered value |
| return value ~= "" and value or variable_name | | return value ~= "" and value or variable_name |