Перейти к навигации Перейти к поиску
Документация по модулю [ просмотреть ] [ изменить ] [ историю ] [ очистить ]
Реализует {{ harvc }}
require ( 'Модуль: без глобальных переменных' )локальный anchor_id_list = mw . loadData ( 'Модуль: Footnotes / anchor_id_list' ). anchor_id_list ;локальный code_open_tag = '<code class = "cs1-code">' ; - класс cs1-code, определенный в модуле: Citation / CS1 / styles.csslocal lock_icons = { - классы значков определены в Module: Citation / CS1 / styles.css[ 'registration' ] = { 'cs1-lock-registration' , 'Требуется бесплатная регистрация' },[ 'limited' ] = { 'cs1-lock-limited' , 'Бесплатный доступ при ограниченной пробной версии, обычно требуется подписка' },[ 'subscription' ] = { 'cs1-lock-subscription' , 'Требуется платная подписка' },}- [[-------------------------- <ЦЕЛЬ _ ПРОВЕРКА> --------------- ---------------------------------------ищите anchor_id (список имен CITEREF и год или текст из | ref =) в anchor_id_listошибка 'no target' может быть подавлена с помощью | ignore-err = yes, когда цель не может быть найдена, потому что цель находится внутришаблон, который является оболочкой для другого шаблона; Ошибка "несколько целей" не может быть подавлена]]локальная функция target_check ( anchor_id , игнорировать )местный номер = anchor_id_list [ anchor_id ]; - nil, если anchor_id отсутствует в списке; еще номерместное сообщение ;местная категория ;если не число, тоесли игнорировать товозврат '' ; - если ignore истинно, то ни сообщения, ни категорииконецmsg = 'нет цели:' .. anchor_id ; - anchor_id не найден в этой статьеelseif 1 < число, тоmsg = 'несколько целей (' .. число .. '×):' .. anchor_id ; - более одного anchor_id в этой статьеконецcategory = 0 == mw . название . getCurrentTitle (). пространство имен и '[[Категория: ошибки шаблона Harv и Sfn]]' или '' ; - категоризировать только в пространстве статей- использовать эту версию для отображения сообщений об ошибкахreturn msg и '<span class = "error harv-error" style = "display: inline; font-size: 100%"> Harvc error:' .. msg .. '([[: Категория: ошибки шаблонов Harv и Sfn | помощь]]) </span> ' .. категория или ' ' ;- используйте эту версию, чтобы скрыть сообщения об ошибках- вернуть сообщение и '<span class = "error harv-error" style = "display: none; font-size: 100%"> Harvc error:' .. msg .. '([[: Категория: Harv и Sfn ошибки шаблона | помощь]]) </span> '.. категория или' ';конец- [[-------------------------- <IS _ SET> --------------- -------------------------------------------------- -Установлена ли переменная или нет. Переменная устанавливается, если она не равна нулю и не пуста.]]локальная функция is_set ( var ) не возвращать ( var == nil или var == '' );конец- [[-------------------------- <ПРОВЕРИТЬ _ ЛЕТ> --------------- -----------------------------------------оценивает параметры, чтобы увидеть, являются ли они одной из этих форм с устранением неоднозначности строчных букв или без него (так же, как вМодуль: Сноски):ГГГГndndc. ГГГГГГГГ – ГГГГ (разделитель - дефис)ГГГГ – ГГ (разделитель - дефис)когда присутствует anchor_year, часть года должна быть такой же, как параметр года, и должна иметь средство устранения неоднозначностивозвращает пустую строку, если параметры имеют правильную форму; сообщение об ошибке еще]]локальная функция check_years ( год , год привязки )местный y , ay ;если не is_set ( год ), то - год требуется, поэтому возвращать сообщение об ошибке, если не установленвернуть 'missing' .. code_open_tag .. '| year = </code>.' ;конецlocal patterns = { - разрешенные годовые шаблоны из модуля: сноски (снимки добавлены здесь)'^ (% d% d% d% d?)% l? $' , - ГГГ или ГГГГ'^ (n% .d%.)% l? $' , - nd'^ (nd)% l? $' , - nd'^ (c%.% d% d% d% d?)% l? $' , - c. ГГГ или c. ГГГГ'^ (% d% d% d% d–% d% d% d% d)% l? $' , - ГГГГ – ГГГГ'^ (% d% d% d% d–% d% d)% l? $' - ГГГГ – ГГ}for _ , pattern in ipairs ( patterns ) do - пролистываем шаблоныy = год : совпадение ( шаблон ); - y - часть годаесли у тогдаперерыв ; - когда y установлено, мы нашли совпадение, так что готовоконецконецесли не у, товернуть 'invalid' .. code_open_tag .. '| year = </code>.' ; - y не задано, значит год указан неверноконецесли is_set ( anchor_year ), то - anchor_year не является обязательнымfor _ , pattern in ipairs ( patterns ) do - пролистываем шаблоныay = anchor_year : совпадение ( шаблон ); - ау - годовая доляесли ау топерерыв ; - когда установлено ay, мы нашли совпадение, так что готовоконецконецесли не ай тогдавернуть 'invalid' .. code_open_tag .. '| anchor-year </code>.' ; - не задан, значит, anchor_year имеет неверный форматконец- если не anchor_year: match ('% l $'), то- return '' .. code_open_tag .. '| anchor-year = </code> missing dab.'; - anchor_year должен заканчиваться буквой, устраняющей неоднозначность-- конецесли у ~ = ау, тоreturn '' .. code_open_tag .. '| year = </code> /' .. code_open_tag .. '| anchor-year = </code> mismatch.' ; - части года в году и anchor_year должны быть одинаковымиконецконецвозврат '' ; - оба года хорошие; пустая строка для конкатенацииконец- [[-------------------------- <СДЕЛАТЬ _ ИМЯ> --------------- ---------------------------------------------Собирает последнее, первое, ссылку или маску в отображаемое имя участника.]]локальная функция make_name ( последняя , первая , ссылка , маска )местное имя = последний ;если is_set ( первый ), тоname = name .. ',' .. first ; - объединить сначала с последнимконецесли is_set ( ссылка ), тоname = '[[' .. ссылка .. '|' .. имя .. ']]' ; - сформировать вики-ссылку вокруг имениконецесли is_set ( маска ), то - маскировать этого автораесли ToNumber ( маска ) , тоname = string.rep ( '-' , mask ) - сделать строку длиной в mdashещеимя = маска ; - маска не является числом, поэтому используйте текст маскиконецконецвозвращаемое имя ;конец- [[-------------------------- <ЯДРО> ----------------- -------------------------------------------------- ---Собирает различные части, предоставленные шаблоном, в правильно отформатированную промежуточную цитату. Добавляет пунктуациюи текст; включает целое в диапазон с атрибутами id и class.Это создает привязку CITEREF от | last1 = до | last4 = и | year =. Он также создает ссылку CITEREF от | in1 = до| in4 = и | год =. Предполагается, что даты взносов совпадают с датой прилагаемых работ.Параметр года, хотя он и не отображается, по-прежнему требуется для привязки CITEREF.]] ядро локальной функции ( аргументы ) локальный span_open_tag ; - содержит CITEREF и cssместные участники = '' ; - авторы глав или статейлокальный источник = '' ; - список дат редактора / автора, который формирует ссылку CITEREF на полную цитатулокальный in_text = 'В' ;локальный результат ; - сборка вышеуказанного вывода- сформировать якорь CITEREFесли is_set ( args . id ), тоаргументы . id = mw . uri . anchorEncode ( арг . ID )span_open_tag = '<span id = "' .. args . id .. '" class = "citation">' ; - для использования, когда имя участника совпадает с именем источникаещеlocal citeref = 'CITEREF' .. table.concat ( args . citeref ) .. ( is_set ( args [ 'anchor-year' ]) и args [ 'anchor-year' ] или args . year );citeref = mw . uri . anchorEncode ( citeref );span_open_tag = '<span id = "' .. citeref .. '" class = "citation">' ;конец - [[сформировать список отображения участников:если | name-list-style = harv, отображение похоже на {{sfn}} и {{harv}}, от 1 до 4 фамилий;если | display-авторы = пусто или опущено, отображение похоже на cs1 | 2: отображать все имена в последнем, первом порядке если | display-авторы = etal, то отображаются имена всех авторов в последнем, первом порядке и добавляются и др.если значение, присвоенное | display-arguments = меньше, чем количество фамилий авторов, отображает указанное количество имён авторов в последнем, первом порядке, за которым следует et al.]]если 'harv' ~ = args . name_list_style then - список участников стиля cs1 | 2 по умолчаниюместный i = 1 ;местный счет ;местный etal = false ; - когда | display-авторы = совпадает с количеством авторов в списке участниковесли is_set ( args . display_authors ), тоесли 'etal' == args . display_authors : lower (): gsub ( "['%.]" , ' ' ) затем - часть: gsub () делает' etal 'из множества' et al. ' правописание и стилиcount = # args . последний ; - отобразить всех авторов и ...etal = true ; - ... добавить "и др."ещекол = ToNumber ( арг . display_authors ) или 0 ; - 0, если нельзя преобразовать в числоесли 0 > = счет, тоаргументы . err_msg = аргументы . err_msg .. 'недопустимый' .. code_open_tag .. '| display-авторы = </code>' ; - если ноль, то вывести сообщение об ошибкеконецконецесли count > # args . последний затемcount = # args . последний ; - когда | display-авторы = больше, чем количество авторов, используйте количество авторовконецесли count < # args . последний затем - когда | Дисплей- авторы = меньше , чем число авторовetal = true ; - добавить "и др."конецещеcount = # args . последний ; - установить счетчик для отображения всех авторовконецв то время как я <= count делатьесли is_set ( участники ), тоучастники = участники .. '; ' .. make_name ( аргументы . last [ i ], args . first [ i ], args . link [ i ], args . mask [ i ]); - остальные участникиещеучастники = make_name ( аргументы . last [ i ], args . first [ i ], args . link [ i ], args . mask [ i ]); - имя первого участникаконеця = я + 1 ; - поднять индексконецесли true == etal, тоучастники = участники .. 'et al.' ; - добавить и др.elseif 'amp' == args . name_list_style тогдаучастники = участники : gsub ( '; ([^;] +) $' , '&% 1' ) - заменить последний разделитель на '&'конецelse - отображение участников в стиле harv- или sfn по умолчаниюесли 4 <= # args . последний затем - четыре или более помощников (первый следуют и др.)участники = аргументы . последний [ 1 ] .. 'et al.' ;elseif 3 == # аргументы . последний затем - три (показать их всех)участники = аргументы . last [ 1 ] .. ',' .. args . последний [ 2 ] .. '& amp; ' .. args . последний [ 3 ];elseif 2 == # аргументы . последний затем - два (первый и второй)участники = аргументы . последний [ 1 ] .. '& amp; ' .. args . последний [ 2 ];elseif 1 == # аргументы . последний затем - только один (первый)участники = аргументы . последний [ 1 ];ещеаргументы . err_msg = аргументы . err_msg .. 'в списке авторов нет авторов.' ; - этот код используется для поиска дыр в списке; больше не надоконецконец- сформировать исходный список авторов и датесли is_set ( args . in4 ) и is_set ( args . in3 ) и is_set ( args . in2 ) и is_set ( args . in1 ), тоисточник = аргументы . in1 .. 'et al.' ;ElseIf не is_set ( арг . IN4 ) и is_set ( арг . IN3 ) и is_set ( арг . IN2 ) и is_set ( арг . IN1 ) , тоисточник = аргументы . in1 .. ',' .. args . in2 .. '& amp; ' .. args . in3 ;ElseIf не is_set ( арг . IN4 ) и не is_set ( арг . IN3 ) и is_set ( арг . дюйм2 ) и is_set ( арг . IN1 ) , тоисточник = аргументы . in1 .. '& amp; ' .. args . in2 ;ElseIf не is_set ( арг . IN4 ) и не is_set ( Args . IN3 ) и не is_set ( Args . IN2 ) и is_set ( арг . IN1 ) , тоисточник = аргументы . in1 ;ещеаргументы . err_msg = аргументы . err_msg .. 'автор отсутствует в списке источников.'конецsource = source .. '' .. args . open .. args . год .. аргументы . близко ; - добавить год со скобками или без них--собрать вики-ссылку CITEREFлокальный anchor_id ;local target_err_msg ;если '' ~ = args . ref тогдаanchor_id = mw . uri . anchorEncode ( аргумент . ссылка )ещеanchor_id = mw . uri . anchorEncode ( table.concat ({ 'CITEREF' , арг . in1 , арг . in2 , арг . дюйм3 , арг . in4 , арг . год }));конецtarget_err_msg = target_check ( anchor_id , арг . игнорирующие ); - посмотреть, есть ли цель для этого anchor_idsource = '[[#' .. anchor_id .. "|" .. источник .. "]]" ;- объединить вклад с URL-адресом, чтобы сделать внешнюю ссылкуесли args . url ~ = '', затемаргументы . вклад = '[' .. аргументы . url .. '' .. args . вклад .. ']' ; - форматировать внешнюю ссылкуесли args [ 'url-access' ], тоесли lock_icons [ args [ 'url-access' ]], тоаргументы . вклад = table.concat ({ - добавить разметку значка доступа к этому элементу'<span class = "' , - открыть открывающий тег span; классы значков определены в Module: Citation / CS1 / styles.csslock_icons [ args [ 'url-access' ]] [ 1 ], - добавить соответствующий класс значка замка'"title ="' , - и атрибут titlelock_icons [ args [ 'url-access' ]] [ 2 ], - для соответствующей подсказки'">' , - закрыть открывающий тег spanаргументы . вклад ,'</span>' , - и закройте диапазон});конецконецконецесли is_set ( args [ 'год привязки' ]), тоучастники = участники .. '(' .. args [ 'anchor-year' ] .. ')' .. args . sepc ;elseif args . sepc ~ = участники : sub ( - 1 ) и args . sepc .. ']]' ~ = участники : sub ( - 3 ) затемучастники = участники .. аргументы . sepc ; - добавить разделитель, если он не совпадает с последним символом в списке имен (| first = John S. или и др.)конец- страницы и другое место в источникеесли args . p ~ = '' тогдааргументы . p = аргументы . page_sep .. args . p ;elseif args . pp ~ = '' тогдааргументы . p = аргументы . pages_sep .. args . pp ; - args.p не установлен, поэтому используйте его для хранения общей информации о местоположении источникаконец если args . loc ~ = '' тогдааргументы . p = аргументы . p .. ',' .. args . loc ; - добавить arg.loc в args.pконец- заключить сообщения об ошибках в диапазон и добавить ссылку на справкуесли is_set ( args . err_msg ), тоаргументы . err_msg = '<span style = "font-size: 100%" class = "error"> harvc:' .. args . err_msg .. '([[Шаблон: Harvc | help]]) </span>' ;конецесли ',' == аргументы . sepc тогдаin_text = in_text : нижний (); - В стиле CS2 используется нижний регистрконец- и сложить все вместерезультат = span_open_tag .. участники .. '"' .. аргументы . вклад .. '"' .. аргументы . sepc .. in_text .. source .. args . p .. args . ps .. args . err_msg .. target_err_msg .. '</span>' ;вернуть результат ;конец- [[-------------------------- <HARVC> ----------------- -------------------------------------------------- -Точка входа из шаблона {{harvc}}. Получает параметры родительского кадра, выполняет небольшую проверку ошибок]]локальная функция harvc ( фрейм )local args = {err_msg = '' ,page_sep = ", стр. & nbsp;" ,pages_sep = ", стр. & nbsp;" ,sepc = '.' ,ps = '.' ,open = '(' , - годовые скобки для исходного годазакрыть = ')' ,last = {},first = {},ссылка = {},маска = {},citeref = {}}локальный pframe = кадр : getParent (); аргументы . вклад = pframe . аргументы . c или - глава или вкладpframe . аргументы . глава илиpframe . аргументы . вклад или '' ;аргументы . id = pframe . аргументы . id или '' ;аргументы . in1 = pframe . args [ 'in' ] или pframe . аргументы . in1 или '' ; - фамилии редакторов исходного кода; 'in' - зарезервированное ключевое слово Luaаргументы . in2 = PFRAME . аргументы . in2 или '' ;аргументы . in3 = pframe . аргументы . in3 или '' ;аргументы . in4 = pframe . аргументы . in4 или '' ;аргументы . display_authors = pframe . args [ 'отображающие авторы' ]; - количество отображаемых имен участников; cs1 | 2 формат включает именааргументы . name_list_style = pframe . args [ 'стиль-список-имен' ] или '' ; - при установке на 'harv' отображать список участников в стиле sfn или harvаргументы . name_list_style = аргументы . name_list_style : нижний (); - сделайте это агностикомесли is_set ( pframe . args . last ) или is_set ( pframe . args . last1 ) илиis_set ( pframe . args . author ) или is_set ( pframe . args . author1 ) тогда - должно быть хотя бы это, чтобы продолжитьаргументы . последний [ 1 ] = pframe . аргументы . last или pframe . аргументы . last1 или PFRAME . аргументы . автор или pframe . аргументы . author1 ; - получить фамилию первого участникааргументы . citeref [ 1 ] = args . последний [ 1 ]; - добавить в citerefаргументы . first [ 1 ] = pframe . аргументы . first или pframe . аргументы . first1 ; - получить имя первого участникааргументы . ссылка [ 1 ] = pframe . args [ 'автор-ссылка' ] или pframe . аргументы [ 'автор-ссылка1' ]; - получить ссылку на статью первого авторааргументы . маска [ 1 ] = pframe . args [ 'маска-автора' ] или pframe . аргументы [ 'маска автора1' ]; - получить ссылку на статью первого автораместный i = 2 ; - указатель остальных именwhile is_set ( pframe . args [ 'last' .. i ]) или is_set ( pframe . args [ 'author' .. i ]) do - пройти через pframe.args и получить остальные именааргументы . last [ i ] = pframe . args [ 'last' .. i ] или pframe . args [ 'автор' .. я ]; -- фамилииаргументы . first [ i ] = pframe . args [ 'первый' .. я ]; - именааргументы . ссылка [ i ] = pframe . args [ 'автор-ссылка' .. я ]; - ссылкиаргументы . маска [ i ] = pframe . args [ 'маска автора' .. i ]; - маскиесли 5 > i, тоаргументы . citeref [ i ] = args . последний [ я ]; - собрать первые четыре фамилии для якоря CITEREFконецi = i + 1 - поднять индексконецконецаргументы . p = pframe . аргументы . p или pframe . аргументы . страница или '' ; - номер (а) исходной страницы или расположениеаргументы . pp = pframe . аргументы . pp или pframe . аргументы . страницы или '' ;аргументы . loc = pframe . аргументы . loc или '' ;аргументы . ref = pframe . аргументы . ref или pframe . аргументы . Ссылка или '' ; - используется для соответствия | ref = <text> в исходном шаблоне cs1 | 2аргументы . ignore = 'yes' == pframe . аргументы [ 'игнорировать-ошибка' ]; - подавлять ложноположительные ошибки «нет цели»если 'cs2' == pframe . аргументы . тогда режим аргументы . пс = '' ; - установить символ постскрипта в пустую строку, режим cs2аргументы . sepc = ',' ; - установить символ разделителя на запятую, режим cs2конецdo - ограничить область локальной температурылокальная температура = pframe . аргументы . ps или pframe . аргументы . постскриптум ;если is_set ( temp ), тоif 'none' == temp : lower () then - если | ps = none или | postscript = none, тоаргументы . пс = '' ; - без припискиещеаргументы . ps = темп ; - переопределить постскриптум по умолчаниюконецконецend - конец ограничения области действияесли 'да' == pframe . аргументы . nb then - если нет скобок около года в ссылке на шаблон cs1 | 2аргументы . open = '' ; - отключить этиаргументы . закрыть = '' ;конецаргументы . url = pframe . аргументы . url или - url главы или статьиpframe . args [ 'URL-адрес главы' ] илиpframe . args [ 'URL-адрес' ] или '' ;args [ 'url-access' ] = pframe . аргументы [ 'URL-доступ' ];аргументы . год = pframe . аргументы . год или '' ; -- обязательныйargs [ 'год привязки' ] = pframe . args [ 'год привязки' ] или '' ;аргументы . err_msg = аргументы . err_msg .. check_years ( аргумент . год , аргумент [ 'год привязки' ]);если не is_set ( аргумент . вклад ), тоаргументы . err_msg = аргументы . err_msg .. 'требуемый вклад отсутствует.' ; - сообщение об ошибке, если источник не указанаргументы . вклад = аргументы . url ; - если установлено, это даст нам текст с возможностью ссылкиконецесли args . последний [ 1 ] == аргумент . in1 иаргументы . последний [ 2 ] == аргумент . in2 иаргументы . последний [ 3 ] == аргумент . in3 иаргументы . последний [ 4 ] == аргумент . in4 ине is_set ( args . id ), тогдааргументы . err_msg = аргументы . err_msg .. 'required' .. code_open_tag .. '| id = </code> отсутствует параметр.' ; - сообщение об ошибке, если автор и источник совпадаютконецreturn table.concat ({ core ( args ), frame : extensionTag ( 'templatestyles' , '' , { src = 'Module: Citation / CS1 / styles.css' })});конец- [[-------------------------- <ЭКСПОРТИРУЕМЫЕ ФУНКЦИИ> ----------------- -------------------------]]return {harvc = harvc};