Документация по модулю [ просмотреть ] [ изменить ] [ историю ] [ очистить ]
Реализует {{ sfn }}, {{ harvard citation }} и варианты этих шаблонов.
require ( 'Модуль: без глобальных переменных' );local getArgs = require ( 'Модуль: аргументы' ). getArgs ;- [[-------------------------- --------------- --------------------------------------- таблица для определения начальных значений.]]local args_default = {скобка_left = '' ,скобка_right = '' ,скобка_year_left = '' ,скобка_year_right = '' ,postscript = '' ,page = '' ,страницы = '' ,location = '' ,page_sep = ", стр. & nbsp;" ,pages_sep = ", стр. & nbsp;" ,ref = '' ,template = 'harv' , - если имя шаблона не указано в {{#invoke:}}, используйте это};- [[-------------------------- <ЦЕЛЬ _ ПРОВЕРКА> --------------- ---------------------------------------ищите anchor_id (список имен CITEREF и год или текст из | ref =) в anchor_id_listошибка 'no target' может быть подавлена с помощью | ignore-err = yes, когда цель не может быть найдена, потому что цель находится внутришаблон, который является оболочкой для другого шаблона; Ошибка "несколько целей" не может быть подавлена]]локальная функция target_check ( anchor_id , args )локальное пространство имен = mw . название . getCurrentTitle (). пространство имен ;локальный anchor_id_list_module = mw . loadData ( 'Модуль: Footnotes / anchor_id_list' );локальный anchor_id_list = anchor_id_list_module . anchor_id_list ;локальный article_whitelist = anchor_id_list_module . article_whitelist ;локальный template_list = anchor_id_list_module . template_list ;локальный whitelist_module = mw . loadData ( 'Модуль: сноски / белый список' );локальный белый список = whitelist_module . белый список ;местные special_patterns = белый список_модуля . special_patterns ;локальный DNB_special_patterns = whitelist_module . DNB_special_patterns ;локальный DNB_template_names = модуль_белого списка . DNB_template_names ;если 10 == пространство имен, товозврат '' ; - автоматическая форма | no-tracking = yes; TODO: это слишком широко?конецлокальный счет = список_якорей [ anchor_id ]; - nil, если anchor_id отсутствует в списке; еще счетместное сообщение ;местная категория ;если не счет, тоесли args . тогда игнорируй возврат '' ; - если ignore истинно, то ни сообщения, ни категорииконецесли article_whitelist и article_whitelist [ anchor_id ], то - если в нем есть локальный белый список статей и идентификатор привязкивозврат '' ; -- Выполненоконецлокальный wl_anchor_id = anchor_id ; - скопировать для изменения для индексации в белый списокесли args . год, затем - для идентификаторов привязки, созданных этим шаблоном (не в | ref =), которые имеют датуесли args . год : совпадение ( '% d% l $' ) или - используйте значение даты, чтобы определить, следует ли нам удалить средство устранения неоднозначностиаргументы . год : совпадение ( 'n% .d%.% l $' ) илиаргументы . год : совпадение ( 'nd% l $' ) затемwl_anchor_id = wl_anchor_id : gsub ( '% l $' , '' ); - убрать неоднозначностьконецконецлокальный t_tbl = белый список [ wl_anchor_id ]; - получить список шаблонов, связанных с этим идентификатором привязкиесли t_tbl, то - когда идентификатор привязки не в белом списке t_tbl равен нулюfor _ , t в ipairs ( t_tbl ) do - пролистать список шаблонов, связанных с этим идентификатором привязкиif template_list [ t ] then - если связанный шаблон найден в списке шаблонов в статьевозврат '' ; - идентификатор привязки занесен в белый список, и статья имеет соответствующий шаблон, поэтому ошибок нетконецконецконецfor _ , шаблон в ipairs ( special_patterns ) do - пролистайте специальные шаблоны и попытайтесь сопоставитьесли anchor_id : match ( шаблон ), товозврат '' ;конецконецfor _ , dnb_t в ipairs ( DNB_template_names или {}) делать - теперь отчаяние, есть ли какие-нибудь шаблоны DNB? DNB_template_names может быть нулевым; пустая таблица предотвращает ошибку скриптаif template_list [ dnb_t ] then - если в статье есть этот шаблон DNBfor _ , шаблон в ipairs ( DNB_special_patterns ) do - прокрутка шаблонов подстановочных знаков, специфичных для DNBесли anchor_id : match ( шаблон ), то - и попытаться сопоставитьвозврат '' ; - нашел совпадениеконецконецконецконецmsg = 'нет цели:' .. anchor_id ; - anchor_id не найденcategory = '[[Категория: ошибки без цели Harv и Sfn]]' ;elseif 1 < tally тогдаmsg = 'несколько целей (' .. tally .. '×):' .. anchor_id ; - более одного anchor_id в этой статьеcategory = 0 == namespace и '[[Категория: многоцелевые ошибки Harv и Sfn]]' или '' ; - категоризировать только в пространстве статейreturn '' .. args . template .. 'error:' .. msg .. '([[: Категория: ошибки шаблонов Harv и Sfn | помощь]]) ' .. category ;конец- category = 0 == namespace и '[[Категория: ошибки шаблонов Harv и Sfn]]' или ''; - категоризировать только в пространстве статейcategory = 0 == пространство имен и категория или '' ; - категоризировать только в пространстве статей- использовать эту версию для отображения сообщений об ошибках- вернуть сообщение и '' .. args.template .. 'error:' .. msg .. '( [[: Категория: ошибки шаблонов Harv и Sfn | помощь]]) '.. категория или' ';- используйте эту версию, чтобы скрыть сообщения об ошибкахвернуть сообщение и ' .. args . template .. 'error:' .. msg .. '([[: Category: Harv and Sfn template errors | help]]) ' .. category or '' ;конец- [[-------------------------- <ЕСТЬ _ ГОД> --------------- -------------------------------------------------оценивает параметр, чтобы увидеть, является ли это одной из этих форм с или без устранения неоднозначности строчных букв: ГГГГ nd nd c. ГГГГ ГГГГ – ГГГГ (разделитель - дефис) ГГГГ – ГГ (разделитель - дефис)вернуть true, если param имеет распознанную форму; ложь еще]]local patterns_date = {'^% d% d% d% d?% l? $' ,'^ n% .d%.% l? $' ,'^ nd% l? $' ,'^ c%. % d% d% d% d?% l? $ ' ,'^% d% d% d% d–% d% d% d% d% l? $' ,'^% d% d% d% d–% d% d% l? $' ,}локальная функция is_year ( параметр , аргументы )аргументы . год = '' ; - используется для ошибки harv;для _ , шаблон в ipairs ( patterns_date ) делатьесли мв . ustring . match ( параметр , шаблон ), затемаргументы . год = параметр ; - используется для ошибки harv;вернуть истину ;конецконецконец- [[-------------------------- <ЯДРО> ----------------- -------------------------------------------------- ---возвращает якорную ссылку (CITEREF), состоящую из одного-четырех имен авторов, года и местоположения источника (| p =, | pp =, loc =)]] ядро локальной функции ( аргументы ) локальный результат ;местный err_msg = ''если args . P5 ~ = '', затемесли is_year ( аргументы . P5 , args ), торезультат = таблица.concat ({ аргументы . P1 , 'и др.' , аргументы . скобка_лет_влево , аргументы . P5 , аргументы . скобка_год_права });ещеаргументы . P5 = '' ; - при P5 не год не включать в якорьрезультат = table.concat ({ args . P1 , 'et al.' }); - и не рендерингконецelseif args . P4 ~ = '', затемесли is_year ( аргументы . P4 , args ), торезультат = таблица.concat ({ аргументы . P1 , ',' , аргументы . P2 , '& amp;' , аргументы . P3 , '' , аргументы . скобка_лет_влево , аргументы . P4 , аргументы . скобка_год_права }); - три имени и годещерезультат = table.concat ({ args . P1 , 'et al.' }); - четыре имениконецelseif args . P3 ~ = '', затемесли is_year ( аргументы . P3 , args ), торезультат = table.concat ({ арг . P1 , '& Amp;' , арг . P2 , '' , арг . bracket_year_left , арг . Р3 , арг . bracket_year_right }); - два имени и годещерезультат = table.concat ({ аргументы . P1 , ',' , аргументы . P2 , '' , '& amp;' , аргументы . P3 }); - три имениконецelseif args . P2 ~ = '', тогдаесли is_year ( арг . P2 , арг ) , торезультат = таблица.concat ({ аргументы . P1 , '' , аргументы . скобка_лет_влево , аргументы . P2 , аргументы . скобка_год_вправо }); - одно имя и годещерезультат = table.concat ({ аргументы . P1 , '& amp;' , аргументы . P2 }); - два имениконецещерезультат = аргументы . P1 ; - одно имяконец- когда результат с указанием даты автора заканчивается точкой (обычно, когда последний позиционный параметр содержит 'nd')- и когда нет исходного местоположения (no | p =, | pp = или | loc =)- и когда первый или единственный символ в args.postscript является точкой- удалить конечную точку результата с указанием даты автора- конечная точка результата с датой автора будет заменена позже содержимым args.postscript (обычно точкой)if ( '.' == result : sub ( - 1 )) and ( '.' == args . postscript : sub ( 1 )) and ( '' == args . page ) and ( '' == args . pages ) и ( '' == args . location ), торезультат = результат : gsub ( '%. $' , '' );конецесли args . ref ~ = 'none', тогдалокальный anchor_id ;если args . ref ~ = '' тогдаanchor_id = mw . uri . anchorEncode ( аргументы . ссылка );err_msg = target_check ( anchor_id , args );результат = table.concat ({ '[[#' , anchor_id , '|' , результат , ']]' });ещеanchor_id = mw . uri . anchorEncode ( table.concat ({ 'CITEREF' , арг . Р1 , арг . Р2 , арг . Р3 , арг . Р4 , арг . Р5 }));err_msg = target_check ( anchor_id , args );результат = table.concat ({ '[[#' , anchor_id , '|' , результат , ']]' });конецконецесли args . page ~ = '', затемрезультат = таблица.concat ({ результат , аргументы . page_sep , аргументы . страница });elseif args . страницы ~ = '', затемрезультат = table.concat ({ результат , args . pages_sep , args . pages });конец если args . location ~ = '', затемрезультат = table.concat ({ результат , ',' , аргументы . расположение });конецрезультат = таблица.concat ({ аргументы . левая скобка , результат , аргументы . правая скобка , аргументы . постскрипт }): gsub ( '% s +' , '' ); - убрать лишние пробелывернуть результат .. err_msg ;конец- [[-------------------------- --------------- ------------------------------------------ Поскольку все шаблоны имеют общий набор параметров, одна общая функция для получения этих параметровиз фрейма и родительского фрейма.]]локальная функция args_fetch ( frame , ps )локальные аргументы = args_default ; - создать копию таблицы по умолчаниюлокальный pframe = кадр : getParent (); - указать на таблицу параметров шаблонадля k , v в парах ( frame . args ) do - переопределить значения по умолчанию значениями, указанными в #invoke: if anyargs [ k ] = v ; конецаргументы . postscript = pframe . аргументы . постскриптум или pframe . аргументы . пс или пс ;если 'none' == args . тогда постскриптум аргументы . постскриптум = '' ;конецаргументы . страница = pframe . аргументы . p или pframe . аргументы . страница или '' ;аргументы . страницы = pframe . аргументы . pp или pframe . аргументы . страницы или '' ;аргументы . location = pframe . аргументы . loc или '' ;аргументы . ref = pframe . аргументы . ref или pframe . аргументы . Ссылка или '' ;аргументы . ignore = ( 'yes' == pframe . args [ 'ignore-false-positive' ]) или ( 'yes' == pframe . args [ 'ignore-err' ]);for i , v в ipairs ({ 'P1' , 'P2' , 'P3' , 'P4' , 'P5' }) do - пройти по пяти позиционным параметрам и обрезать, если установлено иначе, пустая строкаargs [ v ] = ( pframe . args [ i ] и mw . text . trim ( pframe . args [ i ])) или »' ;конецесли args . P5 и не is_year ( арг . P5 , арг ) затемместный i = 6 ; - инициализировать индексатор шестым позиционным параметрома pframe . args [ i ] do - в случае, если авторов слишком много, перебрать авторов, ищущих годместный v = mw . текст . обрезать ( pframe . args [ i ]); -- отделкаесли is_year ( v , args ), то - если годаргументы . P5 = v ; - перезаписать все, что было в args.P5, с годомперерыв ; - и откажитесь от поискаконеця = я + 1 ; - поднять индексаторконецконецвернуть аргументы ;конец- [[-------------------------- --------------- ------------------------------- общая точка входа для: {{harvard citation}} aka {{harv}} {{Цитата из Гарварда без скобок}} aka {{harvnb}} {{harvcol}} {{harvcolnb}} {{harvcoltxt}} {{Harvard citation text}} aka {{harvtxt}} {{Harvp}}Отличительные особенности (скобки и разделители страниц) указаны в {{#invoke}} этого модуля в соответствующих шаблонах.]]локальная функция harvard_citation ( кадр )локальные аргументы = args_fetch ( кадр , '' ); - получить шаблон и вызвать параметры; постскриптум по умолчанию - пустая строкавернуть ядро ( аргументы );конец- [[-------------------------- --------------- --------------------------------------------- используется sfn () и sfnm (). Эта функция устраняет проблему с гаджетом справочной всплывающей подсказки, когда всплывающая подсказка не отображается.когда в локаторе источника (| p =, | pp =, | loc =) есть внешняя вики-ссылка, содержащая символ #убрать зарезервированные uri-символы из URL-адресов в параметрах | p =, | pp- и | loc = Исследуемые символы: ! # $ & '() * +, /:; =? @ [] ]]локальная функция strip_url ( страницы )местный escaped_uri ;если не страницы или ( '' == страницы ), товернуть страницы ;конецдля uri на страницах : gmatch ( '% [(% a [% w% +%.% -] *: //% S +)' ) do - для каждой внешней ссылки получить uriescaped_uri = uri : gsub ( "([% (%)%. %%% +% -% *%?% [% ^% $%]])" , "%%% 1" ); - сохранить копию с экранированными символами шаблона luauri = uri : gsub ( "[! #% $ & '% (%)% *% +, /:; =%? @% [%]%. %%]" , ' ' ); - удалить зарезервированные символы и '%', потому что '% 20' (пробел) является lua 'недопустимым индексом захвата'pages = pages : gsub ( escaped_uri , uri , 1 ); - заменить оригинальный uri на урезанную версиюконецвернуть страницы ;конец- [[-------------------------- ----------------- -------------------------------------------------- ----- точка входа для {{sfn}} и {{sfnp}}]]локальная функция sfn ( фрейм )локальные аргументы = args_fetch ( кадр , '.' ); - получить шаблон и вызвать параметры; постскриптум по умолчанию - точкалокальный результат = ядро ( аргументы ); - сделай якорь CITEREF- собрать все вместе, а затем удалить лишние пробелыlocal name = table.concat ({ 'FOOTNOTE' , args . P1 , args . P2 , args . P3 , args . P4 , args . P5 , strip_url ( args . page ), strip_url ( args . pages ), strip_url ( args . расположение )}): gsub ( '% s +' , '' ); кадр возврата : extensionTag ({ name = 'ref' , args = { name = name }, content = result });конец- [[-------------------------- ----------------- -------------------------------------------------- --- общая точка входа для {{sfnm}} и {{sfnmp}}Отличительные особенности (скобки) указаны в {{#invoke}} этого модуля в соответствующих шаблонах.]]локальная функция sfnm ( фрейм )локальные аргументы = args_default ; - создать копию таблицы по умолчаниюлокальный pframe = кадр : getParent (); - указать на таблицу параметров шаблонаместный n = 1 ; - указатель источника; это 'n' в na1, ny и т. д.местный first_pnum = 1 ; - первый из пары позиционных параметровлокальный second_pnum = 2 ; - второй из пары позиционных параметровлокальный last_ps = 0 ; - индекс последнего источника с | nps = setлокальный last_index = 0 ; - индекс последнего источника; они используются для определения, какой из | ps = или | nps = прервет весь рендеринг.локальный выход = {}; - таблица для хранения отрисованных источниковместная сноска = { 'FOOTNOTE' }; - все данные об авторе, дате и местоположении в источнике становятся частью идентификатора сноски ссылки; добавлено по мере продвижениядля k , v в парах ( frame . args ) do - переопределить значения по умолчанию значениями, указанными в #invoke: if anyargs [ k ] = v ; конецв то время как истинные делаесли не pframe . args [ table.concat ({ n , 'a1' })], а не pframe . args [ first_pnum ], затемперерыв ; - нет na1 или соответствующего позиционного параметра, так что сделаноконецесли pframe . args [ table.concat ({ n , 'a1' })] тогда - использует ли этот источник именованные параметры?for _ , v в ipairs ({ 'P1' , 'P2' , 'P3' , 'P4' , 'P5' }) do - инициализировать для этого источникааргументы [ v ] = '' ;конецfor i , v в ipairs ({ 'P1' , 'P2' , 'P3' , 'P4' , 'P5' }) do - извлечь параметры автора и года для этого источникаargs [ v ] = pframe . args [ table.concat ({ n , 'a' , i })] или '' ; - попытка присвоить имя автораif '' == args [ v ] then - когда не было имени автораargs [ v ] = pframe . args [ table.concat ({ n , 'y' })] или '' ; - попытка назначить годперерыв ; - сделано с указанием автора / даты для этого источникаконецконецelse - этот источник использует позиционные параметрыаргументы . P1 = mw . текст . обрезать ( pframe . args [ first_pnum ]); - да, поддержал только один автораргументы . P2 = ( PFRAME . Арг [ second_pnum ] и MW . Текст . Дифферент ( PFRAME . Арг [ second_pnum ])) или '' ; - при позиционном авторе год также должен быть позиционнымfor _ , v в ipairs ({ 'P3' , 'P4' , 'P5' }) do - очистить остальные для этого источникааргументы [ v ] = '' ;конецfirst_pnum = first_pnum + 2 ; - в источнике должны быть указаны автор и год.второй_число = первое_число + 1 ; - увеличьте их для возможного следующего позиционного источникаконецаргументы . postscript = pframe . args [ table.concat ({ n , 'ps' })] или '' ;если 'none' == args . тогда постскриптум - это для совместимости с другими шаблонами сносок; ничего не делаетаргументы . постскриптум = '' ;конецаргументы . ref = pframe . args [ table.concat ({ n , 'ref' })] или '' ; - альтернативная ссылка на этот источникаргументы . страница = pframe . args [ table.concat ({ n , 'p' })] или '' ; - расположение источников для этого источникааргументы . страницы = pframe . args [ table.concat ({ n , 'pp' })] или '' ;аргументы . location = pframe . args [ table.concat ({ n , 'loc' })] или '' ;аргументы . ignore = ( 'yes' == pframe . args [ table.concat ({ n , 'ignore-false-positive' })]) или ( 'yes' == pframe . args [ table.concat ({ n , 'ignore -err ' })]);- args.ignore = 'yes' == pframe.args [table.concat ({n, 'ignore-err'})];table.insert ( out , core ( args )); - сохранить рендеринг этого источникадля k , v в ipairs ({ 'P1' , 'P2' , 'P3' , 'P4' , 'P5' }) do - создать идентификатор FOOTNOTEесли '' ~ = args [ v ], тоtable.insert ( сноска , аргументы [ v ]);конецконецдля k , v в ipairs ({ 'page' , 'pages' , 'location' }) do - они выполняются отдельно, так что мы можем удалить зарезервированные uri символы из номеров страниц с расширенными ссылкамиесли '' ~ = args [ v ], тоtable.insert ( сноска , strip_url ( args [ v ]))конецконецlast_index = n ; - флаги, используемые для выбора терминального постскрипта из nps или end_psесли '' ~ = args . тогда постскриптум last_ps = n ;конецп = п + 1 ; - удар для следующегоконецлокальное имя = table.concat ( сноска ): gsub ( '% s +' , '' ); - соедините сноску и удалите лишнее пространствоаргументы . end_ps = pframe . аргументы . постскриптум или pframe . аргументы . ps или '.' ; - это постскриптум для целого, а не для отдельных источниковесли 'none' == args . end_ps тогда - не исходное значение параметра sfnm; добавлено для совместимости с другими шаблонами сносокаргументы . end_ps = '' ;конецлокальный результат = table.concat ({ table.concat ( out , ';' ), ( last_index == last_ps ) и '' или аргументы . end_ps }); кадр возврата : extensionTag ({ name = 'ref' , args = { name = name }, content = result });конец- [[-------------------------- ----------------- ------------------------------------------------- реализует {{sfnref}}]]локальная функция sfnref ( фрейм )локальные аргументы = getArgs ( кадр );локальный выход = {};for i = 1 , 5 do - получить первые пять аргументов, если есть пять аргументовесли args [ i ], тоиз [ я ] = аргументы [ я ];ещеперерыв ; - не более 5 аргументовконецконецif 5 == # out then - когда мы увидим пять аргументов, может быть большеместный i = 6 ; - инициализировать индексатор шестым позиционным параметромв то время как args [ i ] do - в случае, если авторов слишком много, перебирает авторов, ищущих годесли is_year ( args [ i ], args ), то - если годout [ 5 ] = args [ i ]; - перезаписать все, что было в args [5], на годперерыв ; - и откажитесь от поискаконеця = я + 1 ; - поднять индексаторконецконецвернуть мв . uri . anchorEncode ( 'CITEREF' .. table.concat ( out ));конец- [[-------------------------- <ЭКСПОРТИРУЕМЫЕ ФУНКЦИИ> ----------------- -------------------------]]return {harvard_citation = harvard_citation ,SFN = SFN ,SFNM = SFNM ,sfnref = sfnref ,};