//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的更多相关文章

  1. 浏览器-05 HTML和CSS解析1

    一个浏览器内核几个主要部分,HTML/CSS解析器,网络处理,JavaScript引擎,2D/3D图形引擎,多媒体支持等; HTML 解析和 DOM 网页基本结构 一个网页(Page),每个Page都 ...

  2. JMeter学习-027-JMeter参数文件(脚本分发)路径问题:jmeter.threads.JMeterThread: Test failed! java.lang.IllegalArgumentException: File distributed.csv must exist and be readable解决方法

    前些天,在进行分布式参数化测试的时候,出现了如题所示的错误报错信息.此文,针对此做一个简略的重现及分析说明. JMX脚本线程组参数配置如下所示: 参数文件路径配置如下所示: 执行JMX脚本后,服务器对 ...

  3. 使用Maven构建RichFaces 4.x项目

    使用Maven构建RichFaces 4.x项目 目录 开始之前 第一步 - 创建Maven项目 第二布 - 添加依赖文件 第三步 - 配置RichFaces 第四步 - 创建显示页面 开始之前 本文 ...

  4. javafx之CSS初探

    文档:http://www.haogongju.net/art/1807238 javafx中的css元素必须有-fx-前缀. 一.介绍 java8中新增了javafx.css开放了css相关api. ...

  5. Android常用组件

    UI相关 图片 Android-Universal-Image-Loader:com.nostra13.universalimageloader:异步加载.缓存.显示图片 ImageLoader:co ...

  6. Top Android App使用的组件 3

    8684公交 AdChina:com.adchina:易传媒广告平台 AdsMogo:com.adsmogo:芒果移动广告平台 大姨吗 AChartEngine:org.achartengine:An ...

  7. Android常用组件【转】

    UI相关 图片 Android-Universal-Image-Loader:com.nostra13.universalimageloader:异步加载.缓存.显示图片 ImageLoader:co ...

  8. Android经常使用开源组件汇总

    http://www.cnblogs.com/scige/p/3456790.html UI相关 图片 Android-Universal-Image-Loader:com.nostra13.univ ...

  9. CSS3基础(4)——CSS3 渲染属性

    一. CSS3 计数器详解    CSS3计数器(CSS Counters)可以允许我们使用CSS对页面中的任意元素进行计数,实现类似于有序列表的功能. 与有序列表相比,它的突出特性在于可以对任意元素 ...

随机推荐

  1. MDwiki 调研

    下载解压 然后 mv mdwiki.html index.html 创建 一个index.md 然后就可以直接访问http://example.com/ 直接把你的md文件放在目录里面就可以了 cer ...

  2. 调用http接口耗时过长。

    利用CRUL命令简单分析请求细节所占用的时间吧 curl -o /dev/null -s -w %{http_code}:%{time_namelookup}:%{time_redirect}:%{t ...

  3. html5小趣味知识点系列(一)contentEditable

    在这里纠正一下某些书籍说 这个修改后的文字内容是无法保存的 的错误必须发送到服务器进行保存才可以(因为我可以保存到内容)看代码吧  也许我理解的不对 <!DOCTYPE html> < ...

  4. C#中Dictionary的作用及用法讲解

    Dictionary<string, string>是一个泛型 他本身有集合的功能有时候可以把它看成数组 他的结构是这样的:Dictionary<[key], [value]> ...

  5. 由浅到深理解ROS(4)

    消息和消息类型 节点能相互传递消息,节点之间通信也是基于消息.消息类型也就是数据类型数据类型,理解消息的类型很重要,因为它决定了消息的内容.也就是说,一个话题的消息类型能告诉你该话题中每个消息携带了哪 ...

  6. 【BZOJ1345】[Baltic2007]序列问题Sequence 贪心+单调栈

    [BZOJ1345][Baltic2007]序列问题Sequence Description 对于一个给定的序列a1, …, an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和a ...

  7. Collecting Bugs (概率dp)

    Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material stu ...

  8. 2.二级接口ListableBeanFactory

    这个随笔主要讲的是ListableBeanFactory package org.springframework.beans.factory; import java.lang.annotation. ...

  9. AFN errorCode对应的状态码

    转 http://blog.csdn.NET/wangyanchang21/article/details/50932191 在很多时候都会遇到错误, 还会带有一些 Error Code , 比如在各 ...

  10. 我的Android进阶之旅------>Android无第三方Jar包的源代报错:The current class path entry belongs to container ...的解决方法

    今天使用第三方Jar包afinal.jar时候,想看一下源代码,无法看 然后像添加jar对应的源码包,也无法添加相应的源代码,报错如下:The current class path entry bel ...