Skip to content

Instantly share code, notes, and snippets.

@santiago26
Created August 12, 2025 13:19
Show Gist options
  • Select an option

  • Save santiago26/8b7e51e008b9a8c3b10b90aaa46a244b to your computer and use it in GitHub Desktop.

Select an option

Save santiago26/8b7e51e008b9a8c3b10b90aaa46a244b to your computer and use it in GitHub Desktop.

Что делает скрипт

Goal: Запустить его на Node.js и он посреди любого *.php‑файла заменит

print('<div class="text-center mb‑12">'."\r\n");
print('    <div class="HeadText text‑4xl md:text‑5xl lg:text‑6xl font‑bold text‑gray‑900 mb‑6">'."\r\n");

на эквивалент в Heredoc‑синтаксисе:

echo <<<EOT
<div class="text-center mb-12">\r\n
    <div class="HeadText text-4xl md:text-5xl lg:text-6xl font-bold text-gray-900 mb-6">\r\n
EOT;

То есть каждый вызов print() (с одной строкой‑литералом) превращается в echo <<<....

⚠️ Что НЕ делаем:

  • Переводим строкы, которые находятся в рамках сложного выражения (print("a".'b'); и т.п.).
  • Меняем выражения, содержащие переменные, конкатенацию или другие символы, отличные от простых строк в одинарных/двойных кавычках.
    Для простых `print('...');

## Как это работает

* Скрипт принимает список файлов через аргументы командной строки (или обрабатывает все *.php в текущей папке, если аргументы не заданы).  
* Для каждого файла читает содержимое, ищет шаблоны `print('...');` или `print("...");` и заменяет их нужным Heredoc‑синтаксисом.  
* Записывает изменён обратно в тот же файл.


### Как запустить

1. **Создайте файл** `convert-php-print-to-heredoc.js` и вставьте туда код выше.  
2. Сделайте его исполняемым:

   ```bash
   chmod +x convert-php-print-to-heredoc.js
  1. Запустите:

    # Первая опция: явно список файлов
    node convert-php-print-to-heredoc.js path/to/file1.php path/to/file2.php
    
    # Вторая опция: без аргументов – обрабатываются все *.php из текущего каталога
    node convert-php-print-to-heredoc.js

Что изменилось после преобразования

Original:

print('<div class="text-center mb-12">'."\r\n");
print('    <div class="HeadText text-4xl md:text-5xl lg:text-6xl font-bold text-gray-900 mb-6">'."\r\n");

After:

echo <<<EOT
<div class="text-center mb-12">\r\n
    <div class="HeadText text-4xl md:text-5xl lg:text-6xl font-bold text-gray-900 mb-6">\r\n
EOT;

Почему это полезно?

  • Красивый и удобный для чтения вывод «HEREDOC» / «EOF» в PHP.
  • Можно легко вставлять многострочный HTML, не париться со смешиванием кавычек и символов переноса строки.
  • Код становится лаконичнее, а комментирование проще (просто закомментируйте всю heredoc‑строку).

Как улучшить скрипт (если понадобится)

  1. Поддержка переменных – объединить несколько print() в одну heredoc‑строку или выяснить, что строка содержит переменные ($var).
  2. Вариативный delimiter – в случае, если строка уже содержит EOT, выбрать другой тег (DELIM).
  3. Толстый поиск – использовать парсер PHP (например, php-parser), но это уже отдельный проект.
const fs = require('fs');
const path = require('path');
const os = require('os');
// ----------------------------------------------------------------------
// 1. Вспомогательные функции
// ----------------------------------------------------------------------
/**
* Найти все `print('...');` и заменить их на Heredoc‑эквивалент.
* @param {string} code Исходный код файла
* @return {string} Переписанный код
*/
function replacePrintWithHeredoc(code) {
// Совсем простая regex: print ( вида с простыми/двойными кавычками)
// ^\s*print\(\s*(['"])(?<content>.*?)\1\s*\)\s*;\s*$
// Эта regex работает для строк, которые находятся в отдельных строках кода.
// Если в одной строке несколько print, они заменяются отдельно.
const printRe = /print\(\s*(['"])((?:\\?.)*?)\1\s*\)\s*;\s*/gs;
return code.replace(printRe, (...m) => {
const [, , content] = m; // `content` содержит строку, как она записана в PHP
// Если внутри строки встречается подстрока `EOT`, то это может сломать конфиг –
// меняем тег на `PHPCONTENT` (можно в любой срок). В данном примере используем EOT.
const delimiter = 'EOT';
return `echo <<<$delimiter\n${content}\n$delimiter;\n`;
});
}
/**
* Выводит советы, если пользователь не передал файлы.
*/
function usage() {
console.log(`Usage:
# Указать список файлов. Если не указано – обрабатываются все *.php текущей папки
node ${path.basename(process.argv[1])} file1.php file2.php ...
# Встроенный запуск: ./convert-php-print-to-heredoc.js
`);
}
// ----------------------------------------------------------------------
// 2. Основной поток
// ----------------------------------------------------------------------
(async () => {
const args = process.argv.slice(2);
let files = [];
if (args.length === 0) {
// если аргументы не заданы – ищем *.php в текущей папке
files = fs.readdirSync(process.cwd())
.filter(f => f.endsWith('.php'))
.map(f => path.join(process.cwd(), f));
} else {
// проверка существования и расширения
for (const f of args) {
const full = path.resolve(f);
if (!fs.existsSync(full)) { console.warn(`⚠️ Файл не найден: ${full}`); continue; }
if (!f.endsWith('.php')) { console.warn(`⚠️ Пропускаем (не .php): ${full}`); continue; }
files.push(full);
}
}
if (files.length === 0) { usage(); process.exit(1); }
for (const file of files) {
try {
const original = fs.readFileSync(file, 'utf8');
const transformed = replacePrintWithHeredoc(original);
if (original !== transformed) {
fs.writeFileSync(file, transformed, 'utf8');
console.log(`✅ Файл ${file} обновлён`);
} else {
console.log(` – Никого не меняли ${file}`);
}
} catch (err) {
console.error(`❌ Ошибка при работе с ${file}:`, err);
}
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment