📄 templatefileparser.cs
字号:
using System;
using System.IO;
using System.Text;
namespace CodeTemplate
{
/// <summary>
/// Summary description for TemplateFileParser.
/// </summary>
internal class TemplateFileParser
{
public TemplateFileParser(String filename)
{
m_filename = filename;
}
public void Parse(TemplateFile parent, TemplatePopupMenu menu)
{
m_parent = parent;
using(m_reader = new StreamReader(m_filename))
{
m_parent.AddFileChangeInfo(m_filename);
String lineBuf;
while((lineBuf = m_reader.ReadLine()) != null)
{
if(lineBuf.Length == 0 || IsComment(lineBuf))
continue;
if(IsInclude(lineBuf))
{
TemplateFileParser parser = new TemplateFileParser(ExtractIncludeFilename(lineBuf));
parser.Parse(parent, menu);
continue;
}
if(IsMenuSeparator(lineBuf))
{
menu.AddSeparator();
continue;
}
if(!IsMenuOpen(lineBuf))
throw new Exception("File must start with a menu definition");
ParseMenu(ExtractMenuName(lineBuf), menu);
}
}
}
private String ExtractMenuName(String lineBuf)
{
return lineBuf.Trim().Substring(Delim.MenuOpen.Length);
}
private Boolean IsMenuOpen(String lineBuf)
{
return lineBuf.IndexOf(Delim.MenuOpen) != -1;
}
private Boolean IsMenuClose(String lineBuf)
{
return lineBuf.IndexOf(Delim.MenuClose) != -1;
}
private Boolean IsMenuSeparator(String lineBuf)
{
return lineBuf.IndexOf(Delim.Separator) != -1;
}
private Boolean IsComment(String lineBuf)
{
return lineBuf.StartsWith(Delim.Comment);
}
private Boolean IsInclude(String lineBuf)
{
return lineBuf.StartsWith(Delim.Include);
}
private String ExtractIncludeFilename(String lineBuf)
{
String includeFile = lineBuf.Substring(Delim.Include.Length).Trim();
String dir = Path.GetDirectoryName(includeFile);
if(dir != String.Empty && Path.IsPathRooted(dir))
return includeFile;
return Path.Combine(Path.GetDirectoryName(m_filename), includeFile);
}
private void ParseMenu(String menuName, TemplatePopupMenu menu)
{
if(menuName.Length == 0)
throw new ArgumentException("Menu name expected", "Menu Name");
String menuID = null;
{
String[] nameParts = menuName.Split('|');
menuName = nameParts[0];
if(nameParts.Length > 1)
menuID = nameParts[1].ToUpper();
}
StringBuilder sb = new StringBuilder();
String lineBuf;
String menuItemText = menuName;
if(menuID != null)
menuItemText = String.Format("{0}\t[{1}]", menuItemText, menuID);
TemplateMenuItem menuItem = menu.EnterScope(menuItemText);
Int32 len = 0;
while((lineBuf = m_reader.ReadLine()) != null)
{
// Only parse include statements found between menudefs
if(len == 0 && IsInclude(lineBuf))
{
TemplateFileParser parser = new TemplateFileParser(ExtractIncludeFilename(lineBuf));
parser.Parse(m_parent, menu);
continue;
}
else if(IsMenuOpen(lineBuf))
{
ParseMenu(ExtractMenuName(lineBuf), menu);
continue;
}
else if(IsMenuSeparator(lineBuf))
{
menu.AddSeparator();
}
else if(IsMenuClose(lineBuf))
{
if(menu.CurrentScope.Count == 0) // If it's not a popup menu
{
sb.Length = len; // Remove extra NewLine at the end
menu.Update(sb.ToString());
m_parent.CacheMenuID(menuID, menuItem);
}
menu.LeaveScope();
break;
}
else
{
sb.Append(lineBuf);
len = sb.Length;
sb.Append(Environment.NewLine);
}
}
}
private String m_filename;
private StreamReader m_reader;
private TemplateFile m_parent;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -