local Info = Info or package.loaded.regscript or function(...) return ... end --luacheck: ignore 113/Info local nfo = Info { _filename or ..., name = "Sparkup"; description = "Sparkup fo FAR editor"; version = "0.1.1"; --http://semver.org/lang/ru/ author = "jd"; url = "http://forum.farmanager.com/viewtopic.php?f=7&t=7383"; id = "C729D329-877F-4658-AE59-C592D80311F6"; sparkup = [[ https://github.com/rstacruz/sparkup https://github.com/rstacruz/sparkup/raw/master/sparkup.py]]; --disabled = false; options = { --python = [[D:\Python\python.exe]], python = [[C:\cygwin\bin\python3.4m.exe]], --sparkup_py = [[D:\Python\sparkup.py]], options = "--no-last-newline", mask="*.html", key="CtrlE", menu="Sparkup", }; } if not nfo then return end local O = nfo.options local F = far.Flags local path = (...):match"^.+\\" local cmdline = ('"%s" "%s" %s'):format(O.python or "python",O.sparkup_py or path.."sparkup.py",O.options or "") local SW_HIDE = 0 local function pipe(cmd,input) local outname = far.MkTemp("sprk") local errname = far.MkTemp("err") local fp = io.popen(('"%s >"%s" 2>"%s""'):format(cmd,outname,errname),"w") fp:write(input) fp:close() local err_fi = win.GetFileInfo(errname) local out,err if not err_fi then err = "unable to create temporary files" elseif err_fi.FileSize~=0 then fp = io.open(errname) err = fp:read("*a") fp:close() else local out_fi = win.GetFileInfo(outname) if not out_fi then err = "unable to create temporary files" elseif out_fi.FileSize~=0 then fp = io.open(outname) out = fp:read("*a") fp:close() end end win.ShellExecute(nil,nil,win.GetEnv"COMSPEC",('/c"del "%s" "%s""'):format(outname,errname),nil,SW_HIDE) return out,err end local function Insert(ei,repl,spaces) local eid = ei.EditorID local indent = Editor.Set(4,0) editor.UndoRedo(eid,F.EUR_BEGIN) editor.SetPosition(eid,ei.CurLine,1) editor.SetString(eid,ei.CurLine,"") editor.InsertText(eid,repl:gsub("[^\r\n]+",spaces.."%1")) editor.UndoRedo(eid,F.EUR_END) Editor.Set(4,indent) editor.SetPosition(eid,ei.CurLine,spaces:len()+1) end local function expand() local ei = editor.GetInfo() local eid = ei.EditorID local line,eol = editor.GetString(eid,ei.CurLine,3) local spaces,expr = line:match"(%s*)(%S.*)" if not expr then return end local repl,err = pipe(cmdline,expr) if err then far.Message(win.OemToUtf8(err),nfo.name,nil,"w") else Insert(ei,repl,spaces,eol) end end Macro { description=nfo.name; area="Editor"; key=O.key; --CtrlE filemask=O.mask; id="1640CD33-8163-4FC7-A775-71842177E2F7"; action=expand; } local function ProcessName(mask,filename) return far.ProcessName(F.PN_CMPNAMELIST,mask,filename,F.PN_SKIPPATH) end if O.menu then MenuItem { description=nfo.name; menu="Plugins"; area="Editor"; guid="4A7F0829-12B6-48DD-8D11-835E59A6D951"; text=function() return (not O.mask or ProcessName(O.mask,editor.GetFileName())) and O.menu end; action=expand; } end --[[ table > tr*2 > td.name + td*3 #header > ul > li < p{Footer} --]] --todo history