服务器端C#实现的CSS解析器_C#教程

复制代码 代码如下:

using System;
using System.Collections;
using System.Text;
using System.IO;
using System.Collections.Specialized;
using System.Text.RegularExpressions;
using System.Diagnostics;

namespace CSS
{
public class App
{
public static void Main(string[] args)
{
//初始化CSS解析器
CssDocument doc = new CssDocument();
//加载现有CSS文件
doc.Load(Directory.GetCurrentDirectory() + "/test.css");
//修改CSS
doc["body"].Attributes["font-size"] = "12px";
//保存CSS文件
doc.Save(Directory.GetCurrentDirectory() + "/a.css");
Console.Read();
}
}

public class CssParse
{
private string m_source;
private int m_idx;

public static bool IsWhiteSpace(char ch)
{
return( "\t\n\r ".IndexOf(ch) != -1 );
}

public void EatWhiteSpace()
{
while ( !Eof() )
{
if ( !IsWhiteSpace(GetCurrentChar()) )
return;
m_idx++;
}
}

public bool Eof()
{
return(m_idx>=m_source.Length );
}

public string ParseElementName()
{
StringBuilder element = new StringBuilder();
EatWhiteSpace();
while ( !Eof() )
{
if (GetCurrentChar()=='{')
{
m_idx++;
break;
}
element.Append(GetCurrentChar());
m_idx++;
}

EatWhiteSpace();
return element.ToString().Trim();
}

public string ParseAttributeName()
{
StringBuilder attribute = new StringBuilder();
EatWhiteSpace();

while ( !Eof() )
{
if (GetCurrentChar()==':')
{
m_idx++;
break;
}
attribute.Append(GetCurrentChar());
m_idx++;
}

EatWhiteSpace();
return attribute.ToString().Trim();
}

public string ParseAttributeValue()
{
StringBuilder attribute = new StringBuilder();
EatWhiteSpace();
while ( !Eof() )
{
if (GetCurrentChar()==';')
{
m_idx++;
break;
}
attribute.Append(GetCurrentChar());
m_idx++;
}

EatWhiteSpace();
return attribute.ToString().Trim();
}

public char GetCurrentChar()
{
return GetCurrentChar(0);
}

public char GetCurrentChar(int peek)
{
if( (m_idx+peek)<m_source.Length )
return m_source[m_idx+peek];
else
return (char)0;
}

public char AdvanceCurrentChar()
{
return m_source[m_idx++];
}

public void Advance()
{
m_idx++;
}

public string Source
{
get
{
return m_source;
}

set
{
m_source = value;
}
}

public ArrayList Parse()
{
ArrayList elements = new ArrayList();

while (!Eof())
{
string elementName = ParseElementName();

if (elementName == null)
break;

CssElement element = new CssElement(elementName);

string name = ParseAttributeName();
string value = ParseAttributeValue();

while (name != null && value != null)
{
element.Add(name, value);

EatWhiteSpace();

if (GetCurrentChar()=='}')
{
m_idx++;
break;
}

name = ParseAttributeName();
value = ParseAttributeValue();
}

elements.Add(element);
}

return elements;
}
}

public class CssDocument
{
private string _Text;
public string Text
{
get
{
return _Text;
}
set
{
_Text = value;
}
}

private ArrayList _Elements;
public ArrayList Elements
{
get
{
return _Elements;
}
set
{
_Elements = value;
}
}

public CssElement this[string name]
{
get
{
for (int i = 0; i < Elements.Count; i++)
{
if (((CssElement)Elements[i]).Name.Equals(name))
return (CssElement)Elements[i];
}

return null;
}
}

private string _File;
public string File
{
get
{
return _File;
}
set
{
_File = value;
}
}

public CssDocument()
{

}

public void Load(string file)
{
using (StreamReader sr = new StreamReader(file))
{
Text = sr.ReadToEnd();
sr.Close();
}

CssParse parse = new CssParse();
parse.Source = Regex.Replace(Text, @"/\*.*?\*/", "", RegexOptions.Compiled);
Elements = parse.Parse();

}

public void Add(CssElement element)
{
Elements.Add(element);
}

public void Save()
{
Save(this.File);
}

public void Save(string file)
{
using (StreamWriter sw = new StreamWriter(file, false))
{
for (int i = 0; i < Elements.Count; i++)
{
CssElement element = (CssElement)Elements[i];
sw.WriteLine(element.Name + " {");
foreach (string name in element.Attributes.AllKeys)
{
sw.WriteLine("\t{0}:{1};", name, element.Attributes[name]);
}
sw.WriteLine("}");
}
sw.Flush();
sw.Close();
}
}
}

public class CssElement
{
private string _Name;
public string Name
{
get
{
return _Name;
}
set
{
_Name = value;
}
}

private NameValueCollection _Attributes;
public NameValueCollection Attributes
{
get
{
return _Attributes;
}
set
{
_Attributes = value;
}
}

public CssElement(string name)
{
this.Name = name;
Attributes = new NameValueCollection();
}

public void Add(string attribute, string value)
{
Attributes[attribute] = value;
}
}
}

时间: 2024-09-15 19:45:18

服务器端C#实现的CSS解析器_C#教程的相关文章

C语言实现xml构造解析器_C 语言

纯C实现xml构造解析器,所有实现只有一个.c一个.h文件组成,简单易用,易于扩展. #include <string.h> #include <stdio.h> #include <stdlib.h> #include "sxml.h" #define LUA_SCRIPT "function fun()\n\ int a;\n\ a = 10;\n\ return a;\n\ end" int main() { sxml_fi

使用70行Python代码实现一个递归下降解析器的教程_python

 第一步:标记化 处理表达式的第一步就是将其转化为包含一个个独立符号的列表.这一步很简单,且不是本文的重点,因此在此处我省略了很多. 首先,我定义了一些标记(数字不在此中,它们是默认的标记)和一个标记类型:   token_map = {'+':'ADD', '-':'ADD', '*':'MUL', '/':'MUL', '(':'LPAR', ')':'RPAR'} Token = namedtuple('Token', ['name', 'value']) 下面就是我用来标记 `expr`

仅用500行Python代码实现一个英文解析器的教程_python

语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理.自然语言引入了很多意外的歧义,以我们对世界的了解可以迅速地发现这些歧义.举一个我很喜欢的例子: 正确的解析是连接"with"和"pizza",而错误的解析将"with"和"eat"联系在了一起: 过去的一些年,自然语言处理(NLP)社区在语法分析方面取得了很大的进展.现在,小小的 Python 实现可能比广泛应用的 Stanford 解析器表现得更出色. 文章剩下

C#实现Ruby的负数索引器_C#教程

C#实现Ruby的负数索引器 public class InvertibleList<T> : List<T> { public new T this[int index] { get { if (index >= 0) return base[index]; if (Count + index < 0) throw new IndexOutOfRangeException(); return this[Count + index]; } set { if (index

C# IFF图形结构解析代码_C#教程

图形数据区的数据存放也和别的图形文件有天地之区别. 例如 256色图形 第1个字节放的是 前8个相素的最第位 后面依次类推.知道相素的最后一个最底位完毕并补码后 才是相素的底2位. 也就是说 宽为16的图形 第1-2字节 是放最低位 3-4 放的低2位 5-6为3位 ...一直到 15-16 为最高位 24位色 的 也是这样 就是先是 R数据 然后是G流 最后是B 使用方法 复制代码 代码如下: //显示RSB文件 ImageIFF _Iff = new ImageIFF(@"D:\temp\4

tinyxml 常用的C++ XML解析器非常优秀_C 语言

读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译.这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树. DOM模型即文档对象模型,是将整个文档分成多个元素(如书.章.节.段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包

UglifyJS有个超赞的JavaScript解析器

我一直在为Jscex寻找好用的JavaScript解析器,之前我用的是Narcissus,也写过相关文章.不过可惜的是,Narcissus使用了SpiderMonkey的扩展,因此它并不是用ECMAScript 3实现的,无法在IE 8等浏览器中使用.目前Jscex使用的是NarrativeJS中旧版的Narcissus,但是我并不喜欢它输出的AST结构,使用中也发现高级功能里的一些bug,有些食之无味弃之可惜的感觉,而改写新版Narcissus又必须大动干戈.最近我接触到了UglifyJS,发

jsoup v1.6.0发布 一款Java的HTML解析器

jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据.其他方面的改进请看发行说明. jsoup 1.6.0发行说明: jsoup is a Java library for working with real-world HTML. It provides a very convenient API for extracting and manipulati

springMVC4(13)视图解析器分类详解

在<springMVC4(7)模型视图方法源码综合分析>一文中,我们介绍了ModelAndView的用法,它会在控制层方法调用完毕后作为返回值返回,里面封装好了我们的业务逻辑数据和视图对象或视图名 .下一步,视图对象往往会对模型进一步渲染,再由视图解析器进一步解析并向前端发出响应.在下面,我们详细介绍视图和视图解析器的各种分类. 在View接口中,定义了一个核心方法是: void render(Map<String, ?> model, HttpServletRequest req