1、Ant 合并js、css等
系统安装python,通过python脚本实现web工程的html页面引用的js/css合并成一个文件(目的是减少html加载时的js/css请求链接数)
#####################################################
#### ################# html_merg.html #####################
######################################################
#!/usr/bin/python
from BeautifulSoup import *
import os
import sys
import re
def extract_css(doc, doc_base, dirpath, node):
if node.has_key('href'):
node.extract()
if node['href'].find('extjs') != - 1 or node['href'].find('common.js')!= - 1: //包含extjs字样的css不合并,并且common.js不合并
add_style_node(doc, node['href'])
return ""
else:
return get_content(doc_base, dirpath, node['href'])
else:
if len(node.contents) == 1:
node.extract()
return node.contents[0]
else:
return ""
def extract_js(doc, doc_base, dirpath, node):
if node.has_key('src'):
if node['src'].find('extjs') != - 1 or node['src'].find('publishTip.js')!= -1 ://包含extjs字样的js不合并,并且publishTip.js不合并
node.extract()
add_script_node(doc, node['src'])
return ""
else:
if not node['src'].endswith('.js'):
return
node.extract()
return get_content(doc_base, dirpath, node['src'])
else:
return "";
# if len(node.contents) == 1:
# node.extract()
# return node.contents[0]
# else:
# return ""
def get_content(doc_base, dirpath, path):
try:
if path.startswith('/'):
return open(doc_base + path).read()
return open(os.path.join(dirpath , path)).read()
except:
print "/t/t Can not Read Content From File [%s%s]" % (doc_base, path)
return ""
def write_content(path, content):
file = open(path, "w")
if isinstance(content, list):
for line in content:
if line:
file.write(line)
file.write("/n")
else:
file.write(content)
file.close()
def flatten(doc_base, path, prefix):
return ("%s_%s" % (prefix, path.replace(doc_base, ''))).replace('//', '_').replace('/', '_').replace('/.', '_')
def add_style_node(doc, href):
style = Tag(doc, 'link')
style['rel'] = "stylesheet"
style['type'] = "text/css"
style['href'] = href
doc.head.insert(len(doc.html.head.contents), style)
def add_script_node(doc, href):
script = Tag(doc, 'script')
script['type'] = 'text/javascript'
script['src'] = href
doc.head.insert(len(doc.html.head.contents), script)
def handle_doc(doc_base, dirpath, file, prefix):
print "Merging File [%s] " % os.path.join(dirpath, file)
file_base_name = os.path.splitext(file)[0]
# ignore all the files inside the WEB-INF folder
if dirpath.find('WEB-INF') != - 1:
return
content = open(os.path.join(dirpath, file)).read()
doc = BeautifulSoup(content)
if doc.html:
flatten_name = flatten(doc_base, os.path.join(dirpath, file_base_name), prefix)
# merge the css
style_sheets = doc.findAll('link') + doc.findAll('style')
css = [extract_css(doc, doc_base, dirpath, style_sheet) for style_sheet in style_sheets]
if len(css) != 0:
write_content('%s/css/%s.css' % (doc_base, flatten_name), css)
add_style_node(doc, '/css/%s.css' % flatten_name)
# merge the js
scripts = doc.html.findAll('script')
js = [extract_js(doc, doc_base, dirpath, script) for script in scripts]
if len(js) != 0:
write_content('%s/js/%s.js' % (doc_base, flatten_name), js)
add_script_node(doc, '/js/%s.js' % flatten_name)
# update the file content only we have to merge js or css files
if len(js) != 0 or len(css) != 0:
content = str(doc)
# print content
write_content(os.path.join(dirpath, file), content)
if __name__ == "__main__":
doc_base = sys.argv[1]
prefix = sys.argv[2]
for dirpath, dirnames, filenames in os.walk(doc_base):
for filename in filenames:
if filename.endswith(".html"):
try:
handle_doc(doc_base, dirpath, filename, prefix)
except Exception, e:
print "Exception Occur When Handling %s" % filename
print "-=-=-=-"
print e
print "-=-=-=-"
#####################################################
#### ################# build.html #####################
######################################################
<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="BaseAll" name="fair">
<taskdef resource="jst-task.properties" classpath="lib/JSA.jar" /><!-- 混淆压缩需要 -->
<!-- =================================================================== -->
<!-- 清除所有文件-->
<!-- =================================================================== -->
<target name="cleanall">
<delete dir="AntBuild" />
<delete dir="release"/>
</target>
<target name="init" >
<property name="Name" value="fair" />
<property name="name" value="fair" />
<property name="version" value="0.1" />
<property name="year" value="2009" />
<echo message="----------- ${Name} ${version} [${year}] ------------" />
<property name="debug" value="off" />
<property name="optimize" value="on" />
<property name="deprecation" value="on" />
<property name="prefix" value="1.0"/>
<!-- 准备air文件路径 -->
<property name="buildair.dest" value="AntBuild/build_air" />
<!-- 合并js/css脚本路径 -->
<property name="js-css-merge.script" value="python/html_merge.py" /><!-- 合并依赖 -->
<filter token="year" value="${year}" />
<filter token="version" value="${version}" />
<filter token="date" value="${TODAY}" />
<filter token="log" value="true" />
<filter token="verbose" value="true" />
</target>
<!-- =================================================================== -->
<!-- 准备源文件-->
<!-- =================================================================== -->
<target name="prepare-src" >
<!-- create directories -->
<mkdir dir="${buildair.dest}" />
<mkdir dir="${release}"/>
<!-- copy src files -->
<copy todir="${buildair.dest}">
<fileset dir=".">
<exclude name="python/**.*" />
<exclude name="jaxer_bin/**.*" />
<exclude name="AntBuild/**.*" />
<exclude name="build.xml" />
<exclude name="lib/adt.jar" />
<exclude name="lib/JSA.jar" />
</fileset>
</copy>
</target>
<!-- =================================================================== -->
<!-- js-css 合并-->
<!-- =================================================================== -->
<target name="js-css-merge" >
<exec executable="python">
<arg value="${js-css-merge.script}" />
<arg value="${buildair.dest}" />
<arg value="${prefix}" />
</exec>
</target>
<!-- =================================================================== -->
<!-- jsa压缩js文件-->
<!-- =================================================================== -->
<target name="jscompress" >
<!-- 准备air文件路径 -->
<property name="buildair.dest" value="AntBuild/build_air" />
<jscompress destDir="${buildair.dest}" charset="utf-8" syntaxcompression="true" textcompression="true" compatible="true">
<fileset dir="${buildair.dest}">
<include name="js/**.js" />
</fileset>
</jscompress>
</target>
<!-- =================================================================== -->
<!-- 打air包-->
<!-- =================================================================== -->
<!-- Project properties -->
<property name="ADT.JAR" value="lib/adt.jar" /> <!-- air包依赖 -->
<property name="KEYSTORE" value="C:/test.p12" /><!-- 证书 -->
<property name="STORE_PASS" value="123456" />
<property name="APP_ROOT_DIR" value="AntBuild/build_air"/>
<property name="APP_DESCRIPTOR" value="AntBuild/build_air/application.xml"/>
<property name="AIR_NAME" value="web.air"/>
<property name="release" location="release"/>
<property name="assets" location="AntBuild/build_air"/>
<property name="STORETYPE" value="pkcs12"/>
<target name="package2air" >
<echo>---- packageing .... --- </echo>
<java jar="${ADT.JAR}" fork="true" failοnerrοr="true">
<arg value="-package"/>
<arg value="-storetype"/>
<arg value="${STORETYPE}"/>
<arg value="-keystore"/>
<arg value="${KEYSTORE}"/>
<arg value="-storepass" />
<arg value="${STORE_PASS}" />
<arg value="${release}/${AIR_NAME}"/>
<arg value="${APP_DESCRIPTOR}"/>
<arg value="-C"/>
<arg value="${APP_ROOT_DIR}"/>
<arg value="${assets}"/>
</java>
<echo>---- packaged .... --- </echo>
</target>
<!-- =================================================================== -->
<!-- ant 启动顺序-->
<!-- =================================================================== -->
<target name="BaseAll" depends="cleanall,init,prepare-src,js-css-merge,jscompress,package2air"/>
</project>