2014-11-20 109 views
1

我們正在移動現有網站以使用CDN分配img資源。項目經理已經要求在每個頁面上我們必須將img src分配給六個不同的CDN子域中的一個 - 這個想法是因爲對不同域的下載請求同時執行而不是串行執行,我們將獲得速度優勢。批量替換序列化CDN子域

換句話說,我需要把這個...

<p>Argle bargle.</p> 
<img src="http://old-domain.com/_img/image-a.jpg"> 
<img src="http://old-domain.com/_img/image-b.jpg"> 
<img src="http://old-domain.com/_img/image-c.jpg"> 
<img src="http://old-domain.com/_img/image-d.jpg"> 
<img src="http://old-domain.com/_img/image-e.jpg"> 
<img src="http://old-domain.com/_img/image-f.jpg"> 
<img src="http://old-domain.com/_img/image-g.jpg"> 
<img src="http://old-domain.com/_img/image-h.jpg"> 
<p>Whiz bang.</p> 

進入這個......

<p>Argle bargle.</p> 
<img src="http://cdn1.cdn.com/_img/image-a.jpg"> 
<img src="http://cdn2.cdn.com/_img/image-b.jpg"> 
<img src="http://cdn3.cdn.com/_img/image-c.jpg"> 
<img src="http://cdn4.cdn.com/_img/image-d.jpg"> 
<img src="http://cdn5.cdn.com/_img/image-e.jpg"> 
<img src="http://cdn6.cdn.com/_img/image-f.jpg"> 
<img src="http://cdn1.cdn.com/_img/image-g.jpg"> 
<img src="http://cdn2.cdn.com/_img/image-h.jpg"> 
<p>Whiz bang.</p> 

我有數百個文件的更新和他們都比複雜得多上面的例子。如果CDN只是一個域,我將使用TextWrangler立即批量替換所有文件。但我需要以某種方式序列化(甚至隨機化?)替換字符串。

我使用FileMaker Pro作爲生產前端(用於自動化導航構建,元標記等),因此我嘗試在我的HTML輸出字段上創建一個計算序列化每個src,但我認爲它需要一個for-each循環,您無法在Calculation字段中進行(我有FM Pro,而不是FM Pro Advanced,所以我無法使用自定義功能)。

任何人在AppleScript中都做過類似的事情嗎?或者可以利用終端文本處理器?任何建議,將不勝感激。

回答

0

您是否真的從FileMaker寫入HTML?如果是這種情況,並且您想使用Perform AppleScript來操作HTML,那麼您可以執行以下操作。

最佳實踐:始終使用「Native AppleScript」而不是「Calculated AppleScript」。爲了使數據進出AppleScript,創建一對用於在FileMaker和AppleScript之間進行讀寫的全局字段。這有助於在與其他應用程序交談時隔離AppleScript錯誤,以避免出現後續腳本步驟。 (我更喜歡創建一個Global表,並創建一個名爲@Global的表,在Global表中,我創建了兩個字段:AppleScriptInputAppleScriptOutput注意,您必須在該表中創建一個記錄,否則會出現神祕的「object not found」錯誤在AppleScript的。)

Set Field [@Global::AppleScriptInput; $myHtml] 
Perform AppleScript [「 
    -- Read HTML from a global field in FileMaker 
    set html to get data (table "@Global")'s (field "AppleScriptInput") 

    -- Split html on old domain fragment 
    set my text item delimiters to "<img src=\"http://old-domain.com/_img/" 
    set html_fragments to text items of html 

    -- Prefix resource with CDN domain fragment 
    repeat with i from 2 to length of html_fragments 
     set cdn_number to (i - 2) mod 6 + 1 
     set cdn_fragment to "<img src=\"http://cdn" & cdn_number & ".cdn.com/_img/" 
     set item i of html_fragments to cdn_fragment & item i of html_fragments 
    end repeat 

    -- Re-join html fragments 
    set my text item delimiters to "" 
    set html to html_fragments as text 

    -- Write html back to a global field in FileMaker 
    set data (table "@Global")'s (cell "AppleScriptInput") to html 
」] 
Set Variable [$revisedHtml; @Global::AppleScriptOutput] 

上述腳本步驟將讀取您從可變的FileMaker提供$html輸入和保存您$revisedHtml提供的輸出。

你可以做同樣的事情在過程中的純的FileMaker腳本:

Set Variable [$html; "<p>Argle bargle.</p> 
    <img src=\"http://old-domain.com/_img/image-a.jpg\"> 
    <img src=\"http://old-domain.com/_img/image-b.jpg\"> 
    <img src=\"http://old-domain.com/_img/image-c.jpg\"> 
    <img src=\"http://old-domain.com/_img/image-d.jpg\"> 
    <img src=\"http://old-domain.com/_img/image-e.jpg\"> 
    <img src=\"http://old-domain.com/_img/image-f.jpg\"> 
    <img src=\"http://old-domain.com/_img/image-g.jpg\"> 
    <img src=\"http://old-domain.com/_img/image-h.jpg\"> 
    <p>Whiz bang.</p>" 
    ] 
Set Variable [$oldDomain; "http://old-domain.com/_img/"] 
Set Variable [$itemCount; PatternCount ($html ; $oldDomain)] 
Loop 
    Exit Loop If [Let ($i = $i + 1 ; If ($i > $itemCount ; Let ($i = "" ; True)))] 
    Set Variable [$html; 
     Let ([ 
      domainPosition = Position ($html ; "http://old-domain.com/_img/" ; 1 ; 1); 
      domainLength = Length ("http://old-domain.com/_img/"); 
      cdnNumber = Mod ($i - 1 ; 6) + 1 
     ] ; 
      Replace ($html ; domainPosition ; domainLength ; "http://cdn" & cdnNumber & ".cdn.com/_img/") 
     ) 
    ] 
End Loop 
Show Custom Dialog ["Result"; $html] 
+0

太棒了,很多很多謝謝!我的每個HTML頁面都是FMP記錄,我將其批量導出到一個文件夾中,並使用'do shell script \「mkdir'來構建目錄結構。使用@Global表的第一個解決方案看起來像在工作流程中工作會很艱鉅。你的第二個簡單的FM腳本解決方案,有一些調整,是蜜蜂膝蓋。請注意,任何修改解決方案的人,請確保您的替換字符串的段不會與您的位置和長度字符串完全匹配,或者在遇到第一個實例時獲得遞歸覆蓋。 – divvuk 2014-11-22 00:11:27

+0

啊!一個稍微的調整應該有助於遞歸問題,就是改變這一行:'domainPosition = Position($ html;「http://old-domain.com/_img/」; 1; 1);'以便它改爲讀取:'domainPosition = Position($ html;「http://old-domain.com/_img/」;($ i> 1)*(domainPosition + domainLength); 1);'。這將在前一次替換之後開始每個位置搜索。 – 2014-11-22 02:03:15

+0

腳本編輯器不允許我在這些位置使用domainPosition和domainLength(可能是因爲它們還沒有被聲明?),如果我在這兩個位置硬編碼它們的定義,則所有的替換字符串都會被寫入到頂部文件。但我並不是要求解決這個問題;我的原始解決方案的解決方案很好,再次感謝。 – divvuk 2014-11-25 00:19:19

0

我建議你使用一個簡單的bash腳本這樣的:

#!/bin/bash 

OLD="old-domain.com\/_img" 
NEW="cdn1.cdn.com\/_img" 
DPATH="/home/of/your/files/*.html" 

for f in $DPATH 
do 
    sed "s/$OLD/$NEW/g" "$f" > temp; mv temp "$f"; 
done 

它取代old-domain.com/_imgcdn1.cdn.com/_img/home/of/your/files/所有.html文件。

+0

謝謝,但我需要在整個每個文件替換了一系列六個不同的領域,我不認爲這做到這一點。 – divvuk 2014-11-21 23:58:11