local file_path, image_path = ... require("_common_template")(...) local cairo = require("lgi").cairo local shape = require("gears.shape") local wibox = require("wibox") local beautiful = require("beautiful") -- Make the path relative. local path = image_path:match("/(images/[^/]+)$") if not path then path = image_path:match("/(raw_images/[^/]+)$"):gsub("raw_", "") end local relative_image_path = "../" .. path -- This template generates an HTML table with how other classes are associated -- with a given class. local function gen_class(name) return wibox.widget { { { { valign = "center", align = "center", markup = ""..name.."", widget = wibox.widget.textbox }, fg = "#ffffff", bg = beautiful.bg_normal, widget = wibox.container.background, }, nil, nil, widget = wibox.layout.align.vertical, }, shape = function(cr,w,h) shape.partially_rounded_rect(cr,w,h, true,true,false,false,5) end, forced_width = 75, border_width = 1, border_strategy = "inner", border_color = beautiful.border_color, bg = "#00000000", widget = wibox.container.background } end local function gen_arrow(association) local w = wibox.widget.base.make_widget() function w:fit(_, width, _) return width, 15 end function w:draw(_, cr, width, height) cr:set_line_width(1.5) cr:move_to(0, height/2) cr:line_to(width-(association == "association" and 0 or 40), height/2) cr:stroke() if association ~= "association" then cr:set_antialias(cairo.ANTIALIAS_SUBPIXEL) cr:set_line_width(1) cr:translate(0,2) width, height = width-2, height-4 cr:move_to(width-40, height/2) cr:line_to(width-20, 0 ) cr:line_to(width , height/2) cr:line_to(width-20, height ) cr:line_to(width-40, height/2) cr:close_path() if association == "composition" then cr:fill() else cr:stroke() end end end w.forced_height = 15 return w end local function arrow_widget(dir) local w = wibox.widget.base.make_widget() function w:fit(_, width, _) return width, 5 end function w:draw(_, cr, width, height) cr:translate(10, 0) width = width - 20 cr:set_source_rgba(0,0,0,0.2) cr:set_line_width(1) cr:move_to(0, height/2) cr:line_to(width,height/2) cr:stroke() if dir == "left" then cr:move_to(height/2, 0) cr:line_to(0, height/2) cr:line_to(height/2, height) cr:stroke() else cr:move_to(width-height/2, 0) cr:line_to(width, height/2) cr:line_to(width-height/2, height) cr:stroke() end end return w end local function gen_table_uml(entry, class1, class2, revert) local left = revert and entry.right or entry.left local right = revert and entry.left or entry.right return wibox.widget { gen_class(class2), { { { text = " "..left.card, widget = wibox.widget.textbox }, arrow_widget "left", { wrap = "char", markup = left.msg.." .", widget = wibox.widget.textbox }, spacing = 5, layout = wibox.layout.align.horizontal }, gen_arrow(entry.composition), { { wrap = "char", markup = right.msg.." .", widget = wibox.widget.textbox }, arrow_widget "right", { text = right.card.." ", widget = wibox.widget.textbox }, spacing = 5, layout = wibox.layout.align.horizontal }, layout = wibox.layout.fixed.vertical, }, gen_class(class1), layout = wibox.layout.align.horizontal } end local map = { to = function(o) return "Acquire other objects from a "..o end, from = function(o) return "Acquire a "..o.." from other objects" end } local function gen_table_header(title, o) print([[
]]) end local function get_table_row(path, class, prop) print([[]]) end local function get_table_footer() print '
]]..map[title](o)..[[
ClassProperty
]].. class ..[[]].. prop ..[[
' end local module = {} local counter = 1 function module.generate_nav_table(t) assert(t.content and t.class) print("\n\nCore components relationship\n===\n") print('
') -- Validate early to avoid debugging cryptic backtraces. for _, tab in ipairs {"to", "from"} do gen_table_header(tab, t.class) for _, entry in ipairs(t.content) do if entry[tab.."_property"] then assert(entry.left and entry.right and entry.association) assert(entry.class) assert(entry.left.msg and entry.left.card) assert(entry.right.msg and entry.right.card) local path = relative_image_path..counter..".svg" local fpath = image_path..counter..".svg" local widget = gen_table_uml(entry, t.class, entry.class, false) wibox.widget.draw_to_svg_file(widget, fpath, 320, 50) get_table_row(path, entry.class, entry[tab.."_property"]) counter = counter + 1 end end get_table_footer() end -- End the last section and add a footer print([[
Legend: c: a client object, t: a tag object, s: a screen object, k: an awful.key object, b: a awful.button object, n: a naughty.notification object
]]) end loadfile(file_path)(module) -- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80