summaryrefslogtreecommitdiff
path: root/awesome/lib/menubar/index_theme.lua
diff options
context:
space:
mode:
Diffstat (limited to 'awesome/lib/menubar/index_theme.lua')
-rw-r--r--awesome/lib/menubar/index_theme.lua164
1 files changed, 164 insertions, 0 deletions
diff --git a/awesome/lib/menubar/index_theme.lua b/awesome/lib/menubar/index_theme.lua
new file mode 100644
index 0000000..633964a
--- /dev/null
+++ b/awesome/lib/menubar/index_theme.lua
@@ -0,0 +1,164 @@
+---------------------------------------------------------------------------
+--- Class module for parsing an index.theme file
+--
+-- @author Kazunobu Kuriyama
+-- @copyright 2015 Kazunobu Kuriyama
+-- @classmod menubar.index_theme
+---------------------------------------------------------------------------
+
+-- This implementation is based on the specifications:
+-- Icon Theme Specification 0.12
+-- http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-0.12.html
+
+local ipairs = ipairs
+local setmetatable = setmetatable
+local string = string
+local table = table
+local io = io
+
+-- index.theme groups
+local ICON_THEME = "Icon Theme"
+-- index.theme keys
+local DIRECTORIES = "Directories"
+local INHERITS = "Inherits"
+-- per-directory subkeys
+local TYPE = "Type"
+local SIZE = "Size"
+local MINSIZE = "MinSize"
+local MAXSIZE = "MaxSize"
+local THRESHOLD = "Threshold"
+
+local index_theme = { mt = {} }
+
+--- Class constructor of `index_theme`
+-- @tparam table cls Metatable that will be used. Should always be `index_theme.mt`.
+-- @tparam string icon_theme_name Internal name of icon theme
+-- @tparam table base_directories Paths used for lookup
+-- @treturn table An instance of the class `index_theme`
+index_theme.new = function(cls, icon_theme_name, base_directories)
+ local self = {}
+ setmetatable(self, { __index = cls })
+
+ -- Initialize the fields
+ self.icon_theme_name = icon_theme_name
+ self.base_directory = nil
+ self[DIRECTORIES] = {}
+ self[INHERITS] = {}
+ self.per_directory_keys = {}
+
+ -- base_directory
+ local basedir = nil
+ local handler = nil
+ for _, dir in ipairs(base_directories) do
+ basedir = dir .. "/" .. self.icon_theme_name
+ handler = io.open(basedir .. "/index.theme", "r")
+ if handler then
+ -- Use the index.theme which is found first.
+ break
+ end
+ end
+ if not handler then
+ return self
+ end
+ self.base_directory = basedir
+
+ -- Parse index.theme.
+ while true do
+ local line = handler:read()
+ if not line then
+ break
+ end
+
+ local group_header = "^%[(.+)%]$"
+ local group = line:match(group_header)
+ if group then
+ if group == ICON_THEME then
+ while true do
+ local item = handler:read()
+ if not item then
+ break
+ end
+ if item:match(group_header) then
+ handler:seek("cur", -string.len(item) - 1)
+ break
+ end
+
+ local k, v = item:match("^(%w+)=(.*)$")
+ if k == DIRECTORIES or k == INHERITS then
+ string.gsub(v, "([^,]+),?", function(match)
+ table.insert(self[k], match)
+ end)
+ end
+ end
+ else
+ -- This must be a 'per-directory keys' group
+ local keys = {}
+
+ while true do
+ local item = handler:read()
+ if not item then
+ break
+ end
+ if item:match(group_header) then
+ handler:seek("cur", -string.len(item) - 1)
+ break
+ end
+
+ local k, v = item:match("^(%w+)=(%w+)$")
+ if k == SIZE or k == MINSIZE or k == MAXSIZE or k == THRESHOLD then
+ keys[k] = tonumber(v)
+ elseif k == TYPE then
+ keys[k] = v
+ end
+ end
+
+ -- Size is a must. Other keys are optional.
+ if keys[SIZE] then
+ -- Set unset keys to the default values.
+ if not keys[TYPE] then keys[TYPE] = THRESHOLD end
+ if not keys[MINSIZE] then keys[MINSIZE] = keys[SIZE] end
+ if not keys[MAXSIZE] then keys[MAXSIZE] = keys[SIZE] end
+ if not keys[THRESHOLD] then keys[THRESHOLD] = 2 end
+
+ self.per_directory_keys[group] = keys
+ end
+ end
+ end
+ end
+
+ handler:close()
+
+ return self
+end
+
+--- Table of the values of the `Directories` key
+-- @treturn table Values of the `Directories` key
+index_theme.get_subdirectories = function(self)
+ return self[DIRECTORIES]
+end
+
+--- Table of the values of the `Inherits` key
+-- @treturn table Values of the `Inherits` key
+index_theme.get_inherits = function(self)
+ return self[INHERITS]
+end
+
+--- Query (part of) per-directory keys of a given subdirectory name.
+-- @tparam table subdirectory Icon theme's subdirectory
+-- @treturn[1] string Value of the `Type` key
+-- @treturn[2] number Value of the `Size` key
+-- @treturn[3] number VAlue of the `MinSize` key
+-- @treturn[4] number Value of the `MaxSize` key
+-- @treturn[5] number Value of the `Threshold` key
+function index_theme:get_per_directory_keys(subdirectory)
+ local keys = self.per_directory_keys[subdirectory]
+ return keys[TYPE], keys[SIZE], keys[MINSIZE], keys[MAXSIZE], keys[THRESHOLD]
+end
+
+index_theme.mt.__call = function(cls, icon_theme_name, base_directories)
+ return index_theme.new(cls, icon_theme_name, base_directories)
+end
+
+return setmetatable(index_theme, index_theme.mt)
+
+-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80