2012-03-23 164 views
2

我有一個文件夾充滿爲Kindle電子書創建的html文件。這些圖像編碼寬度和高度,按照Kindle的準則:如何在Perl或Ruby中替換和乘以img標籤的尺寸?

<img width="328" height="234" src="images/224p_fmt.jpeg" alt="224p.tif"/> 

我需要創建/查找是一個腳本,將處理所有的圖像標籤,並按指定的數量乘以一個height屬性的寬度(編碼到腳本中)並將它們寫回到html文件中。

所以,對於上面的例子,說我想了1.5倍增,而風與

<img width="492" height="351" src="images/224p_fmt.jpeg" alt="224p.tif"/> 

腳本這樣是不是我的專長,所以幫助表示讚賞。我特別不清楚如何編寫一個腳本,我可以從命令行運行文件,只需輸入/輸出html。

我想代碼的肉會像

s/<img width="([0-9]+)" height="([0-9]+)" src="(.*?)" alt=".*"/>/'<img width="'.$1*1.5.'" height="'.$2*1.5.'" src="'.$3.'" alt=""/>'/eg; 

這我知道是不正確的(乘法部分),這是爲什麼幫助表示讚賞。

+0

Python是好嗎?或者只是perl/ruby​​? – FakeRainBrigand 2012-03-23 12:42:14

回答

1

在Python中,我會這樣做。

import sys, re 

source = sys.stdin.read() 
def multi(by): 
    def handler(m): 
    updated = int(m.group(2)) * by 
    return m.group(1) + str(updated) 
    return handler 

print re.sub(r'((?:width|height)=["\'])(\d+)', multi(1.5), source) 

然後你就可以像使用<>處理輸入和輸出的命令。

$ python resize.py <index.html> new_file.html 
+1

這是偉大的,但是必須有一個拼寫錯誤,因爲它留下了打印輸出圖像寬度的前導引號:'224p.tif' – Steve 2012-03-23 13:26:51

+0

我錯位了一個括號,所以引用被排除在第一個子模式之外。現在它是否工作? – FakeRainBrigand 2012-03-23 17:33:23

0

我會考慮使用nokogiri gem來解析HTML,搜索圖像標籤,提取寬度和高度屬性,然後輸出更改後的文檔,以便保存它。

更多信息請致電nokogiri tutorial page

+0

我剛安裝了nokogiri,似乎安裝正確,但各種教程都失敗了。例如,第一個: 'html_doc =引入nokogiri :: HTML( 「

麗城球迷俱樂部先生

」)' 近意外的標記'語法錯誤'失敗('' – Steve 2012-03-23 12:59:12

0

你是對的,它可以用一個小的Ruby腳本完成。它看起來像這樣:

source = '<img width="328" height="234" src="images/224p_fmt.jpeg" alt="224p.tif"/>' 
datas = source.scan(/<img width="([0-9]+)" height="([0-9]+)" src="(.*?)" alt=".*">/).flatten! 
source.gsub!(data[0], (data[0].to_i * 1.5).to_s) 
source.gsub!(data[1], (data[1].to_i * 1.5).to_s) 

當然,這是一個快速和骯髒的腳本,遠非完美,它有一些缺點。

2

你已經掌握了主要的正則表達式,只需要調整它並決定一種語言。在html上使用正則表達式並不是最佳的,但由於這是直截了當的,所以它可能沒問題。

perl -pi.bak -we 's/<img width="([0-9]+)" height="([0-9]+)"/q(<img width=") . 
    $1*1.5 . q(" height=") . $2*1.5 . q(")/eg;' yourfile.html 

注意使用備用引用q(...)的,由於使用在命令行上的單引號將與shell引用衝突。

除非您覺得有必要進行更嚴格的匹配,否則沒有必要觸摸您沒有更改的任何部件。如果你這樣做,你可以添加一個前瞻斷言:

(?=\s*src=".*?"\s*alt=".*?"\/>) 

這部分將保持不變的替代。