#!/usr/bin/env lua local arrr = require 'arrr' local options do local parse = arrr { { "Enable coloured output", "--colour", "-c" }; { "Display hidden files", "--hidden", "-h" }; } options = parse {...} local inspect = require 'inspect' end local structure = {} for line in io.stdin:lines() do local dir = structure for segment in line:gmatch("[^/]+") do if not dir[segment] then dir[segment] = {} end dir = dir[segment] end end local function reshape(input, name) local output = {name = name} for key, value in pairs(input) do if options.hidden or not key:find("^%..+") then table.insert(output, reshape(value, key)) end end table.sort(output, function(a, b) return a.name < b.name end) return output end structure = reshape(structure) local escape do if options.colour then function escape(num, str) return string.format("\x1b[%im%s\x1b[%im", num, str, 0) end else function escape(num, str) return str end end end local function line(line) return escape(37, line) end local function name(tab) local name = tab.name or '.' if #tab > 0 then return escape(33, name) else return escape(0, name) end end local function draw(tab, prefix, first) prefix = prefix or '' first = first or '' print(first .. name(tab)) for index, path in ipairs(tab) do local new do if index < #tab then draw(path, prefix .. line'│ ', prefix .. line'├──') else draw(path, prefix .. line' ', prefix .. line'└──') end end end end for i, value in ipairs(structure) do draw(value) end