Содержит функции для отладки модулей lua . Позволяет собирать и просматривать значения нескольких переменных и/или точек в вашей программе lua, из модуля (что обычно) или из нескольких модулей (которые требуются от основного модуля).
Он спроектирован так, что его функции вызываются из модуля, который должен быть отлажен, вызовы, которые должны быть частью кода (модуля, который вы разработали или который вы хотите улучшить или адаптировать) до тех пор, пока вы не решите удалить их (когда вы уже определили ошибку). Таким образом, вам не нужно вызывать какие-либо из его функций из invoke.
локальный SD = require "Module:SimpleDebug" return SD . v ( 'Здесь достигнуто' )
возвращает:
Здесь достигнуто
локальный SD = требуется "Module:SimpleDebug" SD . dec = 2 возвращает SD . v ( 1 / 3 )
возвращает:
0,33
локальный SD = require "Module:SimpleDebug" SD . nohtml = true return SD . v ( "<b>жирный</b>" )
возвращает:
"⪡b⪢жирный⪡/b⪢"
локальный SD = require "Module:SimpleDebug" SD . plaintext = true return SD . v ( "<b>жирный</b>" )
возвращает:
"смелый"
локальный SD = require "Module:SimpleDebug" локальный a = 12 локальный b = 'Hello' return SD . v ( a , b )
возвращает:
12 • «Привет»
локальный SD = require "Module:SimpleDebug" локальный a = true return SD . v ( a , b )
возвращает:
правда • ноль
локальный SD = require "Module:SimpleDebug" локальный a = { 1 , tab = 'a' , 'b' } return SD . v ( a )
возвращает: { 1, "b", [tab]="a", }
локальный SD = требуется "Module:SimpleDebug" локальный a = {{ 1 , 2 , 3 },{ 4 , 5 , 6 },{ 7 , 8 , 9 }} возвращает SD . v ( a )
возвращает:
{ [1] = {1, 2, 3, }, [2] = {4, 5, 6, }, [3] = {7, 8, 9, },}
локальный SD = require "Module:SimpleDebug" локальный a = {{ Первый = 1 , 2 , 3 },{ 4 , Второй = 5 , 6 },{ 7 , 8 , 9 }} вернуть SD . v ( a )
возвращает:
{ [1] = {2, 3, [Первый]=1, }, [2] = {4, 6, [Второй]=5, }, [3] = {7, 8, 9, },}
локальный SD = требуется "Module:SimpleDebug" SD . tab . allidx = true локальный a = {{ 1 , 2 , 3 },{ 4 , nil , 6 },{ 7 , 8 , 9 }} возвращает SD . v ( a )
возвращает:
{ [1]={[1]=1, [2]=2, [3]=3, }, [2]={[1]=4, [3]=6, }, [3]={[1]=7, [2]=8, [3]=9, },}
Обычно эти функции реализуются с помощью функции ошибки:
локальный SD = требуется "Module:SimpleDebug" локальный a = {{ 1 , 2 , 3 },{ 4 , 5 , 6 },{ 7 , 8 , 9 }} ошибка ( SD . v ( a ))
отображает:
Ошибка Lua:Модуль: ВашМодуль : Строка :{
[1] = {1, 2, 3, },
[2] = {4, 5, 6, },
[3] = {7, 8, 9, },
}
локальный SD = require "Module:SimpleDebug" SD . tab . oneline = false локальный a = {{ Первый = 1 , 2 , 3 }, 'Средний' ,{ 4 , Второй = 5 , 6 }} return SD . v ( a )
реторна:
{ [1] = { [1] = 2, [2] = 3, ["Первый"] = 1, }, [2] = "Средний", [3] = { [1] = 4, [2] = 6, ["Второй"] = 5, },}
локальный SD = require "Module:SimpleDebug" локальный a = 12 локальный b = 'Hello' return SD . nv ( 'a' , a , 'b' , b )
возвращает:
а: 12 • б: "Привет"
локальная SD = require "Module:SimpleDebug" локальная вкладка = { 1 , 12 , 7 } function p . CheckValues () локальная функция LittleNum () SD . wtos ( 'маленькое число' ) end локальная функция BigNum ( num ) SD . wtos ( 'big=' .. num ) end for i , num in ipairs ( tab ) do if num > 9 then BigNum ( num ) else LittleNum () end end error ( SD . s ) end
возвращает:
Lua Ошибка:Модуль: Ваш модуль : Строка :
маленькое число
большой=12
небольшое число.
локальная SD = требуется функция " Module : SimpleDebug " Increm ( ) локальная n = 0 для i = 1 , 3 сделать n = n + 2 SD.vtos ( n ) конец конец SD.counter = true Increm ( ) вернуть SD.s
возвращает:
1 • 2
2 • 4
3 • 6
локальный SD = require "Module:SimpleDebug" a = 12 b = 'Привет' SD.vtos ( 1 , a , b ) a = a + a b = b .. ' мир !' SD.vtos ( ' Наконец - то ' , a , b ) return SD.s
возвращает:
1 => 12 • "Привет"
Наконец => 24 • "Привет, мир!"
local SD = require "Module:SimpleDebug" SD . breakline () a = 12 b = 'Привет' c = false SD . nvtos ( 1 , 'a' , a , 'b' , b , 'c' , c ) a = a + a b = b .. ' мир!' SD . nvtos ( 'Наконец-то' , 'a' , a , 'b' , b ) error ( SD . s )
отображает:
Ошибка Lua:Модуль: ВашМодуль : Строка :
1 => a: 12 • b: "Привет" • c: ложь
Наконец => a: 24 • b: "Привет, мир!"
локальный SD = require " Module : SimpleDebug " SD.breakline ( ) SD.enabled = false SD.maxlines.num = 3 локальный a = ' AA ' for i = 1 , 10 do a = a + ' AA ' if i == 3 then SD.enabled = true end SD.nvtos ( i , string.len ( a ) , a ) end
отображает:
Ошибка Lua:Модуль: ВашМодуль : Строка :
3 => 8 • "АААААААА"
4 => 10 • "ААААААААА"
5 => 12 • "ААААААААААА".
--2020-06-16 исправлена ошибка, когда vtos(nil) отображал два nil --2020-06-08 если переменная является функцией, теперь отображается как функция (перед "function") --2020-06-06 исправлена ошибка, которая иногда возникает, когда значение == nil local p = {} p . s = '' p . tab = { oneline = true , allidx = false , } p . dec = - 1 p . maxlines = { num = 100 , doerror = true , } p . enabled = true p . nowiki = false p . nohtml = false p . _plaintext = false p . counter = false local LinCount = 0 local vep = ' • ' local function MessRaised ( n ) return ' \n\n Достигнуто значение ' .. n .. ', вы можете изменить этот предел с помощью "maxlines.num".' end local function arrow () return ' => ' end function p . breakline () LinCount = LinCount + 1 p . s = p . s .. ' \n\n ' if p . counter then p . s = p . s .. LinCount .. vep end if ( LinCount > p . maxlines . num ) and p . maxlines . doerror then p . pa = p . s .. MessRaised ( p . maxlines . num ) error ( p . s , 0 ) end end --breakline local function CheckWhereName ( wn , what ) if wn == nil then return '"' .. what .. '" == nil' elseif ( type ( wn ) == "table" ) then return 'Table as "' .. what .. '"!' else return wn end end --CheckWhereName function p . _plain ( text ) --Изменено с "Module:Plain text" if not text then return end text = mw . text . killMarkers ( text ) : gsub ( ' ' , ' ' ) -- заменить nbsp пробелы на обычные пробелы : gsub ( '<br ?/?>' , ', ' ) -- заменить br запятыми : gsub ( '<span.->(.-)</span>' , '%1' ) -- удалить пробелы, сохранив текст внутри : gsub ( '<b>(.-)</b>' , '%1' ) -- удалить полужирный шрифт, сохранив текст внутри : gsub ( '<i>(.-)</i>' , '%1' ) -- удалить курсив, сохранив текст внутри : gsub ( '<sub>(.-)</sub>' , '%1' ) -- удалить полужирный шрифт, сохранив текст внутри : gsub ( '<sup>(.-)</sup>' , '%1' ) -- удалить жирный шрифт, сохранив текст внутри : gsub ( '<.->.-<.->' , '' ) -- удалить оставшиеся теги и текст внутри : gsub ( '<.->' , '' ) -- удалить любую другую разметку тегов :gsub ( '%[%[%s*[Ff]ile%s*:.-%]%]' , '' ) --удалить файлы : gsub ( '%[%[%s*[Ii]mage%s*:.-%]%]' , '' ) --удалить использование изображения: : gsub ( '%[%[%s*[Cc]ategory%s*:.-%]%]' , '' ) --удалить категории : gsub ( '%[%[[^%]]-|' , '' ) --удалить переданный текст ссылки : gsub ( '[%[%]]' , '' ) --затем удалить оставшиеся [ и ] : gsub ( "'''''" , "" ) --удалить жирную курсивную разметку : gsub ( "'''?" , "" ) --не удалять '''' дает правильный вывод для жирного текста в кавычках : gsub ( '----' , '' ) --удалить ---- строки : gsub ( " ^ % s+" , " " ) --удалить начальные : gsub ( " % s + $ " , " " ) --и конечные пробелы : gsub ( " % s +" , " " ) --удалить избыточные пробелы return text end --plain function p._plain_len ( text ) return mw.ustring.len ( p._plain ( text ) ) end function p.plain ( frame ) return p._plain ( frame.args [ 1 ] ) end function p.plain_len ( frame ) return p._plain_len ( frame.args [ 1 ] ) end local function totext ( text ) if p._plaintext then return p ._plain ( текст ) иначе вернуть текст конец конец --totext локальная функция NumToStr ( N ) если ( p . dec == - 1 ) или ( N == math. floor ( N )) то вернуть строку ( N ) иначе вернуть строку ( math. floor ( ( N * 10 ^ p . dec ) + 0.5 ) / ( 10 ^ p . dec )) конец конец --NumToStr local iniTab1Line = true функция p . containsTab ( avar ) local result = false for k , v in pairs ( avar ) do if type ( v ) == 'table' then result = true break end end return result end --containsTab local var local function DumTab ( tbl , indent ) if not indent then indent = 1 end local toprint = "{ \r\n " indent = indent + 2 for k , v in pairs ( tbl ) do toprint = toprint .. string.rep ( " " , indent ) local id = k if ( type ( k ) == "string" ) then k = '"' .. k .. '"' end toprint = toprint .. "[" .. k .. "] = " if ( type ( v ) == "number" ) then toprint = toprint .. NumToStr ( v ) .. ", \r\n " elseif ( type ( v ) == "string" ) then toprint = toprint .. " \" " .. totext ( v ) .. " \" , \r\n " elseif ( type ( v ) == "table" ) then if iniTab1Line and ( not p . containsTab ( v )) then local wds = '{' for kk , vv in pairs ( v ) do if ( p . tab . allidx == true ) or ( type ( kk ) ~= 'number' ) then wds = wds .. '[' .. kk .. ']=' .. var ( vv ) .. ', ' else wds = wds .. var ( vv ) .. ', ' конец конец toprint = toprint .. wds .. "}, \r\n " иначе toprint = toprint .. DumTab ( v , отступ + 2 ) .. ", \r\n " конец иначе toprint = toprint .. " \" " .. tostring ( v ) .. " \" , \r\n " конец конец toprint = toprint .. string.rep ( " " , отступ - 2 ) .."}" вернуться к концу печати --DumTab function var ( avar ) local EndStr = '' if avar == nil then EndStr = 'nil' elseif type ( avar ) == 'table' then if # avar > 0 then p . s = p . s .. ' \r\n ' end if p . tab . oneline then local wds = '{ ' for k , v in pairs ( avar ) do if ( p . tab . allidx == true ) or ( type ( k ) ~= 'number' ) then wds = wds .. '[' .. k .. ']=' .. var ( v ) .. ', ' else wds = wds .. var ( v ) .. ', ' end end EndStr = wds .. '} ' else EndStr = DumTab ( avar ) end elseif type ( avar ) == 'number' then EndStr = NumToStr ( avar ) elseif type ( avar ) == 'boolean' then if avar == true then EndStr = 'true' else EndStr = 'false' end elseif type ( avar ) == 'function' then EndStr = 'function' else avar = totext ( tostring ( avar )) if p .nohtml тогда avar = string.gsub ( avar , " < " , " ⪡ " ) avar = string.gsub ( avar , " > " , " ⪢ " ) end EndStr = ' " ' .. avar .. ' " ' end return EndStr end --var function p.w ( where ) if p.enabled then return CheckWhereName ( where , ' w ' ) end end --w local function varx ( avar ) iniTab1Line = p.tab.oneline if p.tab.oneline and ( type ( avar ) == ' table ' ) then p.tab.oneline = not p.containsTab ( avar ) end local ss = var ( avar ) p.tab.oneline = iniTab1Line return ss end --varx function p.v ( ... ) if p .включено тогда локальный str = '' если # arg == 0 тогда str = 'nil' иначе локальный c = 0 для k , i в ipairs ( arg ) do c = k end --error (c) для i = 1 , # arg do если str ~= '' тогда str = str .. vep end str = str .. varx ( arg [ i ]) end end return str end end --v function p . wv ( where , ...) if p . enabled then return CheckWhereName ( where , 'w' ) .. arrow () .. p . v ( unpack ( arg )) end end --wv function p . nv (...) if p . enabled then if math . mod ( # arg , 2 ) ~= 0 then EndStr = ' Любой параметр не имеет имени или переменной' else local s = '' local IsName = true function Concat ( wds ) if s ~= '' then if IsName then s = s .. vep else s = s .. ': ' end end s = s .. wds end for i = 1 , # arg do if IsName then Concat ( CheckWhereName ( arg [ i ], 'n' )) IsName = false else Concat ( varx ( arg [ i ])) IsName = true end end EndStr = s end return EndStr end end --nv function p . wnv ( where , ...) if p . enabled then return CheckWhereName ( where , 'w' ) .. arrow () .. p . nv ( unpack ( arg )) end end ---------- локальная функция EnabAndBl () if p . enabled then if LinCount < p . maxlines . num then p . breakline () return true else p . s = p . s .. MessRaised ( p . maxlines . num ) error ( p . s ) return false end else return false end end --EnabAndBl function p . wtos ( where ) if EnabAndBl () then p . s = p . s .. p . w ( where ) end end --wtos function p . vtos (...) if EnabAndBl () then local end_nil_count = arg [ "n" ] - # arg p . s = p . s .. p . v ( unpack ( arg )) если # arg == 0 then end_nil_count = end_nil_count - 1 end for i = 1 , end_nil_count do p . s = p . s .. vep .. 'nil' end end end --vtos function p . wvtos ( where , ...) if EnabAndBl () then p . s = p . s .. p . wv ( where , unpack ( arg )) end end --wvtos function p.nvtos ( ... ) if EnabAndBl ( ) then local end_nil_count = arg [ " n " ] - # arg if end_nil_count > 0 then for i = 1 , arg [ " n " ] do if math.mod ( i , 2 ) ~ = 0 then p.s = p.s..arg [ i ] .. ' : ' else p.s = p.s..p.v ( arg [ i ] ) if i < arg [ " n " ] then p.s = p.s..vep end end end else p.s = p.s..p.nv ( unpack ( arg ) ) end end end --nvtos function p .wnvtos ( где , ... ) if EnabAndBl ( ) then local end_nil_count = arg [ " n " ] - # arg if end_nil_count > 0 then p.s = p.s .. where .. arrow ( ) for i = 1 , arg [ " n " ] do if math.mod ( i , 2 ) ~ = 0 then p.s = p.s .. arg [ i ] .. ' : ' else p . s = p . s .. p . v ( arg [ i ]) if i < arg [ "n" ] then p . s = p . s .. vep end end end else p . s = p . s .. p . wnv ( where , unpack ( arg )) end end end --wnvtos return p