Файловая манипуляция с Ruby - PullRequest
2 голосов
/ 02 апреля 2012

Я пишу утилиту командной строки для своей команды, используя Ruby.

Я пытаюсь проверить HTML-документ в файловой системе и добавить новый тег <script> перед </head>

Что-то вроде:

<html>
  <head>
    <script src="...foo.js"></script>
    <script src="...bar.js"></script>
    <!-- I WANT TO INSERT NEW TEXT HERE -->
  </head>
  <body>
  </body>
</html>

Я думал начать с IO.readlines(file_name), сравнить каждую строку с регулярным выражением и вставить свой новый тег перед </head>.Затем объедините весь массив обратно в новую версию файла.

Это звучит слишком сложно.У кого есть лучший способ?

Для бонусных баллов было бы здорово иметь правильный уровень отступа.

Ответы [ 2 ]

5 голосов
/ 02 апреля 2012

HTML и регулярные выражения (очень часто) не очень хорошая идея.

Если вы хотите чистым образом анализировать и изменять HTML с Ruby, я рекомендую использовать Nokogiri.

http://nokogiri.org/

http://nokogiri.org/tutorials

1 голос
/ 02 апреля 2012

В вашем особом случае это не такая плохая идея. Если у вас есть эта специальная строка в файле, вы можете легко найти ее, извлечь необходимое количество отступов в начале строки и заменить всю строку другим содержимым. Но не делай этого в памяти. Вы можете записать его во временный файл во время чтения исходного файла, вам не нужно израсходовать оперативную память.

Если HTML-комментарий был просто примером, а этой строки нет, вы все равно можете заменить первое вхождение на ... регулярным выражением, don ' не нужно разбирать HTML. (Но это верно только в вашем особом случае.) Чтобы быть откровенным, вам также не нужен Ruby, потому что команда sed идеально подходит для этой работы.

Или, если вы выполняете другие проверки, например, сценарий уже существует или нет, тогда используйте любой HTML-парсер lib / gem. Я предлагаю вам hpricot, если вам нравится концепция jQuery, потому что hpricot имеет очень похожий подход.

НТН

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