build: add modified luadoc for use with LuCI sources
[project/luci.git] / build / luadoc / luadoc / util.lua
diff --git a/build/luadoc/luadoc/util.lua b/build/luadoc/luadoc/util.lua
new file mode 100644 (file)
index 0000000..e1058d5
--- /dev/null
@@ -0,0 +1,201 @@
+-------------------------------------------------------------------------------
+-- General utilities.
+-- @release $Id: util.lua,v 1.16 2008/02/17 06:42:51 jasonsantos Exp $
+-------------------------------------------------------------------------------
+
+local posix = require "nixio.fs"
+local type, table, string, io, assert, tostring, setmetatable, pcall = type, table, string, io, assert, tostring, setmetatable, pcall
+
+-------------------------------------------------------------------------------
+-- Module with several utilities that could not fit in a specific module
+
+module "luadoc.util"
+
+-------------------------------------------------------------------------------
+-- Removes spaces from the begining and end of a given string
+-- @param s string to be trimmed
+-- @return trimmed string
+
+function trim (s)
+       return (string.gsub(s, "^%s*(.-)%s*$", "%1"))
+end
+
+-------------------------------------------------------------------------------
+-- Removes spaces from the begining and end of a given string, considering the
+-- string is inside a lua comment.
+-- @param s string to be trimmed
+-- @return trimmed string
+-- @see trim
+-- @see string.gsub
+
+function trim_comment (s)
+       s = string.gsub(s, "^%s*%-%-+%[%[(.*)$", "%1")
+       s = string.gsub(s, "^%s*%-%-+(.*)$", "%1")
+       return s
+end
+
+-------------------------------------------------------------------------------
+-- Checks if a given line is empty
+-- @param line string with a line
+-- @return true if line is empty, false otherwise
+
+function line_empty (line)
+       return (string.len(trim(line)) == 0)
+end
+
+-------------------------------------------------------------------------------
+-- Appends two string, but if the first one is nil, use to second one
+-- @param str1 first string, can be nil
+-- @param str2 second string
+-- @return str1 .. " " .. str2, or str2 if str1 is nil
+
+function concat (str1, str2)
+       if str1 == nil or string.len(str1) == 0 then
+               return str2
+       else
+               return str1 .. " " .. str2
+       end
+end
+
+-------------------------------------------------------------------------------
+-- Split text into a list consisting of the strings in text,
+-- separated by strings matching delim (which may be a pattern).
+-- @param delim if delim is "" then action is the same as %s+ except that
+-- field 1 may be preceeded by leading whitespace
+-- @usage split(",%s*", "Anna, Bob, Charlie,Dolores")
+-- @usage split(""," x y") gives {"x","y"}
+-- @usage split("%s+"," x y") gives {"", "x","y"}
+-- @return array with strings
+-- @see table.concat
+
+function split(delim, text)
+       local list = {}
+       if string.len(text) > 0 then
+               delim = delim or ""
+               local pos = 1
+               -- if delim matches empty string then it would give an endless loop
+               if string.find("", delim, 1) and delim ~= "" then
+                       error("delim matches empty string!")
+               end
+               local first, last
+               while 1 do
+                       if delim ~= "" then
+                               first, last = string.find(text, delim, pos)
+                       else
+                               first, last = string.find(text, "%s+", pos)
+                               if first == 1 then
+                                       pos = last+1
+                                       first, last = string.find(text, "%s+", pos)
+                               end
+                       end
+                       if first then -- found?
+                               table.insert(list, string.sub(text, pos, first-1))
+                               pos = last+1
+                       else
+                               table.insert(list, string.sub(text, pos))
+                               break
+                       end
+               end
+       end
+       return list
+end
+
+-------------------------------------------------------------------------------
+-- Comments a paragraph.
+-- @param text text to comment with "--", may contain several lines
+-- @return commented text
+
+function comment (text)
+       text = string.gsub(text, "\n", "\n-- ")
+       return "-- " .. text
+end
+
+-------------------------------------------------------------------------------
+-- Wrap a string into a paragraph.
+-- @param s string to wrap
+-- @param w width to wrap to [80]
+-- @param i1 indent of first line [0]
+-- @param i2 indent of subsequent lines [0]
+-- @return wrapped paragraph
+
+function wrap(s, w, i1, i2)
+       w = w or 80
+       i1 = i1 or 0
+       i2 = i2 or 0
+       assert(i1 < w and i2 < w, "the indents must be less than the line width")
+       s = string.rep(" ", i1) .. s
+       local lstart, len = 1, string.len(s)
+       while len - lstart > w do
+               local i = lstart + w
+               while i > lstart and string.sub(s, i, i) ~= " " do i = i - 1 end
+               local j = i
+               while j > lstart and string.sub(s, j, j) == " " do j = j - 1 end
+               s = string.sub(s, 1, j) .. "\n" .. string.rep(" ", i2) ..
+                       string.sub(s, i + 1, -1)
+               local change = i2 + 1 - (i - j)
+               lstart = j + change
+               len = len + change
+       end
+       return s
+end
+
+-------------------------------------------------------------------------------
+-- Opens a file, creating the directories if necessary
+-- @param filename full path of the file to open (or create)
+-- @param mode mode of opening
+-- @return file handle
+
+function posix.open (filename, mode)
+       local f = io.open(filename, mode)
+       if f == nil then
+               filename = string.gsub(filename, "\\", "/")
+               local dir = ""
+               for d in string.gfind(filename, ".-/") do
+                       dir = dir .. d
+                       posix.mkdir(dir)
+               end
+               f = io.open(filename, mode)
+       end
+       return f
+end
+
+
+----------------------------------------------------------------------------------
+-- Creates a Logger with LuaLogging, if present. Otherwise, creates a mock logger.
+-- @param options a table with options for the logging mechanism
+-- @return logger object that will implement log methods
+
+function loadlogengine(options)
+       local logenabled = pcall(function()
+               require "logging"
+               require "logging.console"
+       end)
+
+       local logging = logenabled and logging
+
+       if logenabled then
+               if options.filelog then
+                       logger = logging.file("luadoc.log") -- use this to get a file log
+               else
+                       logger = logging.console("[%level] %message\n")
+               end
+
+               if options.verbose then
+                       logger:setLevel(logging.INFO)
+               else
+                       logger:setLevel(logging.WARN)
+               end
+
+       else
+               noop = {__index=function(...)
+                       return function(...)
+                               -- noop
+                       end
+               end}
+
+               logger = {}
+               setmetatable(logger, noop)
+       end
+
+       return logger
+end