1. 配置模块
默认配置,
用户自定义配置,
命令行配置
优先级从地到高
resolved_egrc_path = get_priority(args.egrc_path, '~/.egrc', None)
egrc_config = get_config_tuple_from_egrc(resolved_egrc_path)
得到的egrc_config配置,
然后和命令行,默认配置遗弃比较。
resolved_examples_dir = get_priority(
args.examples_dir,
egrc_config.examples_dir,
DEFAULT_EXAMPLES_DIR
)
color_config有点特殊,
color_config = None
if resolved_use_color:
default_color_config = get_default_color_config()
color_config = merge_color_configs(
egrc_config.color_config,
default_color_config
)
然后得出最后解析的config,
result = Config(
examples_dir=resolved_examples_dir,
custom_dir=resolved_custom_dir,
color_config=color_config,
use_color=resolved_use_color,
pager_cmd=resolved_pager_cmd
)
2. 寻找命令文件
会从两个目录下分别找相应的markdown文件。
example_dir, custome_dir
def has_default_entry_for_program(program, config):
"""Return True if has standard examples for program, else False."""
if config.examples_dir:
file_path = get_file_path_for_program(
program,
config.examples_dir
)
return os.path.isfile(file_path)
else:
return False
通过将program加'.md'字符串, os.path.isfile判断是否存在。
file_data = ''
if custom_file_path:
file_data += _get_contents_of_file(custom_file_path)
if default_file_path:
file_data += _get_contents_of_file(default_file_path)
if use_color:
colorizer = color.EgColorizer(color_config)
file_data = colorizer.colorize_text(file_data)
page_string(file_data, pager_cmd)
直接读取文件内容, 最后调用colorizer将文本彩色画。
3. 文本彩色化
def colorize_heading(self, text):
return self._color_helper(
text,
'(^#+)(.*)$',
(
self.color_config.pound +
r'\1' +
self.color_config.pound_reset +
self.color_config.heading +
r'\2' +
self.color_config.heading_reset
)
)
def _color_helper(self, text, pattern, repl):
# < 2.7 didn't have the flags named argument.
if sys.version_info[1] < 7:
compiled_pattern = re.compile(pattern, re.MULTILINE)
return re.sub(
compiled_pattern,
repl,
text
)
else:
return re.sub(
pattern,
repl,
text,
flags=re.MULTILINE
)
彩色画文本,实质上是将某些文本前后加上特定字符串,输出就达到彩色的效果。
以colorize_heading为例,是调用re.sub,用正则匹配,然后添加特定字符串。
这里re.sub的用法比较特殊, 使用了'\1', '\2',表示之前的捕获组