Modul:CompilerExplorerLink
Zur Navigation springen
Zur Suche springen
Die Dokumentation für dieses Modul kann unter Modul:CompilerExplorerLink/Doku erstellt werden
local CompilerExplorerLink = {}
-- Konvertiert Dezimal-Integer in Hexadezimal-Integer
local function hex(dec)
local hb = math.floor(dec/16)
local lb = dec%16
if lb > 9 then
lb = string.char(lb +55)
end
if hb > 9 then
hb = string.char(hb +55)
end
return hb .. lb
end
-- Wandelt einen String so um, dass er innerhalb einer URL verwendet werden kann
-- Dabei werden Leerzeichen durch + ersetzt und andere Sonderzeichen durch ihren Hex-Code
local function transform(code)
local codestring = ""
if code == nil then
return "";
end
for i = 1, #code, 1 do
local zeichen = code:byte(i)
if (((zeichen >= 48) and (zeichen <=57)) or ((zeichen >= 65) and (zeichen <=90)) or ((zeichen >= 97) and (zeichen <=122))) then
codestring = codestring .. string.char(zeichen)
elseif zeichen == 32 then
codestring = codestring .. "+"
else
codestring = codestring .. "%" .. hex(zeichen)
end
end
return codestring
end
-- Erzeugt eine URL zum Compiler Explorer
-- für jede "Datei" wird ein Eintrag in den Arrays "code" (der Inhalt der Datei)
-- und "filename" (der Name der Datei) benötigt.
-- Optionen können weggelassen werden. in diesem fall werden Standardwerte benutzt.
local function convert(code, filename, options)
local coptions = ""
local compiler = "cg122"
local execargs = "1"
local execstdin = "1"
local wrap = "1"
local compout = "0"
local cpanel = "0"
if options ~= nil then
if options.coptions ~= nil then
coptions = options.coptions
end
if options.compiler ~= nil then
compiler = options.compiler
end
if (options.execargs == "1") or (options.execargs == "0") then
execargs = options.execargs
end
if (options.execstdin == "1") or (options.execstdin == "0") then
execstdin = options.execstdin
end
if (options.wrap == "1") or (options.wrap == "0") then
wrap = options.wrap
end
if (options.compout == "1") or (options.compout == "0") then
compout = options.compout
end
if (options.cpanel == "1") or (options.cpanel == "0") then
cpanel = options.cpanel
end
end
local url = "https://www.godbolt.org/#g:!((g:!("
for i = 1, #filename, 1 do
if filename[i] == "main.c" then
filename[i] = "example.c"
end
url = url .. "(g:!((h:codeEditor,i:(filename:" .. filename[i] .. ",fontScale:14,fontUsePx:'0',j:" .. i .. ",lang:___c,selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:'" .. transform(code[i]) .. "'),l:'5',n:'0',o:" .. filename[i] .. ",t:'0')),header:(),k:" .. (100/(#filename+1)) .. ",l:'4',m:100,n:'0',o:'',s:0,t:'0'),"
end
url = url .. "(g:!((g:!((h:tree,i:(cmakeArgs:'',compilerLanguageId:___c,customOutputFilename:'',files:!(";
for i = 1, #filename, 1 do
url = url .. "(editorId:" .. i .. ",fileId:" .. i .. ",filename:" .. filename[i] .. ",g:'',isIncluded:'0',isMainSource:'"
if filename[i] == "example.c" then
url = url .. "0"
else
url = url .."1"
end
url = url .. "',isOpen:'0',langId:'')"
if i < #filename then
url = url .. ","
end
end
url = url .. "),isCMakeProject:'1',j:1,newFileId:" .. (#filename+1) .. "),l:'5',n:'0',o:'Tree+%231',t:'0')),header:(),l:'4',m:50,n:'0',o:'',s:0,t:'0'),(g:!((h:executor,i:(argsPanelShown:'" .. execargs .. "',compilationPanelShown:'" .. cpanel .. "',compiler:" .. compiler .. ",compilerOutShown:'" .. compout .. "',execArgs:___,execStdin:'',fontScale:14,fontUsePx:'0',j:1,lang:___c,libs:!(),options:'" .. transform(coptions) .. "',source:'1',stdinPanelShown:'" .. execstdin .. "',tree:1,wrap:'" .. wrap .. "'),l:'5',n:'0',o:'Executor+(C,+Tree+%231)',t:'0')),header:(),k:50,l:'4',m:50,n:'0',o:'',s:0,t:'0')),k:" .. (100/(#filename+1)) .. ",l:'3',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4";
return url
end
-- Hauptprogramm: Erzeugt einen Link zum Compiler Explorer
-- die Quellcodes müssen in einem Array namens "code" und
-- die Dateinamen in einem Array namens "name" in der Vorlage angegeben werden
-- in der Table "options" können die Optionen
-- coptions, compiler, execargs, execstdin, wrap, compout, cpanel mit anderen Werten belegt werden
-- coptions wird für die Compiler-Optionen verwendet (standardmäßig "")
-- compiler enthält den Namen des verwendeten Compilers (standardmäßig "cg122")
-- execargs gibt an, ob die Execution Arguments angezeigt werden (standardmäßig "1")
-- execstdin gibt an, ob das Execution stdin angezeigt wird (standardmäßig "1")
-- wrap gibt an, ob es einen automatischen Zeilenumbruch gibt (standardmäßig "1")
-- compout gibt an, ob der Compiler Output angezeigt wird (standardmäßig "0")
-- cpanel gibt an, ob die Compiler Options angezeigt werden (standardmäßig "0")
-- Achtung: eine "1" bedeutet hier "false" und eine "0 "true"
-- Achtung: Innerhalb des Quellcodes nur doppelte Anführungszeichen verwenden,
-- da einfache Anführngszeichen in der URL für die einzelnen Werte verwendet werden.
function CompilerExplorerLink.createLink(frame)
local link = mw.html.create( "a" )
link:attr( "href", convert(frame.args.code,frame.args.name,frame.args.options) )
:wikitext( linkname )
return tostring( link )
end
return CompilerExplorerLink