⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 templatefileparser.cs

📁 代码模版 codtemplate
💻 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 + -