Как рекурсивно использовать JS-Beautify?

У меня есть много HTML файлов в каталоге и подкаталогах. Я могу выполнить команду js-beautify через командную строку и хочу применить ее рекурсивно ко всем этим файлам.

я пытался

находить. -name ".html" -type f | JS-украшать -r and JS-украшать -r | находить. -name ".html" -type f

но это не работает Однако JS-beautify действительно работает, если я даю что-то вроде js-beautify -r myfile.html или js-beautify -r *.html (в случае всех файлов в каталоге, но не в подкаталоге)

Может кто-нибудь сказать, как я должен передать эти две команды?

Ответ 1

Тем не менее, JS-beautify работает... в случае всех файлов в каталоге, но не в подкаталоге

Вы упомянули, что JS-beautify работает, если все входные файлы находятся в одном каталоге. Ваша команда, вероятно, не работает, потому что вы передаете все результаты find которые могут включать входные файлы из разных каталогов.

Как уже упоминалось в комментарии ранее, вы можете использовать вместо этого -exec:

find . -type f -name "*.html" -exec js-beautify -r {} \;

Более новые версии GNU find могут использовать этот синтаксис:

find . -type f -name "*.html" -exec js-beautify -r {} +

Ответ 2

Я столкнулся с подобной проблемой и нашел простое межплатформенное решение, используя glob-run:

npm i -g glob-run js-beautify
glob-run html-beautify -r **/*.html

Было бы неплохо, если бы js-beautify поддерживаемые сами шарики.

Ответ 3

1) Добавьте эти зависимости в свой проект

npm install --save-dev glob js-beautify

2) Создайте scripts/format.js

const jsBeautify = require('js-beautify')['js_beautify'];
const fs = require('fs');
const glob = require('glob');

const options = {
  indent_size: 2,
  indent_char: ' ',
  indent_with_tabs: false,
  eol: '\n',
  end_with_newline: true,
  indent_level: 0,
  preserve_newlines: true,
  max_preserve_newlines: 10,
  space_in_paren: false,
  space_in_empty_paren: false,
  jslint_happy: false,
  space_after_anon_function: false,
  brace_style: 'collapse',
  break_chained_methods: false,
  keep_array_indentation: false,
  unescape_strings: false,
  wrap_line_length: 0,
  e4x: false,
  comma_first: false,
  operator_position: 'before-newline'
};

glob('**/!(node_modules)/**/*.js', { absolute: true }, (er, files) => {
  files.forEach(file => {
    console.log(`js-beautify ${file}`);
    const data = fs.readFileSync(file, 'utf8');
    const nextData = jsBeautify(data, options);
    fs.writeFileSync(file, nextData, 'utf8');
  });
});

3) Добавьте format script в package.json

"scripts": {
  "format": "node ./scripts/format.js"
}

4) В вашем проекте запустите

npm run format

Ответ 4

find + xargs - это путь. Это быстрее, чем find с -exec.

find . -name '*.html' | xargs js-beautify 

Если по какой-то причине у вас есть пробелы в именах файлов, вы захотите сделать это вот так:

find . -name '*.html' -print0 | xargs -0 js-beautify

Наконец, если по какой-то странной причине js-beautify не будет работать с несколькими аргументами, тогда вам нужно будет указать xargs передавать только один аргумент за раз. Это не сильно отличается от использования опции -exec, но это лучше ИМО, потому что она более согласована.

find . -name '*.html' | xargs -n 1 js-beautify

Примечание. Вы можете комбинировать параметры -print0 и xargs -0 с xargs -n 1.

edit: Как указано T.J. Кроудер, оболочка не будет скрывать символы в двойных кавычках. Это было для меня новостью, возможно, там есть какая-то древняя среда, где это не так, и, надеюсь, вы никогда не будете вынуждены работать в ней.

Ответ 5

Сочетая мудрость Билла выше и эти ответы на соответствие регулярному выражению, это реальное решение для моего проекта:

находить. -regextype egrep -regex './(src|test|app)/.*.(js|sass|html)' -print0 | xargs -0./node_modules/.bin/js-beautify -r

  • смотрит только в нужные папки (т.е. не в node_modules)
  • идет после js, sass, html
  • может обрабатывать имена файлов с пробелами
  • переписывает на месте (-r)
  • не опирается на узел Шебанг
  • работает с локально установленным js- ./node_modules/.bin (./node_modules/.bin)

При использовании внутри скрипта package.json, ./node_modules/.bin автоматически находится в пути, \.* Необходимо экранировать в \\.*, Таким образом:

"beautify2": "find . -regextype egrep -regex './(src|test|app)/.*\\.(js|sass|html)' -print0 | xargs -0 js-beautify -r"

beautified app/index.html
beautified app/sass/_atomic.sass
beautified app/sass/_mixin.sass
beautified app/sass/space test.sass
beautified test/Log.test.js
beautified test/deleteAction.test.js
beautified src/util/fileUtils.js
...