Wie kann ich eine Datei mit Ameisen in eine andere einbetten?
Frage
Ich entwickle ein kleines Web -App -Projekt (ColdFusion) und versuche, mein Projekt während der Entwicklung in mehrere Dateien aufzuteilen, bereitet jedoch nach Abschluss nur eine Datei bereit.
Ich habe beispielsweise Verweise auf externe Dateien:
<script type="text/javascript" src="jquery-1.2.6.pack.js"></script>
<link type="text/css" rel="stylesheet" href="project.css" />
Und wenn ich mein Projekt erstelle, möchte ich, dass die Dateien in die einzelne fertige Produktdatei eingebettet und eingebettet sind.
<script type="text/javascript">eval(function(p,a,c,k,e,r) [...]</script>
<style type="text/css">div{font:normal;} [...]</style>
Wie auch immer, es sieht nicht so aus, als ob Ant Ameise dies tut. Weiß jemand?
Lösung 3
Beantwortung meiner eigenen Frage nach ein paar Stunden des Hackens ...
<script language="groovy" src="build.groovy" />
und dieses Groovy -Skript ersetzt jede referenzierte JavaScript- oder CSS -Datei durch den Dateiinhalt selbst.
f = new File("${targetDir}/index.cfm")
fContent = f.text
fContent = jsReplace(fContent)
fContent = cssReplace(fContent)
f.write(fContent)
// JS Replacement
def jsReplace(htmlFileText) {
println "Groovy: Replacing Javascript includes"
// extract all matched javascript src links
def jsRegex = /<script [^>]*src=\"([^\"]+)\"><\/script>/
def matcher = (htmlFileText =~ jsRegex)
for (i in matcher) {
// read external files in
def includeText = new File(matcher.group(1)).text
// sanitize the string for being regex replace string (dollar signs like jQuery/Prototype will screw it up)
includeText = java.util.regex.Matcher.quoteReplacement(includeText)
// weak compression (might as well)
includeText = includeText.replaceAll(/\/\/.*/, "") // remove single-line comments (like this!)
includeText = includeText.replaceAll(/[\n\r\f\s]+/, " ") // replace all whitespace with single space
// return content with embedded file
htmlFileText = htmlFileText.replaceFirst('<script [^>]*src="'+ matcher.group(1) +'"[^>]*></script>', '<script type="text/javascript">'+ includeText+'</script>');
}
return htmlFileText;
}
// CSS Replacement
def cssReplace(htmlFileText) {
println "Groovy: Replacing CSS includes"
// extract all matched CSS style href links
def cssRegex = /<link [^>]*href=\"([^\"]+)\"[^>]*>(<\/link>)?/
def matcher = (htmlFileText =~ cssRegex)
for (i in matcher) {
// read external files in
def includeText = new File(matcher.group(1)).text
// compress CSS
includeText = includeText.replaceAll(/[\n\r\t\f\s]+/, " ")
// sanitize the string for being regex replace string (dollar signs like jQuery/Prototype will screw it up)
includeText = java.util.regex.Matcher.quoteReplacement(includeText)
// return content with embedded file
htmlFileText = htmlFileText.replaceFirst('<link [^>]*href="'+ matcher.group(1) +'"[^>]*>(<\\/link>)?', '<style type=\"text/css\">'+ includeText+'</style>');
}
return htmlFileText;
}
Ich denke, das macht es für mich. Es hat ziemlich gut funktioniert und es ist erweiterbar. Auf jeden Fall nicht der beste Groovy aller Zeiten, aber es ist eines meiner ersten. Außerdem erforderten es ein paar klassische Gläser, damit es zusammengestellt wurde. Ich habe den Überblick verloren, aber ich glaube, es ist der javax.cripting motor, Groovy-Engine.jar und Groovy-All-1.5.6.Jar
Andere Tipps
Tut das, was Sie wollen?
<property
name="filename"
value="jquery-1.2.6.pack.js"
/>
<loadfile
property="contents"
srcfile="${filename}"
/>
<replace dir=".">
<include name="index.cfm"/>
<replacetoken><![CDATA[<script type="text/javascript" src="${filename}"></script>]]></replacetoken>
<replacevalue><![CDATA[<script type="text/javascript">${contents}</script>]]></replacevalue>
</replace>
Probieren Sie für eine Lösung in reinem Ant Folgendes aus:
<target name="replace">
<property name="js-filename" value="jquery-1.2.6.pack.js"/>
<property name="css-filename" value="project.css"/>
<loadfile property="js-file" srcfile="${js-filename}"/>
<loadfile property="css-file" srcfile="${css-filename}"/>
<replace file="input.txt">
<replacefilter token="<script type="text/javascript" src="${js-filename}"></script>" value="<script type="text/javascript">${js-file}</script>"/>
<replacefilter token="<link type="text/css" rel="stylesheet" href="${css-filename}" />" value="<style type="text/css">${css-file}</style>"/>
</replace>
</target>
Ich habe es getestet und es hat wie erwartet funktioniert. In dem zu ersetzenden Text und den Wert, den Sie stattdessen alle Zeichen "<", '>' und '"' einfügen, sollte als <,> und" zitiert werden.