使用 Nokogiri 将 vml 标记中的图像 src 替换为全局可用的图像
Replace image src in vml markup with globally available images using Nokogiri
是否可以通过 Capybara/Nokogiri 找到特定于 outlook 的标记?
给定以下标记(erb <% %>
标签被处理成常规 HTML)
...
<div>
<!--[if gte mso 9]>
<v:rect
xmlns:v="urn:schemas-microsoft-com:vml" fill="true" stroke="false"
style="width:<%= card_width %>px;height:<%= card_header_height %>px;"
>
<v:fill type="tile"
src="<%= avatar_background_url.split('?')[0] %>"
color="<%= background_color %>" />
<v:textbox inset="0,0,0,0">
<![endif]-->
<div>
如何获取 <v:fill ../>
标签列表? (或者如果在条件评论中找到标签是一个问题,我最终如何才能获得整个评论)
我尝试了以下方法
doc.xpath('//v:fill')
*** Nokogiri::XML::XPath::SyntaxError Exception: ERROR: Undefined namespace prefix: //v:fill
我是否需要以某种方式注册 vml 名称空间?
编辑 - 按照@ThomasWalpole 方法
doc.xpath('//comment()').each do |comment_node|
vml_node_match = /<v\:fill.*src=\"(?<url>http\:[^"]*)"[^>]*\/>/.match(comment_node)
if vml_node_match
original_image_uri = URI.parse(vml_node_match['url'])
vml_tag = vml_node_match[0]
handle_vml_image_replacement(original_image_uri, comment_node, vml_tag)
end
我的 handle_vml_image_replacement
然后结束调用以下 replace_comment_image_src
def self.replace_comment_image_src(node:, comment:, old_url:, new_url:)
new_url = new_url.split('?').first # VML does not support URL with query params
puts "Replacing comment src URL in #{comment} by #{new_url}"
node.content = node.content.gsub(old_url, new_url)
end
但后来感觉评论实际上不再是 "comment" 并且我有时会看到 HTML 好像它被转义了......我很可能使用了错误的方法来用 Nokogiri 更改评论文本 ?
这是我用于电子邮件拦截器的最终代码,感谢@Thomas Walpole 和@sschmeck 在整个过程中提供的帮助。
我的目标是用全球可用的图像替换 VML 标记中的图像(链接到本地主机),以便使用 MOA 或 Litmus 等服务进行测试
doc.xpath('//comment()').each do |comment_node|
# Note : cannot capture beginning of tag, since it might span across several lines
src_attr_match = /.*src=\"(?<url>http\:[^"]*)"[^>]*\/>/.match(comment_node)
next unless src_attr_match
original_image_uri = URI.parse(src_attr_match['url'])
handle_comment_image_replacement(original_image_uri, comment_node)
end
WHich 稍后调用(在根据源图像类型选择 url 替换策略之后):
def self.replace_comment_image_src(node:, old_url:, new_url:)
new_url = new_url.split('?').first
node.native_content = node.content.gsub(old_url, new_url)
end
是否可以通过 Capybara/Nokogiri 找到特定于 outlook 的标记?
给定以下标记(erb <% %>
标签被处理成常规 HTML)
...
<div>
<!--[if gte mso 9]>
<v:rect
xmlns:v="urn:schemas-microsoft-com:vml" fill="true" stroke="false"
style="width:<%= card_width %>px;height:<%= card_header_height %>px;"
>
<v:fill type="tile"
src="<%= avatar_background_url.split('?')[0] %>"
color="<%= background_color %>" />
<v:textbox inset="0,0,0,0">
<![endif]-->
<div>
如何获取 <v:fill ../>
标签列表? (或者如果在条件评论中找到标签是一个问题,我最终如何才能获得整个评论)
我尝试了以下方法
doc.xpath('//v:fill')
*** Nokogiri::XML::XPath::SyntaxError Exception: ERROR: Undefined namespace prefix: //v:fill
我是否需要以某种方式注册 vml 名称空间?
编辑 - 按照@ThomasWalpole 方法
doc.xpath('//comment()').each do |comment_node|
vml_node_match = /<v\:fill.*src=\"(?<url>http\:[^"]*)"[^>]*\/>/.match(comment_node)
if vml_node_match
original_image_uri = URI.parse(vml_node_match['url'])
vml_tag = vml_node_match[0]
handle_vml_image_replacement(original_image_uri, comment_node, vml_tag)
end
我的 handle_vml_image_replacement
然后结束调用以下 replace_comment_image_src
def self.replace_comment_image_src(node:, comment:, old_url:, new_url:)
new_url = new_url.split('?').first # VML does not support URL with query params
puts "Replacing comment src URL in #{comment} by #{new_url}"
node.content = node.content.gsub(old_url, new_url)
end
但后来感觉评论实际上不再是 "comment" 并且我有时会看到 HTML 好像它被转义了......我很可能使用了错误的方法来用 Nokogiri 更改评论文本 ?
这是我用于电子邮件拦截器的最终代码,感谢@Thomas Walpole 和@sschmeck 在整个过程中提供的帮助。
我的目标是用全球可用的图像替换 VML 标记中的图像(链接到本地主机),以便使用 MOA 或 Litmus 等服务进行测试
doc.xpath('//comment()').each do |comment_node|
# Note : cannot capture beginning of tag, since it might span across several lines
src_attr_match = /.*src=\"(?<url>http\:[^"]*)"[^>]*\/>/.match(comment_node)
next unless src_attr_match
original_image_uri = URI.parse(src_attr_match['url'])
handle_comment_image_replacement(original_image_uri, comment_node)
end
WHich 稍后调用(在根据源图像类型选择 url 替换策略之后):
def self.replace_comment_image_src(node:, old_url:, new_url:)
new_url = new_url.split('?').first
node.native_content = node.content.gsub(old_url, new_url)
end