প্রতিশ্রুতি হিসাবে, এখানে আমার কায়রো সংস্করণ। ডিরেক্টরিগুলি চালাতে lfs ব্যবহার করে আমি এটি লুয়ার সাথে স্ক্রিপ্ট করেছি। আমি এই ছোট্ট চ্যালেঞ্জগুলিকে ভালবাসি, কারণ তারা আমাকে বেশ কয়েকটি সময় ধরে খনন করতে চাইছিল এমন API গুলি অন্বেষণ করার অনুমতি দেয় ...
lfs এবং লুয়া কায়রো উভয়ই ক্রস-প্ল্যাটফর্ম, সুতরাং এটি অন্যান্য সিস্টেমে কাজ করা উচিত (ফরাসী উইনএক্সপি প্রো এসপি 3 তে পরীক্ষিত)।
আমি গাছটিতে যাওয়ার সময় একটি প্রথম সংস্করণ অঙ্কনের ফাইলের নাম তৈরি করেছি। সুবিধা: কোনও স্মৃতি ওভারহেড নেই। অসুবিধা: আমাকে আগেই চিত্রের আকারটি নির্দিষ্ট করতে হবে, সুতরাং তালিকাগুলি কেটে ফেলা হতে পারে।
সুতরাং আমি এই সংস্করণটি তৈরি করেছিলাম, প্রথমে ডিরেক্টরি ট্রি হাঁটা, এটি একটি লুয়া টেবিলের মধ্যে সঞ্চয় করে। তারপরে, ফাইলগুলির সংখ্যা জেনে, ফিট করার জন্য ক্যানভাস তৈরি করা (কমপক্ষে উল্লম্বভাবে) এবং নামগুলি আঁকুন।
আপনি পিএনজি রেন্ডারিং এবং এসভিজির মধ্যে সহজেই পরিবর্তন করতে পারেন। আধুনিক সমস্যাগুলির সাথে: কায়রো এসভিজির পাঠ্য ক্ষমতাটি ব্যবহার না করে অক্ষরগুলি অঙ্কন করে এটি নিম্ন স্তরে তৈরি করে। ভাল, কমপক্ষে, এটি এমনকি ফন্ট ছাড়া সিস্টেমে সঠিক রেন্ডিংয়ের গ্যারান্টি দেয়। তবে ফাইলগুলি আরও বড় ... আপনি যদি একটি .svgz ফাইল রাখার পরে সংক্ষেপ করে থাকেন তবে সমস্যা নয় Not
অথবা সরাসরি এসভিজি উত্পাদন করা খুব কঠিন হওয়া উচিত নয়, আমি অতীতে এসভিজি উত্পন্ন করতে লুয়া ব্যবহার করেছি।
-- LuaFileSystem <http://www.keplerproject.org/luafilesystem/>
require"lfs"
-- LuaCairo <http://www.dynaset.org/dogusanh/>
require"lcairo"
local CAIRO = cairo
local PI = math.pi
local TWO_PI = 2 * PI
--~ local dirToList = arg[1] or "C:/PrgCmdLine/Graphviz"
--~ local dirToList = arg[1] or "C:/PrgCmdLine/Tecgraf"
local dirToList = arg[1] or "C:/PrgCmdLine/tcc"
-- Ensure path ends with /
dirToList = string.gsub(dirToList, "([^/])$", "%1/")
print("Listing: " .. dirToList)
local fileNb = 0
--~ outputType = 'svg'
outputType = 'png'
-- dirToList must have a trailing slash
function ListDirectory(dirToList)
local dirListing = {}
for file in lfs.dir(dirToList) do
if file ~= ".." and file ~= "." then
local fileAttr = lfs.attributes(dirToList .. file)
if fileAttr.mode == "directory" then
dirListing[file] = ListDirectory(dirToList .. file .. '/')
else
dirListing[file] = ""
end
fileNb = fileNb + 1
end
end
return dirListing
end
--dofile[[../Lua/DumpObject.lua]] -- My own dump routine
local dirListing = ListDirectory(dirToList)
--~ print("\n" .. DumpObject(dirListing))
print("Found " .. fileNb .. " files")
--~ os.exit()
-- Constants to change to adjust aspect
local initialOffsetX = 20
local offsetY = 50
local offsetIncrementX = 20
local offsetIncrementY = 12
local iconOffset = 10
local width = 800 -- Still arbitrary
local titleHeight = width/50
local height = offsetIncrementY * (fileNb + 1) + titleHeight
local outfile = "CairoDirTree." .. outputType
local ctxSurface
if outputType == 'svg' then
ctxSurface = cairo.SvgSurface(outfile, width, height)
else
ctxSurface = cairo.ImageSurface(CAIRO.FORMAT_RGB24, width, height)
end
local ctx = cairo.Context(ctxSurface)
-- Display a file name
-- file is the file name to display
-- offsetX is the indentation
function DisplayFile(file, bIsDir, offsetX)
if bIsDir then
ctx:save()
ctx:select_font_face("Sans", CAIRO.FONT_SLANT_NORMAL, CAIRO.FONT_WEIGHT_BOLD)
ctx:set_source_rgb(0.5, 0.0, 0.7)
end
-- Display file name
ctx:move_to(offsetX, offsetY)
ctx:show_text(file)
if bIsDir then
ctx:new_sub_path() -- Position independent of latest move_to
-- Draw arc with absolute coordinates
ctx:arc(offsetX - iconOffset, offsetY - offsetIncrementY/3, offsetIncrementY/3, 0, TWO_PI)
-- Violet disk
ctx:set_source_rgb(0.7, 0.0, 0.7)
ctx:fill()
ctx:restore() -- Restore original settings
end
-- Increment line offset
offsetY = offsetY + offsetIncrementY
end
-- Erase background (white)
ctx:set_source_rgb(1.0, 1.0, 1.0)
ctx:paint()
--~ ctx:set_line_width(0.01)
-- Draw in dark blue
ctx:set_source_rgb(0.0, 0.0, 0.3)
ctx:select_font_face("Sans", CAIRO.FONT_SLANT_NORMAL, CAIRO.FONT_WEIGHT_BOLD)
ctx:set_font_size(titleHeight)
ctx:move_to(5, titleHeight)
-- Display title
ctx:show_text("Directory tree of " .. dirToList)
-- Select font for file names
ctx:select_font_face("Sans", CAIRO.FONT_SLANT_NORMAL, CAIRO.FONT_WEIGHT_NORMAL)
ctx:set_font_size(10)
offsetY = titleHeight * 2
-- Do the job
function DisplayDirectory(dirToList, offsetX)
for k, v in pairs(dirToList) do
--~ print(k, v)
if type(v) == "table" then
-- Sub-directory
DisplayFile(k, true, offsetX)
DisplayDirectory(v, offsetX + offsetIncrementX)
else
DisplayFile(k, false, offsetX)
end
end
end
DisplayDirectory(dirListing, initialOffsetX)
if outputType == 'svg' then
cairo.show_page(ctx)
else
--cairo.surface_write_to_png(ctxSurface, outfile)
ctxSurface:write_to_png(outfile)
end
ctx:destroy()
ctxSurface:destroy()
print("Found " .. fileNb .. " files")
অবশ্যই, আপনি শৈলী পরিবর্তন করতে পারেন। আমি সংযোগের লাইনগুলি আঁকিনি, এটি প্রয়োজনীয় হিসাবে দেখিনি। আমি এগুলি পরে addচ্ছিকভাবে যুক্ত করতে পারি।