aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TODO.org11
-rwxr-xr-xsrc/config.py70
-rwxr-xr-xsrc/i3-colors.py3
3 files changed, 61 insertions, 23 deletions
diff --git a/TODO.org b/TODO.org
index a54c291..4e3ba3c 100644
--- a/TODO.org
+++ b/TODO.org
@@ -1,18 +1,19 @@
#+TITLE: "i3-colors Project Todo List"
#+AUTHOR: "Loic Guegan"
-- Refactoring [1/3]:
+- Refactoring [1/2]:
- [X] Change src/parser.py name => now config.py
- [ ] Improve function/variables names
-- YAML Theme Parser [0/2]:
+- YAML Theme Parser [1/2]:
- [ ] Improve yaml theme loader reliability
- - [ ] Allow several metadata
+ - [X] Allow several metadata
-- Theme applying algorithm [0/3]:
+- Theme applying algorithm [1/3]:
- [ ] Improve efficiency
+ - [ ] Bugs may appear here! Found them...
- [ ] Assume that theme to apply is well formated (checked in YAML Theme Parser)
- - [ ] If there is no "colors" field in "bar" section, we still need to apply theme
+ - [X] If there is no "colors" field in "bar" section, we still need to apply theme
- General [1/2]:
- [ ] Improve user API
diff --git a/src/config.py b/src/config.py
index 3d67ff3..9e2f070 100755
--- a/src/config.py
+++ b/src/config.py
@@ -17,42 +17,80 @@ config_keys=["client.focused",
def contains(r,line):
return(re.match(r,line)!=None)
-def extract_config(config_file):
+def no_comment(line):
+ newline=""
+ for ch in line:
+ if ch=='#':
+ break
+ else:
+ newline+=ch
+ return(newline)
+
+def extract(config_file):
+ """
+ Return a temporary file path containing the current user configuration
+ without any related theme/colors lines.
+ """
f=open(config_file,"r")
tmp=tempfile.NamedTemporaryFile(mode="w",delete=False)
- for line in f:
+
+ in_colors=False
+ for line_orig in f:
+ line=no_comment(line_orig)
is_theme_line=False
for key in config_keys:
if contains(".*"+key+"\s",line):
is_theme_line=True
- if not(is_theme_line):
- tmp.write(line)
-
+ if contains(".*colors",line):
+ in_colors=True
+ beforeColor=re.search(".*colors",line).group(0)[:-6]
+ if len(beforeColor)>0:
+ tmp.write(beforeColor+"\n")
+ if not(is_theme_line) and not(in_colors):
+ tmp.write(line_orig)
+ if contains(".*}",line) and in_colors:
+ in_colors=False
f.close()
tmp.close()
return(tmp.name)
-
+
def safe_get(theme,key):
+ """
+ TODO: To remove (useless now)
+ """
if key in theme:
return(theme[key])
return("")
-def apply_to_config(tmp_config,theme):
+def write_theme(tmp_config,theme):
+ """
+ Write the theme in a temporary file
+ based on tmp_config file.
+ """
f=open(tmp_config,mode="r")
tmp=tempfile.NamedTemporaryFile(mode="w",delete=False)
##### Apply bar theme #####
bar_theme=theme["bar_colors"]
- for line in f:
- if contains(".*colors\s{",line):
- tmp.write(line)
+ in_bar=False
+ for line_orig in f:
+ line=no_comment(line_orig)
+ if contains("(\s)*bar",line):
+ in_bar=True
+ if contains(".*}",line) and in_bar:
+ beforeBrace=re.search(".*}",line).group(0)[:-1]
+ if len(beforeBrace)>0:
+ tmp.write(beforeBrace+"\n")
+ tmp.write(" colors {\n")
for key,value in bar_theme.items():
if not(isinstance(value,dict)):
- tmp.write("\t"+key+" "+value+"\n")
+ tmp.write(" "+key+" "+value+"\n")
else:
- tmp.write("\t"+key+" "+value["border"]+" "+value["background"]+" "+value["text"]+"\n")
+ tmp.write(" "+key+" "+value["border"]+" "+value["background"]+" "+value["text"]+"\n")
+ tmp.write(" }\n}\n")
+ in_bar=False
else:
- tmp.write(line)
+ tmp.write(line_orig)
tmp.close()
f.close()
shutil.move(tmp.name,tmp_config)
@@ -65,8 +103,8 @@ def apply_to_config(tmp_config,theme):
f.close()
-def apply_theme(config_file,theme):
- tmp=extract_config(config_file)
- apply_to_config(tmp,theme)
+def apply(config_file,theme):
+ tmp=extract(config_file)
+ write_theme(tmp,theme)
shutil.move(tmp,config_file)
diff --git a/src/i3-colors.py b/src/i3-colors.py
index 6b51876..925ff3a 100755
--- a/src/i3-colors.py
+++ b/src/i3-colors.py
@@ -1,7 +1,6 @@
#!/usr/bin/python
import config, theme, os, argparse, subprocess
-
##### Utils Functions #####
def log(msg,title=""):
if len(title)>0:
@@ -21,7 +20,7 @@ args = args_parser.parse_args()
##### Apply Theme #####
loaded_theme=theme.load(args.theme_path)
-config.apply_theme(os.environ["HOME"]+"/.config/i3/config",loaded_theme)
+config.apply(os.environ["HOME"]+"/.config/i3/config",loaded_theme)
for meta_key,meta_value in loaded_theme["meta"].items():
log(meta_value,title=meta_key.title())
if args.restart: