Module:ListGeneration: Difference between revisions

// via Wikitext Extension for VSCode
// via Wikitext Extension for VSCode
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
-- Module:ListGeneration
--[[
-- A centralized and flexible module for generating various types of lists from delimited strings.
* Name: ListGeneration
--
* Author: Mark W. Datysgeld
-- This module is designed to replace fragmented list generation logic across the wiki,
* Description: Centralized and flexible module for generating various types of lists from delimited strings, designed to replace fragmented list generation logic
-- providing a single, powerful function to create multiple list formats.
* Notes: Handles semicolon-delimited strings automatically; supports multiple list modes (bullet, bullet_custom, invisible, comma); allows custom CSS classes on list container; provides itemHook for custom per-item processing and formatting; accepts both string input (auto-split) and pre-split table input
--
]]
-- Features:
--  * Handles semicolon-delimited strings automatically.
--  * Supports multiple list modes:
--    - 'bullet': Standard HTML unordered list (<ul>).
--    - 'bullet_custom': Unordered list with a custom Unicode character as the bullet.
--    - 'invisible': A bulleted list with the 'no-bullets' CSS class for an unstyled list.
--    - 'comma': A simple, comma-separated string of items.
--  * Allows for custom CSS classes on the list container.
--  * Provides an 'itemHook' for custom, per-item processing and formatting.
--
-- Usage:
--  local ListGeneration = require('Module:ListGeneration')
--  local options = {
--    mode = 'bullet',
--    listClass = 'my-custom-list',
--    itemHook = function(item) return '<b>' .. item .. '</b>' end
--  }
--  local htmlList = ListGeneration.createList('item1; item2; item3', options)


local p = {}
local p = {}
Line 52: Line 34:
     local items
     local items
     if type(input) == 'string' then
     if type(input) == 'string' then
         items = NormalizationText.splitMultiValueString(input)
        -- Default to splitting only by semicolon. This is a safer default than also splitting by "and", which can break up valid entity names.
        -- Callers that need more complex splitting logic should pre-split the string and pass a table instead.
        local semicolonOnlyPattern = {{pattern = ";%s*", replacement = ";"}}
         items = NormalizationText.splitMultiValueString(input, semicolonOnlyPattern)
     else
     else
         items = input
         items = input
Line 73: Line 58:
     end
     end


     -- If there's only one item and no custom bullet, return it directly without list formatting
     -- If there's only one item and no special formatting is needed, return it directly without list formatting
     if #items == 1 and (mode ~= 'bullet_custom' or not bulletChar or bulletChar == '') then
     if #items == 1 then
         local singleItem = items[1]
         local singleItem = items[1]
         if type(singleItem) == 'table' then
         local hasCustomBullet = (mode == 'bullet_custom' and bulletChar and bulletChar ~= '')
            return singleItem.content or ''
        local hasSpecialClass = (type(singleItem) == 'table' and singleItem.class and singleItem.class ~= '')
        else
       
            return singleItem
        -- Only bypass list formatting if there's no custom bullet AND no special class
        if not hasCustomBullet and not hasSpecialClass then
            if type(singleItem) == 'table' then
                return singleItem.content or ''
            else
                return singleItem
            end
         end
         end
        -- If we have custom bullets or special classes, continue to list formatting below
     end
     end