Módulo:AFI

De ProleWiki, la enciclopedia proletaria
Revisión del 01:20 27 sep 2022 de Miguel (discusión | contribs.) (Creación de «Módulo:AFI»)
(difs.) ← Revisión anterior | Revisión actual (difs.) | Revisión siguiente → (difs.)

El Alfabeto Fonético Internacional (AFI en español, API en francés e IPA en inglés) es un sistema de notación fonética creado por lingüistas. Su propósito es establecer, de forma regularizada, precisa y única, la representación de los sonidos del habla de cualquier lengua, y en el ámbito profesional lo usan frecuentemente lingüistas, logopedas, terapeutas, maestros de lengua extranjera, lexicógrafos y traductores. En su forma básica (en 2005) tiene aproximadamente 107 símbolos básicos y 55 modificadores.


local z = {}
local ModuloTablas = require('Módulo:Tablas')
local datos = mw.loadData('Módulo:AFI/datos')

local function enlaceSim(sim)
  if sim == '[' or sim == ']' then
    return mw.text.nowiki(sim)
  elseif sim ~= '/' and mw.text.trim(sim) then
    local art = datos.fonemas[mw.text.trim(sim)]
    if art then
      return '[[' .. art ..'|' .. sim .. ']]'
    end
  end
  return sim
end

local function separarSims(afi)
  local puntos = { mw.ustring.codepoint(afi, 1, mw.ustring.len(afi)) }
  local res = {}
  local i = 1
  while puntos[i] do
    local tam = 0
    -- Si hay caracteres unidos por una ligadura entre U+035C y U+0362
    if puntos[i+2] and puntos[i+1] > 859 and puntos[i+1] < 867 then
      tam = 2
    end
    -- Si hay caracteres seguidos de un diacritico entre U+0300 y U+035B
    if puntos[i+tam+1] and puntos[i+tam+1] > 767 and puntos[i+tam+1] < 860 then
      tam = tam + 1
    end
    table.insert(res, mw.ustring.sub(afi, i, i+tam))
    i = i + tam + 1
  end
  return res
end

function z.AFI(args, frame)
  local elem = mw.html.create('span'):addClass('AFI-bloque')
  local cats = ''

  -- Datos:idioma
  local idioma
  if args.idioma then
    idioma = mw.language.fetchLanguageName(args.idioma, 'es')
    if mw.ustring.len(idioma) == 0 then
      local tidioma = datos.lenguas[args.idioma]
      if tidioma == nil then
        idioma = nil
        cats = cats .. '[[Categoría:' .. datos.cadenas.lengerr .. ']]'
      else
        idioma = tidioma[1]
        if #tidioma == 2 then
          cats = cats .. '[[Categoría:' .. datos.cadenas.plancat .. tidioma[2] .. ']]'
        else
          cats = cats .. '[[Categoría:' .. datos.cadenas.plancat .. tidioma[1] .. ']]'
        end
      end
    else
      cats = cats .. '[[Categoría:' .. datos.cadenas.plancat .. idioma .. ']]'
    end
  else
  	cats = cats .. '[[Categoría:' .. datos.cadenas.noleng .. ']]'
  end

  -- Texto
  local texto = elem:tag('span'):addClass('AFI-texto')
  if args.tipo then
    local tipo = datos.tipos[args.tipo]
    if args.tipo == 'p' or args.tipo == 'l' or args.tipo == 'a' then
      texto:wikitext(tipo .. ' ')
    elseif (args.tipo == 'i' or args.tipo == 'n') and idioma then
      texto:wikitext(mw.ustring.format(tipo, idioma) .. ' ')
    end
  else
    return error("Debe especificar el tipo de uso")
  end

  -- Pronunciacion
  local afispan = elem:tag('span'):addClass('IPA')
  if not args.enlaces then
    local enlaces = {}
    local fonemas = separarSims(args.pron)
    local simbolo
    for k, v in ipairs(fonemas) do
      simbolo = enlaceSim(v)
      if simbolo then
        table.insert(enlaces, simbolo)
      end
    end

    -- &#8198; = Six-Per-Em Space, de lo contrario ʃ toca [ en windows
    if mw.ustring.match(enlaces[1], '[ʃɲjʄɟ]') then
      table.insert(enlaces, 1, '&#8198;')
    end
    if mw.ustring.match(enlaces[#enlaces], '[ʃʈɭʄɖɻʠʧ]' ) then
      table.insert(enlaces, '&#8198;')
    end

    -- Añade // si no lo tiene
    if not (enlaces[1] == '&#91;' or enlaces[1] == '/') then
      table.insert(enlaces, 1, '/')
      table.insert(enlaces, '/')
    end

    afispan:wikitext(table.concat(enlaces))

  -- Si no se quieren enlaces
  else
  	afispan:wikitext(args.pron)
  end

  -- Audio
  if args.audio then
    elem:wikitext(' ')
    elem:tag('small'):addClass('AFI-audio'):wikitext('(🔊&#xFE0E; [[Media:' .. args.audio .. '|escuchar]])')
    cats = cats .. '[[Categoría:' .. datos.cadenas.audiocat .. ']]'
  end

  -- Ayuda
  if datos.ayuda[args.idioma] then
    elem:wikitext(' ')
    elem:tag('sup'):addClass('AFI-ayuda'):attr('style', 'font-weight: bold; text-decoration: none'):wikitext('[[Ayuda:AFI/'..datos.ayuda[args.idioma]..'|?]]')
    --elem:tag('u'):addClass('AFI-ayuda'):attr('style', 'font-weight: bold; text-decoration: none'):wikitext('[[Ayuda:AFI/'..datos.ayuda[args.idioma]..'|❓]]')
  end

  if mw.title:getCurrentTitle().namespace == 0 then
    return tostring(elem) .. cats
  else
  	return tostring(elem)
  end
end

function z._AFI(frame)
  local ModuloArgumentos = require('Módulo:Argumentos')
  local argumentos = ModuloArgumentos.obtenerArgumentosConValor(frame)
  local obj = {
    pron = argumentos[1],
    tipo = argumentos[2] or 'x',
    idioma = argumentos[3],
    audio = argumentos[4],
    enlaces = argumentos[5]
  }
  return z.AFI(obj)
end

return z