cssParser
//cssParser.h
#include<iostream>
using namespace std;
struct MyAttribute
{
MyAttribute* next;
string m_strName;
string m_strValue;
MyAttribute()
{
ReSet();
}
void ReSet()
{
m_strName = "";
m_strValue = "";
next = NULL;
}
MyAttribute& operator= (MyAttribute& rhs)
{
if (this != &rhs)
{
m_strName = rhs.m_strName;
m_strValue = rhs.m_strValue;
next = rhs.next;
}
return *this;
}
};
class MyHash
{
public :
private:
};
//cssParser.cpp
#include<iostream>
#include<unistd.h>
#include<fstream>
#include<string>
#include "CssParser.h"
using namespace std;
#define STR_WRITE(x) x, sizeof(x) - 1
MyAttribute* pColorListHead = new MyAttribute();
MyAttribute* pImageListHead = new MyAttribute();
void DeleteMyAttribute(MyAttribute* del)
{
if (!del)
{
return ;
}
DeleteMyAttribute(del->next);
delete del;
}
//0xEF, 0xBB, 0xBF, UTF-8 标记BOM
bool InitializeColorCheckTable(MyAttribute* pHead, string path)
{
ifstream inFile;
string strEqualLeft = "";
string strKey = "";
string strValue = "";
int index = -1;
MyAttribute* pTail = pHead;
inFile.open(path.c_str(), ios::in);
if (NULL == inFile )
{
printf("open file failed");
inFile.close();
return false;
}
while (getline(inFile, strEqualLeft))
{
if (strEqualLeft.length() >2
&& strEqualLeft[0] == 0xEF
&& strEqualLeft[1] == 0xBB
&& strEqualLeft[2] == 0xBF)
{
strEqualLeft = strEqualLeft.substr(3, strEqualLeft.length());
}
if (strEqualLeft.length() >0
&& strEqualLeft[0] == '#')
{
continue;
}
index = (int)strEqualLeft.find_last_of('=') ;
if (-1 == index)
{
continue;
}
strKey = strEqualLeft.substr(0, index);
strValue = strEqualLeft.substr(index+1, strEqualLeft.length());
MyAttribute* pItem = new MyAttribute();
if (!pItem)
{
return false;
}
pItem->m_strName = strKey;
pItem->m_strValue = strValue;
pTail->next = pItem;
pTail = pTail->next;
//cout<<"Key:"<<pItem->m_strName<<" Value:"<<pItem->m_strValue<<endl;
}
inFile.close();
return true;
}
string GetAttribute(string key)
{
MyAttribute *pItem = pColorListHead;
for ( ;
pItem !=NULL;
pItem = pItem->next)
{
if (pItem->m_strName == key)
{
return pItem->m_strValue;
}
}
return "";
}
bool CssColorParser(string strDirectory, string outPath)
{
ifstream inFile;
ofstream outFile;
int index = 0;
int nend = 0;
string StrOneline = "";
string ItemCss = "";
string strEqualLeft = "";
string strIDName="";
string strStyleName="";
string strColorValue="";
inFile.open(strDirectory.c_str(), ios::in);
outFile.open(outPath.c_str(), ios::out);//"./custom.css"
if (NULL == inFile || NULL == outFile)
{
printf("open file[%s] failed outPath[%s]-----\n", strDirectory.c_str(), outPath.c_str());
inFile.close();
outFile.close();
return false;
}
InitializeColorCheckTable(pColorListHead, "./ColorCheckTable.cfg");
outFile.write(STR_WRITE("@charset \"utf-8\";\r\n"));
while (getline(inFile, StrOneline))
{
strEqualLeft = "";
strIDName = "";
strStyleName = "";
strColorValue = "";
if (StrOneline.length() >2
&& StrOneline[0] == 0xEF
&& StrOneline[1] == 0xBB
&& StrOneline[2] == 0xBF)
{
StrOneline = StrOneline.substr(3, StrOneline.length());
}
if (StrOneline.length() >0
&& StrOneline[0] == '#')
{
continue;
}
nend = (int)StrOneline.find_last_of('=') ;
if(nend == -1)
{
continue;
}
//解析=左边的值
strEqualLeft = StrOneline.substr(0, nend);
index = (int)strEqualLeft.find_last_of('.') ;
strIDName = strEqualLeft.substr(0, index);
strIDName = GetAttribute(strIDName);
if (strIDName == "")
{
continue;
}
strStyleName = strEqualLeft.substr(index+1, strEqualLeft.length());
//解析=右边的值
strColorValue = StrOneline.substr(nend+1, StrOneline.length());
int cutIndex = 0;
cutIndex = strColorValue.find_last_of('\r');
if (cutIndex != -1)
{
strColorValue = strColorValue.substr(0, cutIndex);
}
//构造Css样式语句
ItemCss = strIDName+"{\r\n"+strStyleName+":"+strColorValue+";\r\n}\r\n";
//cout<<ItemCss<<endl;
outFile.write(ItemCss.c_str(),ItemCss.length());
}
inFile.close();
outFile.close();
return true;
}
bool CssImageParser(string strDirectory, string urlPath, string randNum, string outPath)
{
ofstream outFile;
string strIDName="";
string strStyleName="background-image";
string strUrlValue="";
string ItemCss = "";
string filePath = "";
outFile.open(outPath.c_str(), ios::app);
if (NULL == outFile)
{
printf("open file[%s] failed +++++\n", outPath.c_str());
outFile.close();
return false;
}
InitializeColorCheckTable(pImageListHead, "./ImageCheckTable.cfg");
MyAttribute *p = pImageListHead->next;
for( ;
NULL != p ;
p = p->next)
{
filePath = strDirectory + p->m_strName;
//cout<<"filePath:"<<filePath<<endl;
if(access(filePath.c_str(), F_OK) == 0)
{
strIDName = p->m_strValue;
strUrlValue = "url("+urlPath+p->m_strName+"?"+randNum+")";
ItemCss = strIDName+"{\r\n"+strStyleName+":"+strUrlValue+";\r\n}\r\n";
outFile.write(ItemCss.c_str(),ItemCss.length());
}
}
return true;
}
int main(int argc, char *argv[])
{
if (argc == 0)
{
}
else if(argc == 3)
{
CssColorParser(argv[1], argv[2]);
DeleteMyAttribute(pColorListHead);
DeleteMyAttribute(pImageListHead);
}
else if (argc == 6)
{
CssColorParser(argv[1],argv[5]);
CssImageParser(argv[2],argv[3],argv[4],argv[5]);
DeleteMyAttribute(pColorListHead);
DeleteMyAttribute(pImageListHead);
}
return 0;
}
cssParser的更多相关文章
- 浏览器-05 HTML和CSS解析1
一个浏览器内核几个主要部分,HTML/CSS解析器,网络处理,JavaScript引擎,2D/3D图形引擎,多媒体支持等; HTML 解析和 DOM 网页基本结构 一个网页(Page),每个Page都 ...
- JMeter学习-027-JMeter参数文件(脚本分发)路径问题:jmeter.threads.JMeterThread: Test failed! java.lang.IllegalArgumentException: File distributed.csv must exist and be readable解决方法
前些天,在进行分布式参数化测试的时候,出现了如题所示的错误报错信息.此文,针对此做一个简略的重现及分析说明. JMX脚本线程组参数配置如下所示: 参数文件路径配置如下所示: 执行JMX脚本后,服务器对 ...
- 使用Maven构建RichFaces 4.x项目
使用Maven构建RichFaces 4.x项目 目录 开始之前 第一步 - 创建Maven项目 第二布 - 添加依赖文件 第三步 - 配置RichFaces 第四步 - 创建显示页面 开始之前 本文 ...
- javafx之CSS初探
文档:http://www.haogongju.net/art/1807238 javafx中的css元素必须有-fx-前缀. 一.介绍 java8中新增了javafx.css开放了css相关api. ...
- Android常用组件
UI相关 图片 Android-Universal-Image-Loader:com.nostra13.universalimageloader:异步加载.缓存.显示图片 ImageLoader:co ...
- Top Android App使用的组件 3
8684公交 AdChina:com.adchina:易传媒广告平台 AdsMogo:com.adsmogo:芒果移动广告平台 大姨吗 AChartEngine:org.achartengine:An ...
- Android常用组件【转】
UI相关 图片 Android-Universal-Image-Loader:com.nostra13.universalimageloader:异步加载.缓存.显示图片 ImageLoader:co ...
- Android经常使用开源组件汇总
http://www.cnblogs.com/scige/p/3456790.html UI相关 图片 Android-Universal-Image-Loader:com.nostra13.univ ...
- CSS3基础(4)——CSS3 渲染属性
一. CSS3 计数器详解 CSS3计数器(CSS Counters)可以允许我们使用CSS对页面中的任意元素进行计数,实现类似于有序列表的功能. 与有序列表相比,它的突出特性在于可以对任意元素 ...
随机推荐
- Android Java 线程池 ThreadPoolExecutor源代码篇
线程池简单点就是任务队列+线程组成的. 接下来我们来简单的了解下ThreadPoolExecutor的源代码. 先看ThreadPoolExecutor的简单类图,对ThreadPoolExecuto ...
- NOJ1167 丑陋数 想法题
题意 丑陋数n的意思是n的全部素数因子仅仅有2,3,5. 求出前1500个丑陋数. (第一个丑陋数是1) 思路 用一个数组维护全部的丑陋数. 一開始数组中仅仅有一个数就是1. 如今能够确定的丑陋数还有 ...
- NYOJ 492 King (状态压缩)
做题感悟:做完这题发现状态压缩有很多须要优化的地方. 解题思路:状态压缩 開始自己用的一般的思路,就和炮兵阵地,郑厂长等题类似的方法做的,開始超时,然后把数组开到了最小的极限就险过.然后看了别人的代码 ...
- RecyclerView 踩坑
一.RecyclerView设置拖动后怎么监听拖动的开始和结束 ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.Cal ...
- ADC 分辨率和精度的区别(转载)
转自:http://hi.baidu.com/jnjypbpuhkbajmq/item/8a6b472ae86dcc69469962b7 分辨率和精度这两个,经常拿在一起说,才接触的时候经常混为一谈. ...
- python学习 04 函数参数
1.参数可以传递元组,但是要加* 2.参数可以传递字典,但是要加**
- AR9331出现connect-debounce failed,port 1 disabled解决方法备忘
基于AR9331的路由器,自己画的pcb板子,居然出现这个错误,百度下,貌似有不少人遇见过这个错误,可是在改动板子前我的固件用的是没问题的.USB完美使用 改动过板子后出现这个问题! hub 1-0: ...
- angular选择器功能
1.$event对象 $event对象其实就是潜在的jQuery事件对象,通过$event.currentTarget获取当前元素,通过$event.target获取当前元素的子元素. 例如: ...
- 从动态获取div高度的问题展开来看
ps 可能篇幅比较长,请大家耐心看看 今天有人在群里问我 动态获取高度怎么获取 我就说jq中的outerHeight. height .innerHeight 原生的height clientH ...
- 爬虫入门【6】Selenium用法简介
Selenium 是什么? 一句话,自动化测试工具.它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器. 如果你在这些浏览器里面安装一个 Selenium 的插件, ...