Как заменить и умножить размеры тегов img в Perl или Ruby? - PullRequest
2 голосов
/ 23 марта 2012

У меня есть папка, полная html-файлов, созданных для книги Kindle.Изображения кодируются с шириной и высотой в соответствии с рекомендациями Kindle:

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

Мне нужно создать / найти скрипт, который будет обрабатывать все теги изображений, умножая ширину и атрибуты высоты науказанное количество (закодировано в сценарии) и запишите их обратно в 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;

То, что я понимаю, неверно (часть умножения), поэтому помощь приветствуется.

Ответы [ 4 ]

2 голосов
/ 23 марта 2012

Вы уже разобрались с основным регулярным выражением, просто нужно настроить его и выбрать язык. Использование регулярных выражений в 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(...), поскольку использование одинарных кавычек в командной строке будет конфликтовать с кавычками оболочки.

Нет необходимости прикасаться к деталям, которые вы не меняете, если только вы не чувствуете необходимость в более строгом соответствии. Если вы это сделаете, вы можете добавить предварительное утверждение:

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

Эта часть останется неизменной при замене.

1 голос
/ 23 марта 2012

В 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
0 голосов
/ 23 марта 2012

Вы правы, это можно сделать с помощью небольшого 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)

Конечно, это быстрый и грязный скрипт, далеко не идеальный и имеющий некоторый недостаток.

0 голосов
/ 23 марта 2012

Я хотел бы изучить использование камня nokogiri для анализа HTML, поиска тегов изображения, извлечения атрибутов ширины и высоты, а затем вывода измененного документа, чтобы вы могли сохранить его.

Больше информации на странице учебника nokogiri .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...