2012-03-23 162 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=".*?"\/>) 

这部分将保持不变的替代。