Блог
Главные вкладки
Вторичные вкладки
-
... (Array, 13 elements)
-
body (Array, 16 elements)
-
#theme (String, 5 characters ) field
-
#weight (String, 1 characters ) 0
-
#title (String, 10 characters ) Текст
-
#access (Boolean) TRUE
-
#label_display (String, 6 characters ) hidden
-
#view_mode (String, 4 characters ) full
-
#language (String, 3 characters ) und
-
#field_name (String, 4 characters ) body
-
#field_type (String, 17 characters ) text_with_summary
-
#field_translatable (String, 1 characters ) 0
-
#entity_type (String, 4 characters ) node
-
#bundle (String, 4 characters ) blog
-
#object (Object) stdClass
-
vid (String, 3 characters ) 624
-
uid (String, 1 characters ) 1
-
title (String, 67 characters ) NodeJS: Как поставить текст на картинку?...
-
NodeJS: Как поставить текст на картинку?
-
-
log (String, 0 characters )
-
status (String, 1 characters ) 1
-
comment (String, 1 characters ) 2
-
promote (String, 1 characters ) 0
-
sticky (String, 1 characters ) 0
-
nid (String, 3 characters ) 620
-
type (String, 4 characters ) blog
-
language (String, 2 characters ) ru
-
created (String, 10 characters ) 1590308321
-
changed (String, 10 characters ) 1591249274
-
tnid (String, 1 characters ) 0
-
translate (String, 1 characters ) 0
-
revision_timestamp (String, 10 characters ) 1591249274
-
revision_uid (String, 1 characters ) 1
-
body (Array, 1 element)
-
und (Array, 1 element)
-
0 (Array, 5 elements)
-
value (String, 16291 characters ) <p>Для нашей <a href="https://vk.com/affirmaciy...
-
<p>Для нашей <a href="https://vk.com/affirmaciya" target="_blank">группы ВКонтакте</a> регулярно требуются картинки с текстом, которые выкладывает Люба. Создавать же эти картинки в фотошопе достаточно долго. Для этого необходимо проделать очень много однотипных действий. </p> <p>Есть несколько важных параметров итогового изображения:</p> <ul> <li>текст должен влезать на картинку, чтобы выглядел симметрично и красиво;</li> <li>у текста должна быть читаемость независимо от типа картинки на фоне(тёмная или светлая);</li> </ul> <p>В итоге, написал небольшой скрипт на NodeJS, который подгоняет текст под размер картинки и выдаёт результат, который виден в конце этой страницы. Скачать код можно тут: <a href="https://yadi.sk/d/OLLUXtCDsTha4Q" target="_blank">https://yadi.sk/d/OLLUXtCDsTha4Q</a>. Чтобы посмотреть примеры - скроль до конца страницы.</p> <p>Чтобы использовать скрипт нужно установить NodeJS. Его можно скачать для своей платформы с официального сайта. После этого скачать код с Яндекс.Диска, распаковать его в папку и в консоли написать команду <em><span style="background-color:#D3D3D3">npm install</span></em>. После установки всех зависимостей можно запускать скрипт: из консоли <em><span style="background-color:#D3D3D3">node generate</span></em>. Возможно сделать исполняемый файл для Windows(нужно будет установить себе <a href="https://www.npmjs.com/package/pkg" target="_blank">пакет pkg</a>). Для этого в консоли <em><span style="background-color:#D3D3D3">npm run generate</span></em>. После создания исполняемого файла, всё что нужно будет находится в папке dist. При первом запуске скрипт попросит всё, что ему нужно для работы, плюс создаст файл с настройками. Настройки можно менять и если всё совсем перестало работать, тогда можно удалить файл и он пересоздастся с настройками по умолчанию. <strong>Важный момент</strong>: для файла с текстами(text.txt) необходимо указать кодировку utf-8, а в Windows по умолчанию создаётся windows-1251 из-за чего текст будет отображаться некорректно.</p> <p>Сам код написан грязно, но может быть кому-то сгодится для черпания новых идей.</p> <pre> <code class="language-javascript">const { createCanvas } = require('canvas') const fs = require('fs'); const yaml = require('yaml') const Jimp = require("jimp"); const dir = './images'; const resultDir = './result'; const file = './text.txt'; const settings = getSettings(fs, yaml, './settings.yaml'); if (!fs.existsSync(dir)) { error('В папке с скриптом создай папку '+dir+' и положи в неё картинки');return; } if (!fs.existsSync(file)) { error('В папке с скриптом создай файл '+file+' и на каждой его строке напиши тексты'); return; } if(!fs.existsSync(resultDir)){ error('Создана папка для хранения результатов: ' + resultDir); fs.mkdirSync(resultDir); } var images = fs.readdirSync(dir); var texts = fs.readFileSync(file, 'utf8'); var textsArr = texts.split(/\r?\n/g); if(!images.length){ error('Папка ' +dir+ ' пустая, положи в неё картинки'); return; } if(!textsArr.length){ error('В файле '+file+' нет аффирмаций, добавь их по одной аффирмации на строку'); return } //Начальные настройки var imageIndex = 0; var canvases = []; var ctxs = []; var buffers = []; var resultCount = 0; //Запускаем обработку текстов в цикле textsArr.forEach((text, index) => { var imageName = images[imageIndex]; var newImagePath = resultDir + '/' + index + imageName; imageIndex++; if(images.length == imageIndex){ imageIndex = 0; } canvases[index] = createCanvas(settings.width, settings.height); ctxs[index] = canvases[index].getContext('2d'); ctxs[index].font = `${settings.font.style} ${settings.font.size}px ${settings.font.name}`; //Подбираем размер шрифта, чтобы влезал по ширине var newFontSize = chooseFontSize(ctxs[index], text, settings.maxWidth, settings); var lineHeight = newFontSize * settings.font.lineHeightMultiplicator; ctxs[index].font = `${settings.font.style} ${newFontSize}px ${settings.font.name}`; var lines = wrapLines(ctxs[index], textsArr[index], settings.maxWidth); var marginTop = (settings.height - lines.length * lineHeight) / 2 + lineHeight / 2; //Печатаем на канвасе текст lines.forEach((line) => { ctxs[index].fillStyle = settings.font.fillStyle; ctxs[index].textBaseline = settings.font.textBaseline; ctxs[index].textAlign = settings.font.textAlign; ctxs[index].shadowOffsetX = settings.font.shadow.offsetX; ctxs[index].shadowOffsetY = settings.font.shadow.offsetY; ctxs[index].shadowColor = settings.font.shadow.color; ctxs[index].shadowBlur = settings.font.shadow.blur * settings.multiplicator; ctxs[index].strokeStyle = settings.font.stroke.style; ctxs[index].lineWidth = settings.font.stroke.lineWidth * settings.multiplicator; ctxs[index].strokeText(line, settings.width/2, marginTop); ctxs[index].fillText(line, settings.width/2, marginTop); ctxs[index].shadowOffsetX = settings.font.glow.offsetX; ctxs[index].shadowOffsetY = settings.font.glow.offsetY; ctxs[index].shadowColor = settings.font.glow.color; ctxs[index].shadowBlur = lineHeight; ctxs[index].fillText(line, settings.width/2, marginTop); marginTop += lineHeight; }); buffers[index] = canvases[index].toBuffer('image/png') //Сохраняем картинку с написанным текстом fs.writeFile(resultDir +'/'+ index + 'text.png', buffers[index], () => { console.log(`Текст "${text}" добавлен в файл ${resultDir +'/'+ index + 'text.png'}`); //Окончательно сводим все картинки, выводим результат, чистим файлы Jimp.read(dir +'/'+ imageName, (err, image) => { Jimp.read(resultDir +'/'+ index + 'text.png', (err, textImage) => { image .cover(settings.width, settings.height) .composite(textImage, 0, 0) .resize(settings.width / settings.multiplicator, settings.height / settings.multiplicator) .write(newImagePath, () => { console.log(`Текст "${text}" наложен на картинку`); fs.unlink(resultDir +'/'+ index + 'text.png', () => { console.log(`Файл ${resultDir +'/'+ index + 'text.png'} с текстом удалён`) resultCount++; if(resultCount == textsArr.length){ error('Все файлы обработаны, спасибо за использование нашей супер-программы :)'); } }); }); }); }) }) }); /** * Подбираем шрифт для печати на картинке. * Написано быстро и плохо, один и тот же код повторяется много раз * @param ctx * @param text * @param maxWidth * @returns {number} */ function chooseFontSize(ctx, text, maxWidth, settings){ var fontSize = settings.font.size; var lines = wrapLines(ctx, text, maxWidth); var marginTopMultiplikator = settings.marginTopMultiplikator; if(!lines.length){ //Шрифт слишком большой, какое-то из слов не влезает по ширине while (!lines.length){ fontSize = fontSize - 1; // Уменьшаем шрифт, чтобы всё влезло ctx.font = `${settings.font.style} ${fontSize}px ${settings.font.name}`; lines = wrapLines(ctx, text, maxWidth); if(fontSize == 0) { break; } } } else{ // Проверяем, сколько пустого места остаётся сверху var canvasHeight = ctx.canvas.height; var lineHeight = fontSize * settings.font.lineHeightMultiplicator; var marginTop = (canvasHeight - lines.length * lineHeight) / 2; if(marginTop < ((ctx.canvas.width - maxWidth) / 2) * marginTopMultiplikator){ while (marginTop < ((ctx.canvas.width - maxWidth) / 2) * marginTopMultiplikator){ fontSize--; // Увеличиваем шрифт, чтобы отступ сверху был больше lines = wrapLines(ctx, text, maxWidth); lineHeight = fontSize * settings.font.lineHeightMultiplicator; marginTop = (canvasHeight - lines.length * lineHeight) / 2; ctx.font = `${settings.font.style} ${fontSize}px ${settings.font.name}`; } } else{ while (marginTop > ((ctx.canvas.width - maxWidth) / 2) * marginTopMultiplikator && lines.length){ fontSize++; // Увеличиваем шрифт, чтобы отступ сверху был больше lines = wrapLines(ctx, text, maxWidth); lineHeight = fontSize * settings.font.lineHeightMultiplicator; marginTop = (canvasHeight - lines.length * lineHeight) / 2; ctx.font = `${settings.font.style} ${fontSize}px ${settings.font.name}`; } fontSize--; } lines = wrapLines(ctx, text, maxWidth); if(!lines.length){ while (!lines.length){ fontSize = fontSize - 1; // Уменьшаем шрифт, чтобы всё влезло ctx.font = `${settings.font.style} ${fontSize}px ${settings.font.name}`; lines = wrapLines(ctx, text, maxWidth); if(fontSize == 0) { break; } } } } return fontSize; } /** * Отдаёт кол-во линий текста, которые влезают в максимальную ширину канваса. * Если отдаёт пустой массив, то одно из слов не влезает по ширине и значит шрифт нужно уменьшать * @param ctx * @param text * @param maxWidth * @returns {Array} */ function wrapLines(ctx, text, maxWidth) { var lines = [], words = text.replace(/\n\n/g,' ` ').replace(/(\n\s|\s\n)/g,'\r') .replace(/\s\s/g,' ').replace('`',' ').replace(/(\r|\n)/g,' '+' ').split(' '), space = ctx.measureText(' ').width, width = 0, line = '', word = '', len = words.length, w = 0, i; for (i = 0; i < len; i++) { word = words[i]; w = word ? ctx.measureText(word).width : 0; if (w) { width = width + space + w; } if (w > maxWidth) { return []; } else if (w && width < maxWidth) { line += (i ? ' ' : '') + word; } else { !i || lines.push(line !== '' ? line.trim() : ''); line = word; width = w; } } if (len !== i || line !== '') { lines.push(line); } return lines; } /** * Отдаёт кол-во линий в файле * @param file * @returns {number} */ function countFileLines(file){ if(file){ var match = file.match(/\r?\n/g); if(match){ return match.length + 1; } else{ return 1; } } return 1; }; /** * Выводим ошибку в консоль * @param text */ function error(text){ console.log(text); setTimeout(function(){}, 5000); } /** * Получаем настройки или, если их нет, то создаём файл с дефолтными * @param fs * @param yaml * @returns {{multiplicator: number, width: number, fontSize: number, height: number, maxWidth: number}} */ function getSettings(fs, yaml, configPath){ var config = {}; //Создаём файл и пишем дефолтные настройки if (!fs.existsSync(configPath)) { config = { multiplicator: 1, width: 1024, height: 1024, maxWidth: 900, marginTopMultiplikator: 2.5, font: { name: 'Segoe Print', style: 'bold', lineHeightMultiplicator: 1.5, size: 100, fillStyle: 'rgba(255, 255, 255,0.9)', textBaseline: 'middle', textAlign: 'center', shadow: { offsetX: 1, offsetY: 1, color: 'rgba(0, 0, 0, 0.5)', blur: 8, }, stroke: { style: 'rgba(15, 15, 15, 0.9)', lineWidth: 5, }, glow: { offsetX: 1, offsetY: 1, color: 'rgba(255, 255, 255, 1)' } } }; const doc = new yaml.Document(); doc.version = true; doc.commentBefore = [ 'Конфигурация для создания картинок. Если что-то пошло не так, то удали этот файл и он пересоздастся с настройками по умолчанию.', 'multiplicator - множитель для увеличения картинки в самом начале, а потом уменьшения. Нужен, чтобы делать сглаживание. При увеличении - увеличивается время генерации', 'width - ширина картинки', 'height - высота картинки', 'maxWidth - максимальная ширина текста', 'marginTopMultiplikator - множитель для отступа сверху. Считает отступ сбоку((width - maxWidth) / 2) и умножает его на эту цифру', 'font - настройки текста', ' name - название шрифта', ' style - стиль шрифта(bold, italic или пусто. шрифт должен уметь поддерживать этот стиль)', ' lineHeightMultiplicator - множитель для высоты строки текста. На эту цифру умножается размер шрифта', ' size - начальный размер в пикселях, отталкиваясь от этого значения идёт изменение размера', ' shadow - тень под текстом', ' strokeStyle, lineWidth - обводка текста', 'glow - свечение под текстом', ].join('\n'); doc.contents = config; fs.writeFileSync(configPath, String(doc)); } else{ const file = fs.readFileSync(configPath, 'utf8'); config = yaml.parse(file) } var multiplicateFields = ['width', 'height', 'maxWidth']; multiplicateFields.forEach((field) => { config[field] *= config.multiplicator; }); config.font.size *= config.multiplicator; return config; }</code></pre> <p> </p>
-
-
summary (String, 0 characters )
-
format (String, 9 characters ) full_html
-
safe_value (String, 50799 characters ) <p>Для нашей <a href="https://vk.com/affirmaciy...
-
<p>Для нашей <a href="https://vk.com/affirmaciya" target="_blank">группы ВКонтакте</a> регулярно требуются картинки с текстом, которые выкладывает Люба. Создавать же эти картинки в фотошопе достаточно долго. Для этого необходимо проделать очень много однотипных действий. </p> <p>Есть несколько важных параметров итогового изображения:</p> <ul><li>текст должен влезать на картинку, чтобы выглядел симметрично и красиво;</li> <li>у текста должна быть читаемость независимо от типа картинки на фоне(тёмная или светлая);</li> </ul><p>В итоге, написал небольшой скрипт на NodeJS, который подгоняет текст под размер картинки и выдаёт результат, который виден в конце этой страницы. Скачать код можно тут: <a href="https://yadi.sk/d/OLLUXtCDsTha4Q" target="_blank">https://yadi.sk/d/OLLUXtCDsTha4Q</a>. Чтобы посмотреть примеры - скроль до конца страницы.</p> <p>Чтобы использовать скрипт нужно установить NodeJS. Его можно скачать для своей платформы с официального сайта. После этого скачать код с Яндекс.Диска, распаковать его в папку и в консоли написать команду <em><span style="background-color:#D3D3D3">npm install</span></em>. После установки всех зависимостей можно запускать скрипт: из консоли <em><span style="background-color:#D3D3D3">node generate</span></em>. Возможно сделать исполняемый файл для Windows(нужно будет установить себе <a href="https://www.npmjs.com/package/pkg" target="_blank">пакет pkg</a>). Для этого в консоли <em><span style="background-color:#D3D3D3">npm run generate</span></em>. После создания исполняемого файла, всё что нужно будет находится в папке dist. При первом запуске скрипт попросит всё, что ему нужно для работы, плюс создаст файл с настройками. Настройки можно менять и если всё совсем перестало работать, тогда можно удалить файл и он пересоздастся с настройками по умолчанию. <strong>Важный момент</strong>: для файла с текстами(text.txt) необходимо указать кодировку utf-8, а в Windows по умолчанию создаётся windows-1251 из-за чего текст будет отображаться некорректно.</p> <p>Сам код написан грязно, но может быть кому-то сгодится для черпания новых идей.</p> <pre> <div class="geshifilter"><div class="php geshifilter-php"><pre class="de1"><span class="kw2">const</span> <span class="br0">{</span> createCanvas <span class="br0">}</span> <span class="sy0">=</span> <span class="kw1">require</span><span class="br0">(</span><span class="st_h">'canvas'</span><span class="br0">)</span> <span class="kw2">const</span> fs <span class="sy0">=</span> <span class="kw1">require</span><span class="br0">(</span><span class="st_h">'fs'</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw2">const</span> yaml <span class="sy0">=</span> <span class="kw1">require</span><span class="br0">(</span><span class="st_h">'yaml'</span><span class="br0">)</span> <span class="kw2">const</span> Jimp <span class="sy0">=</span> <span class="kw1">require</span><span class="br0">(</span><span class="st0">"jimp"</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw2">const</span> <a href="http://www.php.net/dir"><span class="kw3">dir</span></a> <span class="sy0">=</span> <span class="st_h">'./images'</span><span class="sy0">;</span> <span class="kw2">const</span> resultDir <span class="sy0">=</span> <span class="st_h">'./result'</span><span class="sy0">;</span> <span class="kw2">const</span> <a href="http://www.php.net/file"><span class="kw3">file</span></a> <span class="sy0">=</span> <span class="st_h">'./text.txt'</span><span class="sy0">;</span> <span class="kw2">const</span> settings <span class="sy0">=</span> getSettings<span class="br0">(</span>fs<span class="sy0">,</span> yaml<span class="sy0">,</span> <span class="st_h">'./settings.yaml'</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span> <span class="br0">(</span><span class="sy0">!</span>fs<span class="sy0">.</span>existsSync<span class="br0">(</span><a href="http://www.php.net/dir"><span class="kw3">dir</span></a><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> error<span class="br0">(</span><span class="st_h">'В папке с скриптом создай папку '</span><span class="sy0">+</span><a href="http://www.php.net/dir"><span class="kw3">dir</span></a><span class="sy0">+</span><span class="st_h">' и положи в неё картинки'</span><span class="br0">)</span><span class="sy0">;</span><span class="kw1">return</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">if</span> <span class="br0">(</span><span class="sy0">!</span>fs<span class="sy0">.</span>existsSync<span class="br0">(</span><a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> error<span class="br0">(</span><span class="st_h">'В папке с скриптом создай файл '</span><span class="sy0">+</span><a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="sy0">+</span><span class="st_h">' и на каждой его строке напиши тексты'</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">return</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span>fs<span class="sy0">.</span>existsSync<span class="br0">(</span>resultDir<span class="br0">)</span><span class="br0">)</span><span class="br0">{</span> error<span class="br0">(</span><span class="st_h">'Создана папка для хранения результатов: '</span> <span class="sy0">+</span> resultDir<span class="br0">)</span><span class="sy0">;</span> fs<span class="sy0">.</span>mkdirSync<span class="br0">(</span>resultDir<span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw2">var</span> images <span class="sy0">=</span> fs<span class="sy0">.</span>readdirSync<span class="br0">(</span><a href="http://www.php.net/dir"><span class="kw3">dir</span></a><span class="br0">)</span><span class="sy0">;</span> <span class="kw2">var</span> texts <span class="sy0">=</span> fs<span class="sy0">.</span>readFileSync<span class="br0">(</span><a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="sy0">,</span> <span class="st_h">'utf8'</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw2">var</span> textsArr <span class="sy0">=</span> texts<span class="sy0">.</span><a href="http://www.php.net/split"><span class="kw3">split</span></a><span class="br0">(</span><span class="sy0">/</span>\r?\n<span class="sy0">/</span>g<span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span>images<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> error<span class="br0">(</span><span class="st_h">'Папка '</span> <span class="sy0">+</span><a href="http://www.php.net/dir"><span class="kw3">dir</span></a><span class="sy0">+</span> <span class="st_h">' пустая, положи в неё картинки'</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">return</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span>textsArr<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> error<span class="br0">(</span><span class="st_h">'В файле '</span><span class="sy0">+</span><a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="sy0">+</span><span class="st_h">' нет аффирмаций, добавь их по одной аффирмации на строку'</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">return</span> <span class="br0">}</span> <span class="co1">//Начальные настройки</span> <span class="kw2">var</span> imageIndex <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="kw2">var</span> canvases <span class="sy0">=</span> <span class="br0">[</span><span class="br0">]</span><span class="sy0">;</span> <span class="kw2">var</span> ctxs <span class="sy0">=</span> <span class="br0">[</span><span class="br0">]</span><span class="sy0">;</span> <span class="kw2">var</span> buffers <span class="sy0">=</span> <span class="br0">[</span><span class="br0">]</span><span class="sy0">;</span> <span class="kw2">var</span> resultCount <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="co1">//Запускаем обработку текстов в цикле</span> textsArr<span class="sy0">.</span><span class="kw1">forEach</span><span class="br0">(</span><span class="br0">(</span>text<span class="sy0">,</span> index<span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> <span class="kw2">var</span> imageName <span class="sy0">=</span> images<span class="br0">[</span>imageIndex<span class="br0">]</span><span class="sy0">;</span> <span class="kw2">var</span> newImagePath <span class="sy0">=</span> resultDir <span class="sy0">+</span> <span class="st_h">'/'</span> <span class="sy0">+</span> index <span class="sy0">+</span> imageName<span class="sy0">;</span> imageIndex<span class="sy0">++;</span> <span class="kw1">if</span><span class="br0">(</span>images<span class="sy0">.</span>length <span class="sy0">==</span> imageIndex<span class="br0">)</span><span class="br0">{</span> imageIndex <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="br0">}</span> canvases<span class="br0">[</span>index<span class="br0">]</span> <span class="sy0">=</span> createCanvas<span class="br0">(</span>settings<span class="sy0">.</span>width<span class="sy0">,</span> settings<span class="sy0">.</span>height<span class="br0">)</span><span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span> <span class="sy0">=</span> canvases<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>getContext<span class="br0">(</span><span class="st_h">'2d'</span><span class="br0">)</span><span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>font <span class="sy0">=</span> `$<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>style<span class="br0">}</span> $<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>size<span class="br0">}</span>px $<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>name<span class="br0">}</span>`<span class="sy0">;</span> <span class="co1">//Подбираем размер шрифта, чтобы влезал по ширине</span> <span class="kw2">var</span> newFontSize <span class="sy0">=</span> chooseFontSize<span class="br0">(</span>ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">,</span> text<span class="sy0">,</span> settings<span class="sy0">.</span>maxWidth<span class="sy0">,</span> settings<span class="br0">)</span><span class="sy0">;</span> <span class="kw2">var</span> lineHeight <span class="sy0">=</span> newFontSize <span class="sy0">*</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>lineHeightMultiplicator<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>font <span class="sy0">=</span> `$<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>style<span class="br0">}</span> $<span class="br0">{</span>newFontSize<span class="br0">}</span>px $<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>name<span class="br0">}</span>`<span class="sy0">;</span> <span class="kw2">var</span> lines <span class="sy0">=</span> wrapLines<span class="br0">(</span>ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">,</span> textsArr<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">,</span> settings<span class="sy0">.</span>maxWidth<span class="br0">)</span><span class="sy0">;</span> <span class="kw2">var</span> marginTop <span class="sy0">=</span> <span class="br0">(</span>settings<span class="sy0">.</span>height <span class="sy0">-</span> lines<span class="sy0">.</span>length <span class="sy0">*</span> lineHeight<span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span> <span class="sy0">+</span> lineHeight <span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span> <span class="co1">//Печатаем на канвасе текст</span> lines<span class="sy0">.</span><span class="kw1">forEach</span><span class="br0">(</span><span class="br0">(</span>line<span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>fillStyle <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>fillStyle<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>textBaseline <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>textBaseline<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>textAlign <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>textAlign<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowOffsetX <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>shadow<span class="sy0">.</span>offsetX<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowOffsetY <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>shadow<span class="sy0">.</span>offsetY<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowColor <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>shadow<span class="sy0">.</span>color<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowBlur <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>shadow<span class="sy0">.</span>blur <span class="sy0">*</span> settings<span class="sy0">.</span>multiplicator<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>strokeStyle <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>stroke<span class="sy0">.</span>style<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>lineWidth <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>stroke<span class="sy0">.</span>lineWidth <span class="sy0">*</span> settings<span class="sy0">.</span>multiplicator<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>strokeText<span class="br0">(</span>line<span class="sy0">,</span> settings<span class="sy0">.</span>width<span class="sy0">/</span><span class="nu0">2</span><span class="sy0">,</span> marginTop<span class="br0">)</span><span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>fillText<span class="br0">(</span>line<span class="sy0">,</span> settings<span class="sy0">.</span>width<span class="sy0">/</span><span class="nu0">2</span><span class="sy0">,</span> marginTop<span class="br0">)</span><span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowOffsetX <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>glow<span class="sy0">.</span>offsetX<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowOffsetY <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>glow<span class="sy0">.</span>offsetY<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowColor <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>glow<span class="sy0">.</span>color<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowBlur <span class="sy0">=</span> lineHeight<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>fillText<span class="br0">(</span>line<span class="sy0">,</span> settings<span class="sy0">.</span>width<span class="sy0">/</span><span class="nu0">2</span><span class="sy0">,</span> marginTop<span class="br0">)</span><span class="sy0">;</span> marginTop <span class="sy0">+=</span> lineHeight<span class="sy0">;</span> <span class="br0">}</span><span class="br0">)</span><span class="sy0">;</span> buffers<span class="br0">[</span>index<span class="br0">]</span> <span class="sy0">=</span> canvases<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>toBuffer<span class="br0">(</span><span class="st_h">'image/png'</span><span class="br0">)</span> <span class="co1">//Сохраняем картинку с написанным текстом</span> fs<span class="sy0">.</span>writeFile<span class="br0">(</span>resultDir <span class="sy0">+</span><span class="st_h">'/'</span><span class="sy0">+</span> index <span class="sy0">+</span> <span class="st_h">'text.png'</span><span class="sy0">,</span> buffers<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">,</span> <span class="br0">(</span><span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> console<span class="sy0">.</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="br0">(</span>`Текст <span class="st0">"<span class="es4">${text}</span>"</span> добавлен в файл $<span class="br0">{</span>resultDir <span class="sy0">+</span><span class="st_h">'/'</span><span class="sy0">+</span> index <span class="sy0">+</span> <span class="st_h">'text.png'</span><span class="br0">}</span>`<span class="br0">)</span><span class="sy0">;</span> <span class="co1">//Окончательно сводим все картинки, выводим результат, чистим файлы</span> Jimp<span class="sy0">.</span>read<span class="br0">(</span><a href="http://www.php.net/dir"><span class="kw3">dir</span></a> <span class="sy0">+</span><span class="st_h">'/'</span><span class="sy0">+</span> imageName<span class="sy0">,</span> <span class="br0">(</span>err<span class="sy0">,</span> image<span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> Jimp<span class="sy0">.</span>read<span class="br0">(</span>resultDir <span class="sy0">+</span><span class="st_h">'/'</span><span class="sy0">+</span> index <span class="sy0">+</span> <span class="st_h">'text.png'</span><span class="sy0">,</span> <span class="br0">(</span>err<span class="sy0">,</span> textImage<span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> image <span class="sy0">.</span>cover<span class="br0">(</span>settings<span class="sy0">.</span>width<span class="sy0">,</span> settings<span class="sy0">.</span>height<span class="br0">)</span> <span class="sy0">.</span>composite<span class="br0">(</span>textImage<span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">)</span> <span class="sy0">.</span>resize<span class="br0">(</span>settings<span class="sy0">.</span>width <span class="sy0">/</span> settings<span class="sy0">.</span>multiplicator<span class="sy0">,</span> settings<span class="sy0">.</span>height <span class="sy0">/</span> settings<span class="sy0">.</span>multiplicator<span class="br0">)</span> <span class="sy0">.</span>write<span class="br0">(</span>newImagePath<span class="sy0">,</span> <span class="br0">(</span><span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> console<span class="sy0">.</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="br0">(</span>`Текст <span class="st0">"<span class="es4">${text}</span>"</span> наложен на картинку`<span class="br0">)</span><span class="sy0">;</span> fs<span class="sy0">.</span><a href="http://www.php.net/unlink"><span class="kw3">unlink</span></a><span class="br0">(</span>resultDir <span class="sy0">+</span><span class="st_h">'/'</span><span class="sy0">+</span> index <span class="sy0">+</span> <span class="st_h">'text.png'</span><span class="sy0">,</span> <span class="br0">(</span><span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> console<span class="sy0">.</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="br0">(</span>`Файл $<span class="br0">{</span>resultDir <span class="sy0">+</span><span class="st_h">'/'</span><span class="sy0">+</span> index <span class="sy0">+</span> <span class="st_h">'text.png'</span><span class="br0">}</span> с текстом удалён`<span class="br0">)</span> resultCount<span class="sy0">++;</span> <span class="kw1">if</span><span class="br0">(</span>resultCount <span class="sy0">==</span> textsArr<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> error<span class="br0">(</span><span class="st_h">'Все файлы обработаны, спасибо за использование нашей супер-программы :)'</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span><span class="br0">)</span> <span class="br0">}</span><span class="br0">)</span> <span class="br0">}</span><span class="br0">)</span><span class="sy0">;</span> <span class="co4">/** * Подбираем шрифт для печати на картинке. * Написано быстро и плохо, один и тот же код повторяется много раз * @param ctx * @param text * @param maxWidth * @returns {number} */</span> <span class="kw2">function</span> chooseFontSize<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="sy0">,</span> settings<span class="br0">)</span><span class="br0">{</span> <span class="kw2">var</span> fontSize <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>size<span class="sy0">;</span> <span class="kw2">var</span> lines <span class="sy0">=</span> wrapLines<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="br0">)</span><span class="sy0">;</span> <span class="kw2">var</span> marginTopMultiplikator <span class="sy0">=</span> settings<span class="sy0">.</span>marginTopMultiplikator<span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span>lines<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> <span class="co1">//Шрифт слишком большой, какое-то из слов не влезает по ширине</span> <span class="kw1">while</span> <span class="br0">(</span><span class="sy0">!</span>lines<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> fontSize <span class="sy0">=</span> fontSize <span class="sy0">-</span> <span class="nu0">1</span><span class="sy0">;</span> <span class="co1">// Уменьшаем шрифт, чтобы всё влезло</span> ctx<span class="sy0">.</span>font <span class="sy0">=</span> `$<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>style<span class="br0">}</span> $<span class="br0">{</span>fontSize<span class="br0">}</span>px $<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>name<span class="br0">}</span>`<span class="sy0">;</span> lines <span class="sy0">=</span> wrapLines<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span>fontSize <span class="sy0">==</span> <span class="nu0">0</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">break</span><span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="br0">}</span> <span class="kw1">else</span><span class="br0">{</span> <span class="co1">// Проверяем, сколько пустого места остаётся сверху</span> <span class="kw2">var</span> canvasHeight <span class="sy0">=</span> ctx<span class="sy0">.</span>canvas<span class="sy0">.</span>height<span class="sy0">;</span> <span class="kw2">var</span> lineHeight <span class="sy0">=</span> fontSize <span class="sy0">*</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>lineHeightMultiplicator<span class="sy0">;</span> <span class="kw2">var</span> marginTop <span class="sy0">=</span> <span class="br0">(</span>canvasHeight <span class="sy0">-</span> lines<span class="sy0">.</span>length <span class="sy0">*</span> lineHeight<span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span>marginTop <span class="sy0"><</span> <span class="br0">(</span><span class="br0">(</span>ctx<span class="sy0">.</span>canvas<span class="sy0">.</span>width <span class="sy0">-</span> maxWidth<span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="br0">)</span> <span class="sy0">*</span> marginTopMultiplikator<span class="br0">)</span><span class="br0">{</span> <span class="kw1">while</span> <span class="br0">(</span>marginTop <span class="sy0"><</span> <span class="br0">(</span><span class="br0">(</span>ctx<span class="sy0">.</span>canvas<span class="sy0">.</span>width <span class="sy0">-</span> maxWidth<span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="br0">)</span> <span class="sy0">*</span> marginTopMultiplikator<span class="br0">)</span><span class="br0">{</span> fontSize<span class="sy0">--;</span> <span class="co1">// Увеличиваем шрифт, чтобы отступ сверху был больше</span> lines <span class="sy0">=</span> wrapLines<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="br0">)</span><span class="sy0">;</span> lineHeight <span class="sy0">=</span> fontSize <span class="sy0">*</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>lineHeightMultiplicator<span class="sy0">;</span> marginTop <span class="sy0">=</span> <span class="br0">(</span>canvasHeight <span class="sy0">-</span> lines<span class="sy0">.</span>length <span class="sy0">*</span> lineHeight<span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span> ctx<span class="sy0">.</span>font <span class="sy0">=</span> `$<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>style<span class="br0">}</span> $<span class="br0">{</span>fontSize<span class="br0">}</span>px $<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>name<span class="br0">}</span>`<span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="kw1">else</span><span class="br0">{</span> <span class="kw1">while</span> <span class="br0">(</span>marginTop <span class="sy0">></span> <span class="br0">(</span><span class="br0">(</span>ctx<span class="sy0">.</span>canvas<span class="sy0">.</span>width <span class="sy0">-</span> maxWidth<span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="br0">)</span> <span class="sy0">*</span> marginTopMultiplikator <span class="sy0">&&</span> lines<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> fontSize<span class="sy0">++;</span> <span class="co1">// Увеличиваем шрифт, чтобы отступ сверху был больше</span> lines <span class="sy0">=</span> wrapLines<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="br0">)</span><span class="sy0">;</span> lineHeight <span class="sy0">=</span> fontSize <span class="sy0">*</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>lineHeightMultiplicator<span class="sy0">;</span> marginTop <span class="sy0">=</span> <span class="br0">(</span>canvasHeight <span class="sy0">-</span> lines<span class="sy0">.</span>length <span class="sy0">*</span> lineHeight<span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span> ctx<span class="sy0">.</span>font <span class="sy0">=</span> `$<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>style<span class="br0">}</span> $<span class="br0">{</span>fontSize<span class="br0">}</span>px $<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>name<span class="br0">}</span>`<span class="sy0">;</span> <span class="br0">}</span> fontSize<span class="sy0">--;</span> <span class="br0">}</span> lines <span class="sy0">=</span> wrapLines<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span>lines<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> <span class="kw1">while</span> <span class="br0">(</span><span class="sy0">!</span>lines<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> fontSize <span class="sy0">=</span> fontSize <span class="sy0">-</span> <span class="nu0">1</span><span class="sy0">;</span> <span class="co1">// Уменьшаем шрифт, чтобы всё влезло</span> ctx<span class="sy0">.</span>font <span class="sy0">=</span> `$<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>style<span class="br0">}</span> $<span class="br0">{</span>fontSize<span class="br0">}</span>px $<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>name<span class="br0">}</span>`<span class="sy0">;</span> lines <span class="sy0">=</span> wrapLines<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span>fontSize <span class="sy0">==</span> <span class="nu0">0</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">break</span><span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="br0">}</span> <span class="br0">}</span> <span class="kw1">return</span> fontSize<span class="sy0">;</span> <span class="br0">}</span> <span class="co4">/** * Отдаёт кол-во линий текста, которые влезают в максимальную ширину канваса. * Если отдаёт пустой массив, то одно из слов не влезает по ширине и значит шрифт нужно уменьшать * @param ctx * @param text * @param maxWidth * @returns {Array} */</span> <span class="kw2">function</span> wrapLines<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="br0">)</span> <span class="br0">{</span> <span class="kw2">var</span> lines <span class="sy0">=</span> <span class="br0">[</span><span class="br0">]</span><span class="sy0">,</span> words <span class="sy0">=</span> text<span class="sy0">.</span>replace<span class="br0">(</span><span class="sy0">/</span>\n\n<span class="sy0">/</span>g<span class="sy0">,</span><span class="st_h">' ` '</span><span class="br0">)</span><span class="sy0">.</span>replace<span class="br0">(</span><span class="sy0">/</span><span class="br0">(</span>\n\s<span class="sy0">|</span>\s\n<span class="br0">)</span><span class="sy0">/</span>g<span class="sy0">,</span><span class="st_h">'\r'</span><span class="br0">)</span> <span class="sy0">.</span>replace<span class="br0">(</span><span class="sy0">/</span>\s\s<span class="sy0">/</span>g<span class="sy0">,</span><span class="st_h">' '</span><span class="br0">)</span><span class="sy0">.</span>replace<span class="br0">(</span><span class="st_h">'`'</span><span class="sy0">,</span><span class="st_h">' '</span><span class="br0">)</span><span class="sy0">.</span>replace<span class="br0">(</span><span class="sy0">/</span><span class="br0">(</span>\r<span class="sy0">|</span>\n<span class="br0">)</span><span class="sy0">/</span>g<span class="sy0">,</span><span class="st_h">' '</span><span class="sy0">+</span><span class="st_h">' '</span><span class="br0">)</span><span class="sy0">.</span><a href="http://www.php.net/split"><span class="kw3">split</span></a><span class="br0">(</span><span class="st_h">' '</span><span class="br0">)</span><span class="sy0">,</span> space <span class="sy0">=</span> ctx<span class="sy0">.</span>measureText<span class="br0">(</span><span class="st_h">' '</span><span class="br0">)</span><span class="sy0">.</span>width<span class="sy0">,</span> width <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">,</span> line <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">,</span> word <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">,</span> len <span class="sy0">=</span> words<span class="sy0">.</span>length<span class="sy0">,</span> w <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">,</span> i<span class="sy0">;</span> <span class="kw1">for</span> <span class="br0">(</span>i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0"><</span> len<span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">)</span> <span class="br0">{</span> word <span class="sy0">=</span> words<span class="br0">[</span>i<span class="br0">]</span><span class="sy0">;</span> w <span class="sy0">=</span> word ? ctx<span class="sy0">.</span>measureText<span class="br0">(</span>word<span class="br0">)</span><span class="sy0">.</span>width <span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="kw1">if</span> <span class="br0">(</span>w<span class="br0">)</span> <span class="br0">{</span> width <span class="sy0">=</span> width <span class="sy0">+</span> space <span class="sy0">+</span> w<span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">if</span> <span class="br0">(</span>w <span class="sy0">></span> maxWidth<span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="br0">[</span><span class="br0">]</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">(</span>w <span class="sy0">&&</span> width <span class="sy0"><</span> maxWidth<span class="br0">)</span> <span class="br0">{</span> line <span class="sy0">+=</span> <span class="br0">(</span>i ? <span class="st_h">' '</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">)</span> <span class="sy0">+</span> word<span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span> <span class="br0">{</span> <span class="sy0">!</span>i <span class="sy0">||</span> lines<span class="sy0">.</span>push<span class="br0">(</span>line <span class="sy0">!==</span> <span class="st_h">''</span> ? line<span class="sy0">.</span><a href="http://www.php.net/trim"><span class="kw3">trim</span></a><span class="br0">(</span><span class="br0">)</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">)</span><span class="sy0">;</span> line <span class="sy0">=</span> word<span class="sy0">;</span> width <span class="sy0">=</span> w<span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="kw1">if</span> <span class="br0">(</span>len <span class="sy0">!==</span> i <span class="sy0">||</span> line <span class="sy0">!==</span> <span class="st_h">''</span><span class="br0">)</span> <span class="br0">{</span> lines<span class="sy0">.</span>push<span class="br0">(</span>line<span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">return</span> lines<span class="sy0">;</span> <span class="br0">}</span> <span class="co4">/** * Отдаёт кол-во линий в файле * @param file * @returns {number} */</span> <span class="kw2">function</span> countFileLines<span class="br0">(</span><a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="br0">)</span><span class="br0">{</span> <span class="kw1">if</span><span class="br0">(</span><a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="br0">)</span><span class="br0">{</span> <span class="kw2">var</span> match <span class="sy0">=</span> <a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="sy0">.</span>match<span class="br0">(</span><span class="sy0">/</span>\r?\n<span class="sy0">/</span>g<span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span>match<span class="br0">)</span><span class="br0">{</span> <span class="kw1">return</span> match<span class="sy0">.</span>length <span class="sy0">+</span> <span class="nu0">1</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span><span class="br0">{</span> <span class="kw1">return</span> <span class="nu0">1</span><span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="kw1">return</span> <span class="nu0">1</span><span class="sy0">;</span> <span class="br0">}</span><span class="sy0">;</span> <span class="co4">/** * Выводим ошибку в консоль * @param text */</span> <span class="kw2">function</span> error<span class="br0">(</span>text<span class="br0">)</span><span class="br0">{</span> console<span class="sy0">.</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="br0">(</span>text<span class="br0">)</span><span class="sy0">;</span> setTimeout<span class="br0">(</span><span class="kw2">function</span><span class="br0">(</span><span class="br0">)</span><span class="br0">{</span><span class="br0">}</span><span class="sy0">,</span> <span class="nu0">5000</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="co4">/** * Получаем настройки или, если их нет, то создаём файл с дефолтными * @param fs * @param yaml * @returns {{multiplicator: number, width: number, fontSize: number, height: number, maxWidth: number}} */</span> <span class="kw2">function</span> getSettings<span class="br0">(</span>fs<span class="sy0">,</span> yaml<span class="sy0">,</span> configPath<span class="br0">)</span><span class="br0">{</span> <span class="kw2">var</span> config <span class="sy0">=</span> <span class="br0">{</span><span class="br0">}</span><span class="sy0">;</span> <span class="co1">//Создаём файл и пишем дефолтные настройки</span> <span class="kw1">if</span> <span class="br0">(</span><span class="sy0">!</span>fs<span class="sy0">.</span>existsSync<span class="br0">(</span>configPath<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> config <span class="sy0">=</span> <span class="br0">{</span> multiplicator<span class="sy0">:</span> <span class="nu0">1</span><span class="sy0">,</span> width<span class="sy0">:</span> <span class="nu0">1024</span><span class="sy0">,</span> height<span class="sy0">:</span> <span class="nu0">1024</span><span class="sy0">,</span> maxWidth<span class="sy0">:</span> <span class="nu0">900</span><span class="sy0">,</span> marginTopMultiplikator<span class="sy0">:</span> <span class="nu19">2.5</span><span class="sy0">,</span> font<span class="sy0">:</span> <span class="br0">{</span> name<span class="sy0">:</span> <span class="st_h">'Segoe Print'</span><span class="sy0">,</span> style<span class="sy0">:</span> <span class="st_h">'bold'</span><span class="sy0">,</span> lineHeightMultiplicator<span class="sy0">:</span> <span class="nu19">1.5</span><span class="sy0">,</span> size<span class="sy0">:</span> <span class="nu0">100</span><span class="sy0">,</span> fillStyle<span class="sy0">:</span> <span class="st_h">'rgba(255, 255, 255,0.9)'</span><span class="sy0">,</span> textBaseline<span class="sy0">:</span> <span class="st_h">'middle'</span><span class="sy0">,</span> textAlign<span class="sy0">:</span> <span class="st_h">'center'</span><span class="sy0">,</span> shadow<span class="sy0">:</span> <span class="br0">{</span> offsetX<span class="sy0">:</span> <span class="nu0">1</span><span class="sy0">,</span> offsetY<span class="sy0">:</span> <span class="nu0">1</span><span class="sy0">,</span> color<span class="sy0">:</span> <span class="st_h">'rgba(0, 0, 0, 0.5)'</span><span class="sy0">,</span> blur<span class="sy0">:</span> <span class="nu0">8</span><span class="sy0">,</span> <span class="br0">}</span><span class="sy0">,</span> stroke<span class="sy0">:</span> <span class="br0">{</span> style<span class="sy0">:</span> <span class="st_h">'rgba(15, 15, 15, 0.9)'</span><span class="sy0">,</span> lineWidth<span class="sy0">:</span> <span class="nu0">5</span><span class="sy0">,</span> <span class="br0">}</span><span class="sy0">,</span> glow<span class="sy0">:</span> <span class="br0">{</span> offsetX<span class="sy0">:</span> <span class="nu0">1</span><span class="sy0">,</span> offsetY<span class="sy0">:</span> <span class="nu0">1</span><span class="sy0">,</span> color<span class="sy0">:</span> <span class="st_h">'rgba(255, 255, 255, 1)'</span> <span class="br0">}</span> <span class="br0">}</span> <span class="br0">}</span><span class="sy0">;</span> <span class="kw2">const</span> doc <span class="sy0">=</span> <span class="kw2">new</span> yaml<span class="sy0">.</span>Document<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> doc<span class="sy0">.</span>version <span class="sy0">=</span> <span class="kw4">true</span><span class="sy0">;</span> doc<span class="sy0">.</span>commentBefore <span class="sy0">=</span> <span class="br0">[</span> <span class="st_h">'Конфигурация для создания картинок. Если что-то пошло не так, то удали этот файл и он пересоздастся с настройками по умолчанию.'</span><span class="sy0">,</span> <span class="st_h">'multiplicator - множитель для увеличения картинки в самом начале, а потом уменьшения. Нужен, чтобы делать сглаживание. При увеличении - увеличивается время генерации'</span><span class="sy0">,</span> <span class="st_h">'width - ширина картинки'</span><span class="sy0">,</span> <span class="st_h">'height - высота картинки'</span><span class="sy0">,</span> <span class="st_h">'maxWidth - максимальная ширина текста'</span><span class="sy0">,</span> <span class="st_h">'marginTopMultiplikator - множитель для отступа сверху. Считает отступ сбоку((width - maxWidth) / 2) и умножает его на эту цифру'</span><span class="sy0">,</span> <span class="st_h">'font - настройки текста'</span><span class="sy0">,</span> <span class="st_h">' name - название шрифта'</span><span class="sy0">,</span> <span class="st_h">' style - стиль шрифта(bold, italic или пусто. шрифт должен уметь поддерживать этот стиль)'</span><span class="sy0">,</span> <span class="st_h">' lineHeightMultiplicator - множитель для высоты строки текста. На эту цифру умножается размер шрифта'</span><span class="sy0">,</span> <span class="st_h">' size - начальный размер в пикселях, отталкиваясь от этого значения идёт изменение размера'</span><span class="sy0">,</span> <span class="st_h">' shadow - тень под текстом'</span><span class="sy0">,</span> <span class="st_h">' strokeStyle, lineWidth - обводка текста'</span><span class="sy0">,</span> <span class="st_h">'glow - свечение под текстом'</span><span class="sy0">,</span> <span class="br0">]</span><span class="sy0">.</span><a href="http://www.php.net/join"><span class="kw3">join</span></a><span class="br0">(</span><span class="st_h">'\n'</span><span class="br0">)</span><span class="sy0">;</span> doc<span class="sy0">.</span>contents <span class="sy0">=</span> config<span class="sy0">;</span> fs<span class="sy0">.</span>writeFileSync<span class="br0">(</span>configPath<span class="sy0">,</span> String<span class="br0">(</span>doc<span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span><span class="br0">{</span> <span class="kw2">const</span> <a href="http://www.php.net/file"><span class="kw3">file</span></a> <span class="sy0">=</span> fs<span class="sy0">.</span>readFileSync<span class="br0">(</span>configPath<span class="sy0">,</span> <span class="st_h">'utf8'</span><span class="br0">)</span><span class="sy0">;</span> config <span class="sy0">=</span> yaml<span class="sy0">.</span>parse<span class="br0">(</span><a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="br0">)</span> <span class="br0">}</span> <span class="kw2">var</span> multiplicateFields <span class="sy0">=</span> <span class="br0">[</span><span class="st_h">'width'</span><span class="sy0">,</span> <span class="st_h">'height'</span><span class="sy0">,</span> <span class="st_h">'maxWidth'</span><span class="br0">]</span><span class="sy0">;</span> multiplicateFields<span class="sy0">.</span><span class="kw1">forEach</span><span class="br0">(</span><span class="br0">(</span>field<span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> config<span class="br0">[</span>field<span class="br0">]</span> <span class="sy0">*=</span> config<span class="sy0">.</span>multiplicator<span class="sy0">;</span> <span class="br0">}</span><span class="br0">)</span><span class="sy0">;</span> config<span class="sy0">.</span>font<span class="sy0">.</span>size <span class="sy0">*=</span> config<span class="sy0">.</span>multiplicator<span class="sy0">;</span> <span class="kw1">return</span> config<span class="sy0">;</span> <span class="br0">}</span></pre></div> </div> </pre><p> </p>
-
-
safe_summary (String, 0 characters )
-
-
-
-
field_blog_image (Array, 1 element)
-
und (Array, 3 elements)
-
0 (Array, 13 elements)
-
fid (String, 4 characters ) 1330
-
uid (String, 1 characters ) 1
-
filename (String, 30 characters ) 0a4456cbf6b2dba896e61e9e50.jpg
-
uri (String, 39 characters ) public://0a4456cbf6b2dba896e61e9e50.jpg
-
filemime (String, 10 characters ) image/jpeg
-
filesize (String, 6 characters ) 696533
-
status (String, 1 characters ) 1
-
timestamp (String, 10 characters ) 1590308321
-
alt (String, 0 characters )
-
title (String, 0 characters )
-
width (String, 3 characters ) 900
-
height (String, 3 characters ) 900
-
image_field_caption (Array, 2 elements)
-
-
1 (Array, 13 elements)
-
fid (String, 4 characters ) 1333
-
uid (String, 1 characters ) 1
-
filename (String, 26 characters ) 2pdxbojb9jua_kopirovat.jpg
-
uri (String, 35 characters ) public://2pdxbojb9jua_kopirovat.jpg
-
filemime (String, 10 characters ) image/jpeg
-
filesize (String, 6 characters ) 246238
-
status (String, 1 characters ) 1
-
timestamp (String, 10 characters ) 1590308834
-
alt (String, 0 characters )
-
title (String, 0 characters )
-
width (String, 3 characters ) 800
-
height (String, 3 characters ) 800
-
image_field_caption (Array, 2 elements)
-
-
2 (Array, 13 elements)
-
fid (String, 4 characters ) 1331
-
uid (String, 1 characters ) 1
-
filename (String, 34 characters ) 3dary-dushi-1024x718_kopirovat.jpg
-
uri (String, 43 characters ) public://3dary-dushi-1024x718_kopirovat.jpg
-
filemime (String, 10 characters ) image/jpeg
-
filesize (String, 6 characters ) 246684
-
status (String, 1 characters ) 1
-
timestamp (String, 10 characters ) 1590308701
-
alt (String, 0 characters )
-
title (String, 0 characters )
-
width (String, 3 characters ) 800
-
height (String, 3 characters ) 800
-
image_field_caption (Array, 2 elements)
-
-
-
-
field_razdel (Array, 1 element)
-
und (Array, 1 element)
-
0 (Array, 2 elements)
-
tid (String, 2 characters ) 66
-
taxonomy_term (Object) stdClass
-
tid (String, 2 characters ) 66
-
vid (String, 1 characters ) 2
-
name (String, 29 characters ) Создание сайтов
-
description (String, 675 characters ) <p>Мы профессионально занимаемся созданием и пр...
-
<p>Мы профессионально занимаемся созданием и продвижением сайтов с начала 2009 года.</p> <p>Делаем большое количество сайтов на заказ и для <a href="/nashi-proekty">своих проектов</a>.</p> <p>В основном создаем сайты на Друпале. Он нам больше всего нравится, хотя пробовали работать на разных CMS.</p> <p>В данном разделе будем выкладывать какие-то актуальные для нас находки или решения.</p>
-
-
format (String, 9 characters ) full_html
-
weight (String, 2 characters ) 18
-
vocabulary_machine_name (String, 6 characters ) razdel
-
field_optimize_title (Array, 0 elements)
-
path (Array, 1 element)
-
pathauto (String, 1 characters ) 1
-
-
-
-
-
-
field_teg (Array, 1 element)
-
und (Array, 2 elements)
-
0 (Array, 2 elements)
-
tid (String, 3 characters ) 336
-
taxonomy_term (Object) stdClass
-
tid (String, 3 characters ) 336
-
vid (String, 1 characters ) 1
-
name (String, 6 characters ) NodeJS
-
description (NULL)
-
format (NULL)
-
weight (String, 1 characters ) 0
-
vocabulary_machine_name (String, 4 characters ) tags
-
field_optimize_title (Array, 0 elements)
-
-
-
1 (Array, 2 elements)
-
tid (String, 3 characters ) 337
-
taxonomy_term (Object) stdClass
-
tid (String, 3 characters ) 337
-
vid (String, 1 characters ) 1
-
name (String, 14 characters ) скрипты
-
description (NULL)
-
format (NULL)
-
weight (String, 1 characters ) 0
-
vocabulary_machine_name (String, 4 characters ) tags
-
field_optimize_title (Array, 0 elements)
-
-
-
-
-
field_video (Array, 0 elements)
-
field_image_view (Array, 1 element)
-
field_source (Array, 0 elements)
-
field_image_view_tiles (Array, 1 element)
-
metatags (Array, 1 element)
-
ru (Array, 1 element)
-
-
path (Array, 1 element)
-
pathauto (String, 1 characters ) 1
-
-
cid (String, 1 characters ) 0
-
last_comment_timestamp (String, 10 characters ) 1590308321
-
last_comment_name (NULL)
-
last_comment_uid (String, 1 characters ) 1
-
comment_count (String, 1 characters ) 0
-
name (String, 8 characters ) Саша
-
picture (String, 1 characters ) 0
-
data (String, 189 characters ) a:6:{s:16:"ckeditor_default";s:1:"t";s:20:"cked...
-
a:6:{s:16:"ckeditor_default";s:1:"t";s:20:"ckeditor_show_toggle";s:1:"t";s:14:"ckeditor_width";s:4:"100%";s:13:"ckeditor_lang";s:2:"en";s:18:"ckeditor_auto_lang";s:1:"t";s:7:"overlay";i:1;}
-
-
entity_view_prepared (Boolean) TRUE
-
-
#items (Array, 1 element)
-
0 (Array, 5 elements)
-
value (String, 16291 characters ) <p>Для нашей <a href="https://vk.com/affirmaciy...
-
<p>Для нашей <a href="https://vk.com/affirmaciya" target="_blank">группы ВКонтакте</a> регулярно требуются картинки с текстом, которые выкладывает Люба. Создавать же эти картинки в фотошопе достаточно долго. Для этого необходимо проделать очень много однотипных действий. </p> <p>Есть несколько важных параметров итогового изображения:</p> <ul> <li>текст должен влезать на картинку, чтобы выглядел симметрично и красиво;</li> <li>у текста должна быть читаемость независимо от типа картинки на фоне(тёмная или светлая);</li> </ul> <p>В итоге, написал небольшой скрипт на NodeJS, который подгоняет текст под размер картинки и выдаёт результат, который виден в конце этой страницы. Скачать код можно тут: <a href="https://yadi.sk/d/OLLUXtCDsTha4Q" target="_blank">https://yadi.sk/d/OLLUXtCDsTha4Q</a>. Чтобы посмотреть примеры - скроль до конца страницы.</p> <p>Чтобы использовать скрипт нужно установить NodeJS. Его можно скачать для своей платформы с официального сайта. После этого скачать код с Яндекс.Диска, распаковать его в папку и в консоли написать команду <em><span style="background-color:#D3D3D3">npm install</span></em>. После установки всех зависимостей можно запускать скрипт: из консоли <em><span style="background-color:#D3D3D3">node generate</span></em>. Возможно сделать исполняемый файл для Windows(нужно будет установить себе <a href="https://www.npmjs.com/package/pkg" target="_blank">пакет pkg</a>). Для этого в консоли <em><span style="background-color:#D3D3D3">npm run generate</span></em>. После создания исполняемого файла, всё что нужно будет находится в папке dist. При первом запуске скрипт попросит всё, что ему нужно для работы, плюс создаст файл с настройками. Настройки можно менять и если всё совсем перестало работать, тогда можно удалить файл и он пересоздастся с настройками по умолчанию. <strong>Важный момент</strong>: для файла с текстами(text.txt) необходимо указать кодировку utf-8, а в Windows по умолчанию создаётся windows-1251 из-за чего текст будет отображаться некорректно.</p> <p>Сам код написан грязно, но может быть кому-то сгодится для черпания новых идей.</p> <pre> <code class="language-javascript">const { createCanvas } = require('canvas') const fs = require('fs'); const yaml = require('yaml') const Jimp = require("jimp"); const dir = './images'; const resultDir = './result'; const file = './text.txt'; const settings = getSettings(fs, yaml, './settings.yaml'); if (!fs.existsSync(dir)) { error('В папке с скриптом создай папку '+dir+' и положи в неё картинки');return; } if (!fs.existsSync(file)) { error('В папке с скриптом создай файл '+file+' и на каждой его строке напиши тексты'); return; } if(!fs.existsSync(resultDir)){ error('Создана папка для хранения результатов: ' + resultDir); fs.mkdirSync(resultDir); } var images = fs.readdirSync(dir); var texts = fs.readFileSync(file, 'utf8'); var textsArr = texts.split(/\r?\n/g); if(!images.length){ error('Папка ' +dir+ ' пустая, положи в неё картинки'); return; } if(!textsArr.length){ error('В файле '+file+' нет аффирмаций, добавь их по одной аффирмации на строку'); return } //Начальные настройки var imageIndex = 0; var canvases = []; var ctxs = []; var buffers = []; var resultCount = 0; //Запускаем обработку текстов в цикле textsArr.forEach((text, index) => { var imageName = images[imageIndex]; var newImagePath = resultDir + '/' + index + imageName; imageIndex++; if(images.length == imageIndex){ imageIndex = 0; } canvases[index] = createCanvas(settings.width, settings.height); ctxs[index] = canvases[index].getContext('2d'); ctxs[index].font = `${settings.font.style} ${settings.font.size}px ${settings.font.name}`; //Подбираем размер шрифта, чтобы влезал по ширине var newFontSize = chooseFontSize(ctxs[index], text, settings.maxWidth, settings); var lineHeight = newFontSize * settings.font.lineHeightMultiplicator; ctxs[index].font = `${settings.font.style} ${newFontSize}px ${settings.font.name}`; var lines = wrapLines(ctxs[index], textsArr[index], settings.maxWidth); var marginTop = (settings.height - lines.length * lineHeight) / 2 + lineHeight / 2; //Печатаем на канвасе текст lines.forEach((line) => { ctxs[index].fillStyle = settings.font.fillStyle; ctxs[index].textBaseline = settings.font.textBaseline; ctxs[index].textAlign = settings.font.textAlign; ctxs[index].shadowOffsetX = settings.font.shadow.offsetX; ctxs[index].shadowOffsetY = settings.font.shadow.offsetY; ctxs[index].shadowColor = settings.font.shadow.color; ctxs[index].shadowBlur = settings.font.shadow.blur * settings.multiplicator; ctxs[index].strokeStyle = settings.font.stroke.style; ctxs[index].lineWidth = settings.font.stroke.lineWidth * settings.multiplicator; ctxs[index].strokeText(line, settings.width/2, marginTop); ctxs[index].fillText(line, settings.width/2, marginTop); ctxs[index].shadowOffsetX = settings.font.glow.offsetX; ctxs[index].shadowOffsetY = settings.font.glow.offsetY; ctxs[index].shadowColor = settings.font.glow.color; ctxs[index].shadowBlur = lineHeight; ctxs[index].fillText(line, settings.width/2, marginTop); marginTop += lineHeight; }); buffers[index] = canvases[index].toBuffer('image/png') //Сохраняем картинку с написанным текстом fs.writeFile(resultDir +'/'+ index + 'text.png', buffers[index], () => { console.log(`Текст "${text}" добавлен в файл ${resultDir +'/'+ index + 'text.png'}`); //Окончательно сводим все картинки, выводим результат, чистим файлы Jimp.read(dir +'/'+ imageName, (err, image) => { Jimp.read(resultDir +'/'+ index + 'text.png', (err, textImage) => { image .cover(settings.width, settings.height) .composite(textImage, 0, 0) .resize(settings.width / settings.multiplicator, settings.height / settings.multiplicator) .write(newImagePath, () => { console.log(`Текст "${text}" наложен на картинку`); fs.unlink(resultDir +'/'+ index + 'text.png', () => { console.log(`Файл ${resultDir +'/'+ index + 'text.png'} с текстом удалён`) resultCount++; if(resultCount == textsArr.length){ error('Все файлы обработаны, спасибо за использование нашей супер-программы :)'); } }); }); }); }) }) }); /** * Подбираем шрифт для печати на картинке. * Написано быстро и плохо, один и тот же код повторяется много раз * @param ctx * @param text * @param maxWidth * @returns {number} */ function chooseFontSize(ctx, text, maxWidth, settings){ var fontSize = settings.font.size; var lines = wrapLines(ctx, text, maxWidth); var marginTopMultiplikator = settings.marginTopMultiplikator; if(!lines.length){ //Шрифт слишком большой, какое-то из слов не влезает по ширине while (!lines.length){ fontSize = fontSize - 1; // Уменьшаем шрифт, чтобы всё влезло ctx.font = `${settings.font.style} ${fontSize}px ${settings.font.name}`; lines = wrapLines(ctx, text, maxWidth); if(fontSize == 0) { break; } } } else{ // Проверяем, сколько пустого места остаётся сверху var canvasHeight = ctx.canvas.height; var lineHeight = fontSize * settings.font.lineHeightMultiplicator; var marginTop = (canvasHeight - lines.length * lineHeight) / 2; if(marginTop < ((ctx.canvas.width - maxWidth) / 2) * marginTopMultiplikator){ while (marginTop < ((ctx.canvas.width - maxWidth) / 2) * marginTopMultiplikator){ fontSize--; // Увеличиваем шрифт, чтобы отступ сверху был больше lines = wrapLines(ctx, text, maxWidth); lineHeight = fontSize * settings.font.lineHeightMultiplicator; marginTop = (canvasHeight - lines.length * lineHeight) / 2; ctx.font = `${settings.font.style} ${fontSize}px ${settings.font.name}`; } } else{ while (marginTop > ((ctx.canvas.width - maxWidth) / 2) * marginTopMultiplikator && lines.length){ fontSize++; // Увеличиваем шрифт, чтобы отступ сверху был больше lines = wrapLines(ctx, text, maxWidth); lineHeight = fontSize * settings.font.lineHeightMultiplicator; marginTop = (canvasHeight - lines.length * lineHeight) / 2; ctx.font = `${settings.font.style} ${fontSize}px ${settings.font.name}`; } fontSize--; } lines = wrapLines(ctx, text, maxWidth); if(!lines.length){ while (!lines.length){ fontSize = fontSize - 1; // Уменьшаем шрифт, чтобы всё влезло ctx.font = `${settings.font.style} ${fontSize}px ${settings.font.name}`; lines = wrapLines(ctx, text, maxWidth); if(fontSize == 0) { break; } } } } return fontSize; } /** * Отдаёт кол-во линий текста, которые влезают в максимальную ширину канваса. * Если отдаёт пустой массив, то одно из слов не влезает по ширине и значит шрифт нужно уменьшать * @param ctx * @param text * @param maxWidth * @returns {Array} */ function wrapLines(ctx, text, maxWidth) { var lines = [], words = text.replace(/\n\n/g,' ` ').replace(/(\n\s|\s\n)/g,'\r') .replace(/\s\s/g,' ').replace('`',' ').replace(/(\r|\n)/g,' '+' ').split(' '), space = ctx.measureText(' ').width, width = 0, line = '', word = '', len = words.length, w = 0, i; for (i = 0; i < len; i++) { word = words[i]; w = word ? ctx.measureText(word).width : 0; if (w) { width = width + space + w; } if (w > maxWidth) { return []; } else if (w && width < maxWidth) { line += (i ? ' ' : '') + word; } else { !i || lines.push(line !== '' ? line.trim() : ''); line = word; width = w; } } if (len !== i || line !== '') { lines.push(line); } return lines; } /** * Отдаёт кол-во линий в файле * @param file * @returns {number} */ function countFileLines(file){ if(file){ var match = file.match(/\r?\n/g); if(match){ return match.length + 1; } else{ return 1; } } return 1; }; /** * Выводим ошибку в консоль * @param text */ function error(text){ console.log(text); setTimeout(function(){}, 5000); } /** * Получаем настройки или, если их нет, то создаём файл с дефолтными * @param fs * @param yaml * @returns {{multiplicator: number, width: number, fontSize: number, height: number, maxWidth: number}} */ function getSettings(fs, yaml, configPath){ var config = {}; //Создаём файл и пишем дефолтные настройки if (!fs.existsSync(configPath)) { config = { multiplicator: 1, width: 1024, height: 1024, maxWidth: 900, marginTopMultiplikator: 2.5, font: { name: 'Segoe Print', style: 'bold', lineHeightMultiplicator: 1.5, size: 100, fillStyle: 'rgba(255, 255, 255,0.9)', textBaseline: 'middle', textAlign: 'center', shadow: { offsetX: 1, offsetY: 1, color: 'rgba(0, 0, 0, 0.5)', blur: 8, }, stroke: { style: 'rgba(15, 15, 15, 0.9)', lineWidth: 5, }, glow: { offsetX: 1, offsetY: 1, color: 'rgba(255, 255, 255, 1)' } } }; const doc = new yaml.Document(); doc.version = true; doc.commentBefore = [ 'Конфигурация для создания картинок. Если что-то пошло не так, то удали этот файл и он пересоздастся с настройками по умолчанию.', 'multiplicator - множитель для увеличения картинки в самом начале, а потом уменьшения. Нужен, чтобы делать сглаживание. При увеличении - увеличивается время генерации', 'width - ширина картинки', 'height - высота картинки', 'maxWidth - максимальная ширина текста', 'marginTopMultiplikator - множитель для отступа сверху. Считает отступ сбоку((width - maxWidth) / 2) и умножает его на эту цифру', 'font - настройки текста', ' name - название шрифта', ' style - стиль шрифта(bold, italic или пусто. шрифт должен уметь поддерживать этот стиль)', ' lineHeightMultiplicator - множитель для высоты строки текста. На эту цифру умножается размер шрифта', ' size - начальный размер в пикселях, отталкиваясь от этого значения идёт изменение размера', ' shadow - тень под текстом', ' strokeStyle, lineWidth - обводка текста', 'glow - свечение под текстом', ].join('\n'); doc.contents = config; fs.writeFileSync(configPath, String(doc)); } else{ const file = fs.readFileSync(configPath, 'utf8'); config = yaml.parse(file) } var multiplicateFields = ['width', 'height', 'maxWidth']; multiplicateFields.forEach((field) => { config[field] *= config.multiplicator; }); config.font.size *= config.multiplicator; return config; }</code></pre> <p> </p>
-
-
summary (String, 0 characters )
-
format (String, 9 characters ) full_html
-
safe_value (String, 50799 characters ) <p>Для нашей <a href="https://vk.com/affirmaciy...
-
<p>Для нашей <a href="https://vk.com/affirmaciya" target="_blank">группы ВКонтакте</a> регулярно требуются картинки с текстом, которые выкладывает Люба. Создавать же эти картинки в фотошопе достаточно долго. Для этого необходимо проделать очень много однотипных действий. </p> <p>Есть несколько важных параметров итогового изображения:</p> <ul><li>текст должен влезать на картинку, чтобы выглядел симметрично и красиво;</li> <li>у текста должна быть читаемость независимо от типа картинки на фоне(тёмная или светлая);</li> </ul><p>В итоге, написал небольшой скрипт на NodeJS, который подгоняет текст под размер картинки и выдаёт результат, который виден в конце этой страницы. Скачать код можно тут: <a href="https://yadi.sk/d/OLLUXtCDsTha4Q" target="_blank">https://yadi.sk/d/OLLUXtCDsTha4Q</a>. Чтобы посмотреть примеры - скроль до конца страницы.</p> <p>Чтобы использовать скрипт нужно установить NodeJS. Его можно скачать для своей платформы с официального сайта. После этого скачать код с Яндекс.Диска, распаковать его в папку и в консоли написать команду <em><span style="background-color:#D3D3D3">npm install</span></em>. После установки всех зависимостей можно запускать скрипт: из консоли <em><span style="background-color:#D3D3D3">node generate</span></em>. Возможно сделать исполняемый файл для Windows(нужно будет установить себе <a href="https://www.npmjs.com/package/pkg" target="_blank">пакет pkg</a>). Для этого в консоли <em><span style="background-color:#D3D3D3">npm run generate</span></em>. После создания исполняемого файла, всё что нужно будет находится в папке dist. При первом запуске скрипт попросит всё, что ему нужно для работы, плюс создаст файл с настройками. Настройки можно менять и если всё совсем перестало работать, тогда можно удалить файл и он пересоздастся с настройками по умолчанию. <strong>Важный момент</strong>: для файла с текстами(text.txt) необходимо указать кодировку utf-8, а в Windows по умолчанию создаётся windows-1251 из-за чего текст будет отображаться некорректно.</p> <p>Сам код написан грязно, но может быть кому-то сгодится для черпания новых идей.</p> <pre> <div class="geshifilter"><div class="php geshifilter-php"><pre class="de1"><span class="kw2">const</span> <span class="br0">{</span> createCanvas <span class="br0">}</span> <span class="sy0">=</span> <span class="kw1">require</span><span class="br0">(</span><span class="st_h">'canvas'</span><span class="br0">)</span> <span class="kw2">const</span> fs <span class="sy0">=</span> <span class="kw1">require</span><span class="br0">(</span><span class="st_h">'fs'</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw2">const</span> yaml <span class="sy0">=</span> <span class="kw1">require</span><span class="br0">(</span><span class="st_h">'yaml'</span><span class="br0">)</span> <span class="kw2">const</span> Jimp <span class="sy0">=</span> <span class="kw1">require</span><span class="br0">(</span><span class="st0">"jimp"</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw2">const</span> <a href="http://www.php.net/dir"><span class="kw3">dir</span></a> <span class="sy0">=</span> <span class="st_h">'./images'</span><span class="sy0">;</span> <span class="kw2">const</span> resultDir <span class="sy0">=</span> <span class="st_h">'./result'</span><span class="sy0">;</span> <span class="kw2">const</span> <a href="http://www.php.net/file"><span class="kw3">file</span></a> <span class="sy0">=</span> <span class="st_h">'./text.txt'</span><span class="sy0">;</span> <span class="kw2">const</span> settings <span class="sy0">=</span> getSettings<span class="br0">(</span>fs<span class="sy0">,</span> yaml<span class="sy0">,</span> <span class="st_h">'./settings.yaml'</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span> <span class="br0">(</span><span class="sy0">!</span>fs<span class="sy0">.</span>existsSync<span class="br0">(</span><a href="http://www.php.net/dir"><span class="kw3">dir</span></a><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> error<span class="br0">(</span><span class="st_h">'В папке с скриптом создай папку '</span><span class="sy0">+</span><a href="http://www.php.net/dir"><span class="kw3">dir</span></a><span class="sy0">+</span><span class="st_h">' и положи в неё картинки'</span><span class="br0">)</span><span class="sy0">;</span><span class="kw1">return</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">if</span> <span class="br0">(</span><span class="sy0">!</span>fs<span class="sy0">.</span>existsSync<span class="br0">(</span><a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> error<span class="br0">(</span><span class="st_h">'В папке с скриптом создай файл '</span><span class="sy0">+</span><a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="sy0">+</span><span class="st_h">' и на каждой его строке напиши тексты'</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">return</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span>fs<span class="sy0">.</span>existsSync<span class="br0">(</span>resultDir<span class="br0">)</span><span class="br0">)</span><span class="br0">{</span> error<span class="br0">(</span><span class="st_h">'Создана папка для хранения результатов: '</span> <span class="sy0">+</span> resultDir<span class="br0">)</span><span class="sy0">;</span> fs<span class="sy0">.</span>mkdirSync<span class="br0">(</span>resultDir<span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw2">var</span> images <span class="sy0">=</span> fs<span class="sy0">.</span>readdirSync<span class="br0">(</span><a href="http://www.php.net/dir"><span class="kw3">dir</span></a><span class="br0">)</span><span class="sy0">;</span> <span class="kw2">var</span> texts <span class="sy0">=</span> fs<span class="sy0">.</span>readFileSync<span class="br0">(</span><a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="sy0">,</span> <span class="st_h">'utf8'</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw2">var</span> textsArr <span class="sy0">=</span> texts<span class="sy0">.</span><a href="http://www.php.net/split"><span class="kw3">split</span></a><span class="br0">(</span><span class="sy0">/</span>\r?\n<span class="sy0">/</span>g<span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span>images<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> error<span class="br0">(</span><span class="st_h">'Папка '</span> <span class="sy0">+</span><a href="http://www.php.net/dir"><span class="kw3">dir</span></a><span class="sy0">+</span> <span class="st_h">' пустая, положи в неё картинки'</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">return</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span>textsArr<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> error<span class="br0">(</span><span class="st_h">'В файле '</span><span class="sy0">+</span><a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="sy0">+</span><span class="st_h">' нет аффирмаций, добавь их по одной аффирмации на строку'</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">return</span> <span class="br0">}</span> <span class="co1">//Начальные настройки</span> <span class="kw2">var</span> imageIndex <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="kw2">var</span> canvases <span class="sy0">=</span> <span class="br0">[</span><span class="br0">]</span><span class="sy0">;</span> <span class="kw2">var</span> ctxs <span class="sy0">=</span> <span class="br0">[</span><span class="br0">]</span><span class="sy0">;</span> <span class="kw2">var</span> buffers <span class="sy0">=</span> <span class="br0">[</span><span class="br0">]</span><span class="sy0">;</span> <span class="kw2">var</span> resultCount <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="co1">//Запускаем обработку текстов в цикле</span> textsArr<span class="sy0">.</span><span class="kw1">forEach</span><span class="br0">(</span><span class="br0">(</span>text<span class="sy0">,</span> index<span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> <span class="kw2">var</span> imageName <span class="sy0">=</span> images<span class="br0">[</span>imageIndex<span class="br0">]</span><span class="sy0">;</span> <span class="kw2">var</span> newImagePath <span class="sy0">=</span> resultDir <span class="sy0">+</span> <span class="st_h">'/'</span> <span class="sy0">+</span> index <span class="sy0">+</span> imageName<span class="sy0">;</span> imageIndex<span class="sy0">++;</span> <span class="kw1">if</span><span class="br0">(</span>images<span class="sy0">.</span>length <span class="sy0">==</span> imageIndex<span class="br0">)</span><span class="br0">{</span> imageIndex <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="br0">}</span> canvases<span class="br0">[</span>index<span class="br0">]</span> <span class="sy0">=</span> createCanvas<span class="br0">(</span>settings<span class="sy0">.</span>width<span class="sy0">,</span> settings<span class="sy0">.</span>height<span class="br0">)</span><span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span> <span class="sy0">=</span> canvases<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>getContext<span class="br0">(</span><span class="st_h">'2d'</span><span class="br0">)</span><span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>font <span class="sy0">=</span> `$<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>style<span class="br0">}</span> $<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>size<span class="br0">}</span>px $<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>name<span class="br0">}</span>`<span class="sy0">;</span> <span class="co1">//Подбираем размер шрифта, чтобы влезал по ширине</span> <span class="kw2">var</span> newFontSize <span class="sy0">=</span> chooseFontSize<span class="br0">(</span>ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">,</span> text<span class="sy0">,</span> settings<span class="sy0">.</span>maxWidth<span class="sy0">,</span> settings<span class="br0">)</span><span class="sy0">;</span> <span class="kw2">var</span> lineHeight <span class="sy0">=</span> newFontSize <span class="sy0">*</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>lineHeightMultiplicator<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>font <span class="sy0">=</span> `$<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>style<span class="br0">}</span> $<span class="br0">{</span>newFontSize<span class="br0">}</span>px $<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>name<span class="br0">}</span>`<span class="sy0">;</span> <span class="kw2">var</span> lines <span class="sy0">=</span> wrapLines<span class="br0">(</span>ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">,</span> textsArr<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">,</span> settings<span class="sy0">.</span>maxWidth<span class="br0">)</span><span class="sy0">;</span> <span class="kw2">var</span> marginTop <span class="sy0">=</span> <span class="br0">(</span>settings<span class="sy0">.</span>height <span class="sy0">-</span> lines<span class="sy0">.</span>length <span class="sy0">*</span> lineHeight<span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span> <span class="sy0">+</span> lineHeight <span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span> <span class="co1">//Печатаем на канвасе текст</span> lines<span class="sy0">.</span><span class="kw1">forEach</span><span class="br0">(</span><span class="br0">(</span>line<span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>fillStyle <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>fillStyle<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>textBaseline <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>textBaseline<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>textAlign <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>textAlign<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowOffsetX <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>shadow<span class="sy0">.</span>offsetX<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowOffsetY <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>shadow<span class="sy0">.</span>offsetY<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowColor <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>shadow<span class="sy0">.</span>color<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowBlur <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>shadow<span class="sy0">.</span>blur <span class="sy0">*</span> settings<span class="sy0">.</span>multiplicator<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>strokeStyle <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>stroke<span class="sy0">.</span>style<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>lineWidth <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>stroke<span class="sy0">.</span>lineWidth <span class="sy0">*</span> settings<span class="sy0">.</span>multiplicator<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>strokeText<span class="br0">(</span>line<span class="sy0">,</span> settings<span class="sy0">.</span>width<span class="sy0">/</span><span class="nu0">2</span><span class="sy0">,</span> marginTop<span class="br0">)</span><span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>fillText<span class="br0">(</span>line<span class="sy0">,</span> settings<span class="sy0">.</span>width<span class="sy0">/</span><span class="nu0">2</span><span class="sy0">,</span> marginTop<span class="br0">)</span><span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowOffsetX <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>glow<span class="sy0">.</span>offsetX<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowOffsetY <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>glow<span class="sy0">.</span>offsetY<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowColor <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>glow<span class="sy0">.</span>color<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowBlur <span class="sy0">=</span> lineHeight<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>fillText<span class="br0">(</span>line<span class="sy0">,</span> settings<span class="sy0">.</span>width<span class="sy0">/</span><span class="nu0">2</span><span class="sy0">,</span> marginTop<span class="br0">)</span><span class="sy0">;</span> marginTop <span class="sy0">+=</span> lineHeight<span class="sy0">;</span> <span class="br0">}</span><span class="br0">)</span><span class="sy0">;</span> buffers<span class="br0">[</span>index<span class="br0">]</span> <span class="sy0">=</span> canvases<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>toBuffer<span class="br0">(</span><span class="st_h">'image/png'</span><span class="br0">)</span> <span class="co1">//Сохраняем картинку с написанным текстом</span> fs<span class="sy0">.</span>writeFile<span class="br0">(</span>resultDir <span class="sy0">+</span><span class="st_h">'/'</span><span class="sy0">+</span> index <span class="sy0">+</span> <span class="st_h">'text.png'</span><span class="sy0">,</span> buffers<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">,</span> <span class="br0">(</span><span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> console<span class="sy0">.</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="br0">(</span>`Текст <span class="st0">"<span class="es4">${text}</span>"</span> добавлен в файл $<span class="br0">{</span>resultDir <span class="sy0">+</span><span class="st_h">'/'</span><span class="sy0">+</span> index <span class="sy0">+</span> <span class="st_h">'text.png'</span><span class="br0">}</span>`<span class="br0">)</span><span class="sy0">;</span> <span class="co1">//Окончательно сводим все картинки, выводим результат, чистим файлы</span> Jimp<span class="sy0">.</span>read<span class="br0">(</span><a href="http://www.php.net/dir"><span class="kw3">dir</span></a> <span class="sy0">+</span><span class="st_h">'/'</span><span class="sy0">+</span> imageName<span class="sy0">,</span> <span class="br0">(</span>err<span class="sy0">,</span> image<span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> Jimp<span class="sy0">.</span>read<span class="br0">(</span>resultDir <span class="sy0">+</span><span class="st_h">'/'</span><span class="sy0">+</span> index <span class="sy0">+</span> <span class="st_h">'text.png'</span><span class="sy0">,</span> <span class="br0">(</span>err<span class="sy0">,</span> textImage<span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> image <span class="sy0">.</span>cover<span class="br0">(</span>settings<span class="sy0">.</span>width<span class="sy0">,</span> settings<span class="sy0">.</span>height<span class="br0">)</span> <span class="sy0">.</span>composite<span class="br0">(</span>textImage<span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">)</span> <span class="sy0">.</span>resize<span class="br0">(</span>settings<span class="sy0">.</span>width <span class="sy0">/</span> settings<span class="sy0">.</span>multiplicator<span class="sy0">,</span> settings<span class="sy0">.</span>height <span class="sy0">/</span> settings<span class="sy0">.</span>multiplicator<span class="br0">)</span> <span class="sy0">.</span>write<span class="br0">(</span>newImagePath<span class="sy0">,</span> <span class="br0">(</span><span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> console<span class="sy0">.</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="br0">(</span>`Текст <span class="st0">"<span class="es4">${text}</span>"</span> наложен на картинку`<span class="br0">)</span><span class="sy0">;</span> fs<span class="sy0">.</span><a href="http://www.php.net/unlink"><span class="kw3">unlink</span></a><span class="br0">(</span>resultDir <span class="sy0">+</span><span class="st_h">'/'</span><span class="sy0">+</span> index <span class="sy0">+</span> <span class="st_h">'text.png'</span><span class="sy0">,</span> <span class="br0">(</span><span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> console<span class="sy0">.</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="br0">(</span>`Файл $<span class="br0">{</span>resultDir <span class="sy0">+</span><span class="st_h">'/'</span><span class="sy0">+</span> index <span class="sy0">+</span> <span class="st_h">'text.png'</span><span class="br0">}</span> с текстом удалён`<span class="br0">)</span> resultCount<span class="sy0">++;</span> <span class="kw1">if</span><span class="br0">(</span>resultCount <span class="sy0">==</span> textsArr<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> error<span class="br0">(</span><span class="st_h">'Все файлы обработаны, спасибо за использование нашей супер-программы :)'</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span><span class="br0">)</span> <span class="br0">}</span><span class="br0">)</span> <span class="br0">}</span><span class="br0">)</span><span class="sy0">;</span> <span class="co4">/** * Подбираем шрифт для печати на картинке. * Написано быстро и плохо, один и тот же код повторяется много раз * @param ctx * @param text * @param maxWidth * @returns {number} */</span> <span class="kw2">function</span> chooseFontSize<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="sy0">,</span> settings<span class="br0">)</span><span class="br0">{</span> <span class="kw2">var</span> fontSize <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>size<span class="sy0">;</span> <span class="kw2">var</span> lines <span class="sy0">=</span> wrapLines<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="br0">)</span><span class="sy0">;</span> <span class="kw2">var</span> marginTopMultiplikator <span class="sy0">=</span> settings<span class="sy0">.</span>marginTopMultiplikator<span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span>lines<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> <span class="co1">//Шрифт слишком большой, какое-то из слов не влезает по ширине</span> <span class="kw1">while</span> <span class="br0">(</span><span class="sy0">!</span>lines<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> fontSize <span class="sy0">=</span> fontSize <span class="sy0">-</span> <span class="nu0">1</span><span class="sy0">;</span> <span class="co1">// Уменьшаем шрифт, чтобы всё влезло</span> ctx<span class="sy0">.</span>font <span class="sy0">=</span> `$<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>style<span class="br0">}</span> $<span class="br0">{</span>fontSize<span class="br0">}</span>px $<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>name<span class="br0">}</span>`<span class="sy0">;</span> lines <span class="sy0">=</span> wrapLines<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span>fontSize <span class="sy0">==</span> <span class="nu0">0</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">break</span><span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="br0">}</span> <span class="kw1">else</span><span class="br0">{</span> <span class="co1">// Проверяем, сколько пустого места остаётся сверху</span> <span class="kw2">var</span> canvasHeight <span class="sy0">=</span> ctx<span class="sy0">.</span>canvas<span class="sy0">.</span>height<span class="sy0">;</span> <span class="kw2">var</span> lineHeight <span class="sy0">=</span> fontSize <span class="sy0">*</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>lineHeightMultiplicator<span class="sy0">;</span> <span class="kw2">var</span> marginTop <span class="sy0">=</span> <span class="br0">(</span>canvasHeight <span class="sy0">-</span> lines<span class="sy0">.</span>length <span class="sy0">*</span> lineHeight<span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span>marginTop <span class="sy0"><</span> <span class="br0">(</span><span class="br0">(</span>ctx<span class="sy0">.</span>canvas<span class="sy0">.</span>width <span class="sy0">-</span> maxWidth<span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="br0">)</span> <span class="sy0">*</span> marginTopMultiplikator<span class="br0">)</span><span class="br0">{</span> <span class="kw1">while</span> <span class="br0">(</span>marginTop <span class="sy0"><</span> <span class="br0">(</span><span class="br0">(</span>ctx<span class="sy0">.</span>canvas<span class="sy0">.</span>width <span class="sy0">-</span> maxWidth<span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="br0">)</span> <span class="sy0">*</span> marginTopMultiplikator<span class="br0">)</span><span class="br0">{</span> fontSize<span class="sy0">--;</span> <span class="co1">// Увеличиваем шрифт, чтобы отступ сверху был больше</span> lines <span class="sy0">=</span> wrapLines<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="br0">)</span><span class="sy0">;</span> lineHeight <span class="sy0">=</span> fontSize <span class="sy0">*</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>lineHeightMultiplicator<span class="sy0">;</span> marginTop <span class="sy0">=</span> <span class="br0">(</span>canvasHeight <span class="sy0">-</span> lines<span class="sy0">.</span>length <span class="sy0">*</span> lineHeight<span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span> ctx<span class="sy0">.</span>font <span class="sy0">=</span> `$<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>style<span class="br0">}</span> $<span class="br0">{</span>fontSize<span class="br0">}</span>px $<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>name<span class="br0">}</span>`<span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="kw1">else</span><span class="br0">{</span> <span class="kw1">while</span> <span class="br0">(</span>marginTop <span class="sy0">></span> <span class="br0">(</span><span class="br0">(</span>ctx<span class="sy0">.</span>canvas<span class="sy0">.</span>width <span class="sy0">-</span> maxWidth<span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="br0">)</span> <span class="sy0">*</span> marginTopMultiplikator <span class="sy0">&&</span> lines<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> fontSize<span class="sy0">++;</span> <span class="co1">// Увеличиваем шрифт, чтобы отступ сверху был больше</span> lines <span class="sy0">=</span> wrapLines<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="br0">)</span><span class="sy0">;</span> lineHeight <span class="sy0">=</span> fontSize <span class="sy0">*</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>lineHeightMultiplicator<span class="sy0">;</span> marginTop <span class="sy0">=</span> <span class="br0">(</span>canvasHeight <span class="sy0">-</span> lines<span class="sy0">.</span>length <span class="sy0">*</span> lineHeight<span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span> ctx<span class="sy0">.</span>font <span class="sy0">=</span> `$<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>style<span class="br0">}</span> $<span class="br0">{</span>fontSize<span class="br0">}</span>px $<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>name<span class="br0">}</span>`<span class="sy0">;</span> <span class="br0">}</span> fontSize<span class="sy0">--;</span> <span class="br0">}</span> lines <span class="sy0">=</span> wrapLines<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span>lines<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> <span class="kw1">while</span> <span class="br0">(</span><span class="sy0">!</span>lines<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> fontSize <span class="sy0">=</span> fontSize <span class="sy0">-</span> <span class="nu0">1</span><span class="sy0">;</span> <span class="co1">// Уменьшаем шрифт, чтобы всё влезло</span> ctx<span class="sy0">.</span>font <span class="sy0">=</span> `$<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>style<span class="br0">}</span> $<span class="br0">{</span>fontSize<span class="br0">}</span>px $<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>name<span class="br0">}</span>`<span class="sy0">;</span> lines <span class="sy0">=</span> wrapLines<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span>fontSize <span class="sy0">==</span> <span class="nu0">0</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">break</span><span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="br0">}</span> <span class="br0">}</span> <span class="kw1">return</span> fontSize<span class="sy0">;</span> <span class="br0">}</span> <span class="co4">/** * Отдаёт кол-во линий текста, которые влезают в максимальную ширину канваса. * Если отдаёт пустой массив, то одно из слов не влезает по ширине и значит шрифт нужно уменьшать * @param ctx * @param text * @param maxWidth * @returns {Array} */</span> <span class="kw2">function</span> wrapLines<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="br0">)</span> <span class="br0">{</span> <span class="kw2">var</span> lines <span class="sy0">=</span> <span class="br0">[</span><span class="br0">]</span><span class="sy0">,</span> words <span class="sy0">=</span> text<span class="sy0">.</span>replace<span class="br0">(</span><span class="sy0">/</span>\n\n<span class="sy0">/</span>g<span class="sy0">,</span><span class="st_h">' ` '</span><span class="br0">)</span><span class="sy0">.</span>replace<span class="br0">(</span><span class="sy0">/</span><span class="br0">(</span>\n\s<span class="sy0">|</span>\s\n<span class="br0">)</span><span class="sy0">/</span>g<span class="sy0">,</span><span class="st_h">'\r'</span><span class="br0">)</span> <span class="sy0">.</span>replace<span class="br0">(</span><span class="sy0">/</span>\s\s<span class="sy0">/</span>g<span class="sy0">,</span><span class="st_h">' '</span><span class="br0">)</span><span class="sy0">.</span>replace<span class="br0">(</span><span class="st_h">'`'</span><span class="sy0">,</span><span class="st_h">' '</span><span class="br0">)</span><span class="sy0">.</span>replace<span class="br0">(</span><span class="sy0">/</span><span class="br0">(</span>\r<span class="sy0">|</span>\n<span class="br0">)</span><span class="sy0">/</span>g<span class="sy0">,</span><span class="st_h">' '</span><span class="sy0">+</span><span class="st_h">' '</span><span class="br0">)</span><span class="sy0">.</span><a href="http://www.php.net/split"><span class="kw3">split</span></a><span class="br0">(</span><span class="st_h">' '</span><span class="br0">)</span><span class="sy0">,</span> space <span class="sy0">=</span> ctx<span class="sy0">.</span>measureText<span class="br0">(</span><span class="st_h">' '</span><span class="br0">)</span><span class="sy0">.</span>width<span class="sy0">,</span> width <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">,</span> line <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">,</span> word <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">,</span> len <span class="sy0">=</span> words<span class="sy0">.</span>length<span class="sy0">,</span> w <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">,</span> i<span class="sy0">;</span> <span class="kw1">for</span> <span class="br0">(</span>i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0"><</span> len<span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">)</span> <span class="br0">{</span> word <span class="sy0">=</span> words<span class="br0">[</span>i<span class="br0">]</span><span class="sy0">;</span> w <span class="sy0">=</span> word ? ctx<span class="sy0">.</span>measureText<span class="br0">(</span>word<span class="br0">)</span><span class="sy0">.</span>width <span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="kw1">if</span> <span class="br0">(</span>w<span class="br0">)</span> <span class="br0">{</span> width <span class="sy0">=</span> width <span class="sy0">+</span> space <span class="sy0">+</span> w<span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">if</span> <span class="br0">(</span>w <span class="sy0">></span> maxWidth<span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="br0">[</span><span class="br0">]</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">(</span>w <span class="sy0">&&</span> width <span class="sy0"><</span> maxWidth<span class="br0">)</span> <span class="br0">{</span> line <span class="sy0">+=</span> <span class="br0">(</span>i ? <span class="st_h">' '</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">)</span> <span class="sy0">+</span> word<span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span> <span class="br0">{</span> <span class="sy0">!</span>i <span class="sy0">||</span> lines<span class="sy0">.</span>push<span class="br0">(</span>line <span class="sy0">!==</span> <span class="st_h">''</span> ? line<span class="sy0">.</span><a href="http://www.php.net/trim"><span class="kw3">trim</span></a><span class="br0">(</span><span class="br0">)</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">)</span><span class="sy0">;</span> line <span class="sy0">=</span> word<span class="sy0">;</span> width <span class="sy0">=</span> w<span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="kw1">if</span> <span class="br0">(</span>len <span class="sy0">!==</span> i <span class="sy0">||</span> line <span class="sy0">!==</span> <span class="st_h">''</span><span class="br0">)</span> <span class="br0">{</span> lines<span class="sy0">.</span>push<span class="br0">(</span>line<span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">return</span> lines<span class="sy0">;</span> <span class="br0">}</span> <span class="co4">/** * Отдаёт кол-во линий в файле * @param file * @returns {number} */</span> <span class="kw2">function</span> countFileLines<span class="br0">(</span><a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="br0">)</span><span class="br0">{</span> <span class="kw1">if</span><span class="br0">(</span><a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="br0">)</span><span class="br0">{</span> <span class="kw2">var</span> match <span class="sy0">=</span> <a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="sy0">.</span>match<span class="br0">(</span><span class="sy0">/</span>\r?\n<span class="sy0">/</span>g<span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span>match<span class="br0">)</span><span class="br0">{</span> <span class="kw1">return</span> match<span class="sy0">.</span>length <span class="sy0">+</span> <span class="nu0">1</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span><span class="br0">{</span> <span class="kw1">return</span> <span class="nu0">1</span><span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="kw1">return</span> <span class="nu0">1</span><span class="sy0">;</span> <span class="br0">}</span><span class="sy0">;</span> <span class="co4">/** * Выводим ошибку в консоль * @param text */</span> <span class="kw2">function</span> error<span class="br0">(</span>text<span class="br0">)</span><span class="br0">{</span> console<span class="sy0">.</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="br0">(</span>text<span class="br0">)</span><span class="sy0">;</span> setTimeout<span class="br0">(</span><span class="kw2">function</span><span class="br0">(</span><span class="br0">)</span><span class="br0">{</span><span class="br0">}</span><span class="sy0">,</span> <span class="nu0">5000</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="co4">/** * Получаем настройки или, если их нет, то создаём файл с дефолтными * @param fs * @param yaml * @returns {{multiplicator: number, width: number, fontSize: number, height: number, maxWidth: number}} */</span> <span class="kw2">function</span> getSettings<span class="br0">(</span>fs<span class="sy0">,</span> yaml<span class="sy0">,</span> configPath<span class="br0">)</span><span class="br0">{</span> <span class="kw2">var</span> config <span class="sy0">=</span> <span class="br0">{</span><span class="br0">}</span><span class="sy0">;</span> <span class="co1">//Создаём файл и пишем дефолтные настройки</span> <span class="kw1">if</span> <span class="br0">(</span><span class="sy0">!</span>fs<span class="sy0">.</span>existsSync<span class="br0">(</span>configPath<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> config <span class="sy0">=</span> <span class="br0">{</span> multiplicator<span class="sy0">:</span> <span class="nu0">1</span><span class="sy0">,</span> width<span class="sy0">:</span> <span class="nu0">1024</span><span class="sy0">,</span> height<span class="sy0">:</span> <span class="nu0">1024</span><span class="sy0">,</span> maxWidth<span class="sy0">:</span> <span class="nu0">900</span><span class="sy0">,</span> marginTopMultiplikator<span class="sy0">:</span> <span class="nu19">2.5</span><span class="sy0">,</span> font<span class="sy0">:</span> <span class="br0">{</span> name<span class="sy0">:</span> <span class="st_h">'Segoe Print'</span><span class="sy0">,</span> style<span class="sy0">:</span> <span class="st_h">'bold'</span><span class="sy0">,</span> lineHeightMultiplicator<span class="sy0">:</span> <span class="nu19">1.5</span><span class="sy0">,</span> size<span class="sy0">:</span> <span class="nu0">100</span><span class="sy0">,</span> fillStyle<span class="sy0">:</span> <span class="st_h">'rgba(255, 255, 255,0.9)'</span><span class="sy0">,</span> textBaseline<span class="sy0">:</span> <span class="st_h">'middle'</span><span class="sy0">,</span> textAlign<span class="sy0">:</span> <span class="st_h">'center'</span><span class="sy0">,</span> shadow<span class="sy0">:</span> <span class="br0">{</span> offsetX<span class="sy0">:</span> <span class="nu0">1</span><span class="sy0">,</span> offsetY<span class="sy0">:</span> <span class="nu0">1</span><span class="sy0">,</span> color<span class="sy0">:</span> <span class="st_h">'rgba(0, 0, 0, 0.5)'</span><span class="sy0">,</span> blur<span class="sy0">:</span> <span class="nu0">8</span><span class="sy0">,</span> <span class="br0">}</span><span class="sy0">,</span> stroke<span class="sy0">:</span> <span class="br0">{</span> style<span class="sy0">:</span> <span class="st_h">'rgba(15, 15, 15, 0.9)'</span><span class="sy0">,</span> lineWidth<span class="sy0">:</span> <span class="nu0">5</span><span class="sy0">,</span> <span class="br0">}</span><span class="sy0">,</span> glow<span class="sy0">:</span> <span class="br0">{</span> offsetX<span class="sy0">:</span> <span class="nu0">1</span><span class="sy0">,</span> offsetY<span class="sy0">:</span> <span class="nu0">1</span><span class="sy0">,</span> color<span class="sy0">:</span> <span class="st_h">'rgba(255, 255, 255, 1)'</span> <span class="br0">}</span> <span class="br0">}</span> <span class="br0">}</span><span class="sy0">;</span> <span class="kw2">const</span> doc <span class="sy0">=</span> <span class="kw2">new</span> yaml<span class="sy0">.</span>Document<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> doc<span class="sy0">.</span>version <span class="sy0">=</span> <span class="kw4">true</span><span class="sy0">;</span> doc<span class="sy0">.</span>commentBefore <span class="sy0">=</span> <span class="br0">[</span> <span class="st_h">'Конфигурация для создания картинок. Если что-то пошло не так, то удали этот файл и он пересоздастся с настройками по умолчанию.'</span><span class="sy0">,</span> <span class="st_h">'multiplicator - множитель для увеличения картинки в самом начале, а потом уменьшения. Нужен, чтобы делать сглаживание. При увеличении - увеличивается время генерации'</span><span class="sy0">,</span> <span class="st_h">'width - ширина картинки'</span><span class="sy0">,</span> <span class="st_h">'height - высота картинки'</span><span class="sy0">,</span> <span class="st_h">'maxWidth - максимальная ширина текста'</span><span class="sy0">,</span> <span class="st_h">'marginTopMultiplikator - множитель для отступа сверху. Считает отступ сбоку((width - maxWidth) / 2) и умножает его на эту цифру'</span><span class="sy0">,</span> <span class="st_h">'font - настройки текста'</span><span class="sy0">,</span> <span class="st_h">' name - название шрифта'</span><span class="sy0">,</span> <span class="st_h">' style - стиль шрифта(bold, italic или пусто. шрифт должен уметь поддерживать этот стиль)'</span><span class="sy0">,</span> <span class="st_h">' lineHeightMultiplicator - множитель для высоты строки текста. На эту цифру умножается размер шрифта'</span><span class="sy0">,</span> <span class="st_h">' size - начальный размер в пикселях, отталкиваясь от этого значения идёт изменение размера'</span><span class="sy0">,</span> <span class="st_h">' shadow - тень под текстом'</span><span class="sy0">,</span> <span class="st_h">' strokeStyle, lineWidth - обводка текста'</span><span class="sy0">,</span> <span class="st_h">'glow - свечение под текстом'</span><span class="sy0">,</span> <span class="br0">]</span><span class="sy0">.</span><a href="http://www.php.net/join"><span class="kw3">join</span></a><span class="br0">(</span><span class="st_h">'\n'</span><span class="br0">)</span><span class="sy0">;</span> doc<span class="sy0">.</span>contents <span class="sy0">=</span> config<span class="sy0">;</span> fs<span class="sy0">.</span>writeFileSync<span class="br0">(</span>configPath<span class="sy0">,</span> String<span class="br0">(</span>doc<span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span><span class="br0">{</span> <span class="kw2">const</span> <a href="http://www.php.net/file"><span class="kw3">file</span></a> <span class="sy0">=</span> fs<span class="sy0">.</span>readFileSync<span class="br0">(</span>configPath<span class="sy0">,</span> <span class="st_h">'utf8'</span><span class="br0">)</span><span class="sy0">;</span> config <span class="sy0">=</span> yaml<span class="sy0">.</span>parse<span class="br0">(</span><a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="br0">)</span> <span class="br0">}</span> <span class="kw2">var</span> multiplicateFields <span class="sy0">=</span> <span class="br0">[</span><span class="st_h">'width'</span><span class="sy0">,</span> <span class="st_h">'height'</span><span class="sy0">,</span> <span class="st_h">'maxWidth'</span><span class="br0">]</span><span class="sy0">;</span> multiplicateFields<span class="sy0">.</span><span class="kw1">forEach</span><span class="br0">(</span><span class="br0">(</span>field<span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> config<span class="br0">[</span>field<span class="br0">]</span> <span class="sy0">*=</span> config<span class="sy0">.</span>multiplicator<span class="sy0">;</span> <span class="br0">}</span><span class="br0">)</span><span class="sy0">;</span> config<span class="sy0">.</span>font<span class="sy0">.</span>size <span class="sy0">*=</span> config<span class="sy0">.</span>multiplicator<span class="sy0">;</span> <span class="kw1">return</span> config<span class="sy0">;</span> <span class="br0">}</span></pre></div> </div> </pre><p> </p>
-
-
safe_summary (String, 0 characters )
-
-
-
#formatter (String, 12 characters ) text_default
-
0 (Array, 1 element)
-
#markup (String, 50799 characters ) <p>Для нашей <a href="https://vk.com/affirmaciy...
-
<p>Для нашей <a href="https://vk.com/affirmaciya" target="_blank">группы ВКонтакте</a> регулярно требуются картинки с текстом, которые выкладывает Люба. Создавать же эти картинки в фотошопе достаточно долго. Для этого необходимо проделать очень много однотипных действий. </p> <p>Есть несколько важных параметров итогового изображения:</p> <ul><li>текст должен влезать на картинку, чтобы выглядел симметрично и красиво;</li> <li>у текста должна быть читаемость независимо от типа картинки на фоне(тёмная или светлая);</li> </ul><p>В итоге, написал небольшой скрипт на NodeJS, который подгоняет текст под размер картинки и выдаёт результат, который виден в конце этой страницы. Скачать код можно тут: <a href="https://yadi.sk/d/OLLUXtCDsTha4Q" target="_blank">https://yadi.sk/d/OLLUXtCDsTha4Q</a>. Чтобы посмотреть примеры - скроль до конца страницы.</p> <p>Чтобы использовать скрипт нужно установить NodeJS. Его можно скачать для своей платформы с официального сайта. После этого скачать код с Яндекс.Диска, распаковать его в папку и в консоли написать команду <em><span style="background-color:#D3D3D3">npm install</span></em>. После установки всех зависимостей можно запускать скрипт: из консоли <em><span style="background-color:#D3D3D3">node generate</span></em>. Возможно сделать исполняемый файл для Windows(нужно будет установить себе <a href="https://www.npmjs.com/package/pkg" target="_blank">пакет pkg</a>). Для этого в консоли <em><span style="background-color:#D3D3D3">npm run generate</span></em>. После создания исполняемого файла, всё что нужно будет находится в папке dist. При первом запуске скрипт попросит всё, что ему нужно для работы, плюс создаст файл с настройками. Настройки можно менять и если всё совсем перестало работать, тогда можно удалить файл и он пересоздастся с настройками по умолчанию. <strong>Важный момент</strong>: для файла с текстами(text.txt) необходимо указать кодировку utf-8, а в Windows по умолчанию создаётся windows-1251 из-за чего текст будет отображаться некорректно.</p> <p>Сам код написан грязно, но может быть кому-то сгодится для черпания новых идей.</p> <pre> <div class="geshifilter"><div class="php geshifilter-php"><pre class="de1"><span class="kw2">const</span> <span class="br0">{</span> createCanvas <span class="br0">}</span> <span class="sy0">=</span> <span class="kw1">require</span><span class="br0">(</span><span class="st_h">'canvas'</span><span class="br0">)</span> <span class="kw2">const</span> fs <span class="sy0">=</span> <span class="kw1">require</span><span class="br0">(</span><span class="st_h">'fs'</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw2">const</span> yaml <span class="sy0">=</span> <span class="kw1">require</span><span class="br0">(</span><span class="st_h">'yaml'</span><span class="br0">)</span> <span class="kw2">const</span> Jimp <span class="sy0">=</span> <span class="kw1">require</span><span class="br0">(</span><span class="st0">"jimp"</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw2">const</span> <a href="http://www.php.net/dir"><span class="kw3">dir</span></a> <span class="sy0">=</span> <span class="st_h">'./images'</span><span class="sy0">;</span> <span class="kw2">const</span> resultDir <span class="sy0">=</span> <span class="st_h">'./result'</span><span class="sy0">;</span> <span class="kw2">const</span> <a href="http://www.php.net/file"><span class="kw3">file</span></a> <span class="sy0">=</span> <span class="st_h">'./text.txt'</span><span class="sy0">;</span> <span class="kw2">const</span> settings <span class="sy0">=</span> getSettings<span class="br0">(</span>fs<span class="sy0">,</span> yaml<span class="sy0">,</span> <span class="st_h">'./settings.yaml'</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span> <span class="br0">(</span><span class="sy0">!</span>fs<span class="sy0">.</span>existsSync<span class="br0">(</span><a href="http://www.php.net/dir"><span class="kw3">dir</span></a><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> error<span class="br0">(</span><span class="st_h">'В папке с скриптом создай папку '</span><span class="sy0">+</span><a href="http://www.php.net/dir"><span class="kw3">dir</span></a><span class="sy0">+</span><span class="st_h">' и положи в неё картинки'</span><span class="br0">)</span><span class="sy0">;</span><span class="kw1">return</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">if</span> <span class="br0">(</span><span class="sy0">!</span>fs<span class="sy0">.</span>existsSync<span class="br0">(</span><a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> error<span class="br0">(</span><span class="st_h">'В папке с скриптом создай файл '</span><span class="sy0">+</span><a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="sy0">+</span><span class="st_h">' и на каждой его строке напиши тексты'</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">return</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span>fs<span class="sy0">.</span>existsSync<span class="br0">(</span>resultDir<span class="br0">)</span><span class="br0">)</span><span class="br0">{</span> error<span class="br0">(</span><span class="st_h">'Создана папка для хранения результатов: '</span> <span class="sy0">+</span> resultDir<span class="br0">)</span><span class="sy0">;</span> fs<span class="sy0">.</span>mkdirSync<span class="br0">(</span>resultDir<span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw2">var</span> images <span class="sy0">=</span> fs<span class="sy0">.</span>readdirSync<span class="br0">(</span><a href="http://www.php.net/dir"><span class="kw3">dir</span></a><span class="br0">)</span><span class="sy0">;</span> <span class="kw2">var</span> texts <span class="sy0">=</span> fs<span class="sy0">.</span>readFileSync<span class="br0">(</span><a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="sy0">,</span> <span class="st_h">'utf8'</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw2">var</span> textsArr <span class="sy0">=</span> texts<span class="sy0">.</span><a href="http://www.php.net/split"><span class="kw3">split</span></a><span class="br0">(</span><span class="sy0">/</span>\r?\n<span class="sy0">/</span>g<span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span>images<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> error<span class="br0">(</span><span class="st_h">'Папка '</span> <span class="sy0">+</span><a href="http://www.php.net/dir"><span class="kw3">dir</span></a><span class="sy0">+</span> <span class="st_h">' пустая, положи в неё картинки'</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">return</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span>textsArr<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> error<span class="br0">(</span><span class="st_h">'В файле '</span><span class="sy0">+</span><a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="sy0">+</span><span class="st_h">' нет аффирмаций, добавь их по одной аффирмации на строку'</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">return</span> <span class="br0">}</span> <span class="co1">//Начальные настройки</span> <span class="kw2">var</span> imageIndex <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="kw2">var</span> canvases <span class="sy0">=</span> <span class="br0">[</span><span class="br0">]</span><span class="sy0">;</span> <span class="kw2">var</span> ctxs <span class="sy0">=</span> <span class="br0">[</span><span class="br0">]</span><span class="sy0">;</span> <span class="kw2">var</span> buffers <span class="sy0">=</span> <span class="br0">[</span><span class="br0">]</span><span class="sy0">;</span> <span class="kw2">var</span> resultCount <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="co1">//Запускаем обработку текстов в цикле</span> textsArr<span class="sy0">.</span><span class="kw1">forEach</span><span class="br0">(</span><span class="br0">(</span>text<span class="sy0">,</span> index<span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> <span class="kw2">var</span> imageName <span class="sy0">=</span> images<span class="br0">[</span>imageIndex<span class="br0">]</span><span class="sy0">;</span> <span class="kw2">var</span> newImagePath <span class="sy0">=</span> resultDir <span class="sy0">+</span> <span class="st_h">'/'</span> <span class="sy0">+</span> index <span class="sy0">+</span> imageName<span class="sy0">;</span> imageIndex<span class="sy0">++;</span> <span class="kw1">if</span><span class="br0">(</span>images<span class="sy0">.</span>length <span class="sy0">==</span> imageIndex<span class="br0">)</span><span class="br0">{</span> imageIndex <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="br0">}</span> canvases<span class="br0">[</span>index<span class="br0">]</span> <span class="sy0">=</span> createCanvas<span class="br0">(</span>settings<span class="sy0">.</span>width<span class="sy0">,</span> settings<span class="sy0">.</span>height<span class="br0">)</span><span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span> <span class="sy0">=</span> canvases<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>getContext<span class="br0">(</span><span class="st_h">'2d'</span><span class="br0">)</span><span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>font <span class="sy0">=</span> `$<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>style<span class="br0">}</span> $<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>size<span class="br0">}</span>px $<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>name<span class="br0">}</span>`<span class="sy0">;</span> <span class="co1">//Подбираем размер шрифта, чтобы влезал по ширине</span> <span class="kw2">var</span> newFontSize <span class="sy0">=</span> chooseFontSize<span class="br0">(</span>ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">,</span> text<span class="sy0">,</span> settings<span class="sy0">.</span>maxWidth<span class="sy0">,</span> settings<span class="br0">)</span><span class="sy0">;</span> <span class="kw2">var</span> lineHeight <span class="sy0">=</span> newFontSize <span class="sy0">*</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>lineHeightMultiplicator<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>font <span class="sy0">=</span> `$<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>style<span class="br0">}</span> $<span class="br0">{</span>newFontSize<span class="br0">}</span>px $<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>name<span class="br0">}</span>`<span class="sy0">;</span> <span class="kw2">var</span> lines <span class="sy0">=</span> wrapLines<span class="br0">(</span>ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">,</span> textsArr<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">,</span> settings<span class="sy0">.</span>maxWidth<span class="br0">)</span><span class="sy0">;</span> <span class="kw2">var</span> marginTop <span class="sy0">=</span> <span class="br0">(</span>settings<span class="sy0">.</span>height <span class="sy0">-</span> lines<span class="sy0">.</span>length <span class="sy0">*</span> lineHeight<span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span> <span class="sy0">+</span> lineHeight <span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span> <span class="co1">//Печатаем на канвасе текст</span> lines<span class="sy0">.</span><span class="kw1">forEach</span><span class="br0">(</span><span class="br0">(</span>line<span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>fillStyle <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>fillStyle<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>textBaseline <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>textBaseline<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>textAlign <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>textAlign<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowOffsetX <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>shadow<span class="sy0">.</span>offsetX<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowOffsetY <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>shadow<span class="sy0">.</span>offsetY<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowColor <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>shadow<span class="sy0">.</span>color<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowBlur <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>shadow<span class="sy0">.</span>blur <span class="sy0">*</span> settings<span class="sy0">.</span>multiplicator<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>strokeStyle <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>stroke<span class="sy0">.</span>style<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>lineWidth <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>stroke<span class="sy0">.</span>lineWidth <span class="sy0">*</span> settings<span class="sy0">.</span>multiplicator<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>strokeText<span class="br0">(</span>line<span class="sy0">,</span> settings<span class="sy0">.</span>width<span class="sy0">/</span><span class="nu0">2</span><span class="sy0">,</span> marginTop<span class="br0">)</span><span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>fillText<span class="br0">(</span>line<span class="sy0">,</span> settings<span class="sy0">.</span>width<span class="sy0">/</span><span class="nu0">2</span><span class="sy0">,</span> marginTop<span class="br0">)</span><span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowOffsetX <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>glow<span class="sy0">.</span>offsetX<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowOffsetY <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>glow<span class="sy0">.</span>offsetY<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowColor <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>glow<span class="sy0">.</span>color<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>shadowBlur <span class="sy0">=</span> lineHeight<span class="sy0">;</span> ctxs<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>fillText<span class="br0">(</span>line<span class="sy0">,</span> settings<span class="sy0">.</span>width<span class="sy0">/</span><span class="nu0">2</span><span class="sy0">,</span> marginTop<span class="br0">)</span><span class="sy0">;</span> marginTop <span class="sy0">+=</span> lineHeight<span class="sy0">;</span> <span class="br0">}</span><span class="br0">)</span><span class="sy0">;</span> buffers<span class="br0">[</span>index<span class="br0">]</span> <span class="sy0">=</span> canvases<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">.</span>toBuffer<span class="br0">(</span><span class="st_h">'image/png'</span><span class="br0">)</span> <span class="co1">//Сохраняем картинку с написанным текстом</span> fs<span class="sy0">.</span>writeFile<span class="br0">(</span>resultDir <span class="sy0">+</span><span class="st_h">'/'</span><span class="sy0">+</span> index <span class="sy0">+</span> <span class="st_h">'text.png'</span><span class="sy0">,</span> buffers<span class="br0">[</span>index<span class="br0">]</span><span class="sy0">,</span> <span class="br0">(</span><span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> console<span class="sy0">.</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="br0">(</span>`Текст <span class="st0">"<span class="es4">${text}</span>"</span> добавлен в файл $<span class="br0">{</span>resultDir <span class="sy0">+</span><span class="st_h">'/'</span><span class="sy0">+</span> index <span class="sy0">+</span> <span class="st_h">'text.png'</span><span class="br0">}</span>`<span class="br0">)</span><span class="sy0">;</span> <span class="co1">//Окончательно сводим все картинки, выводим результат, чистим файлы</span> Jimp<span class="sy0">.</span>read<span class="br0">(</span><a href="http://www.php.net/dir"><span class="kw3">dir</span></a> <span class="sy0">+</span><span class="st_h">'/'</span><span class="sy0">+</span> imageName<span class="sy0">,</span> <span class="br0">(</span>err<span class="sy0">,</span> image<span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> Jimp<span class="sy0">.</span>read<span class="br0">(</span>resultDir <span class="sy0">+</span><span class="st_h">'/'</span><span class="sy0">+</span> index <span class="sy0">+</span> <span class="st_h">'text.png'</span><span class="sy0">,</span> <span class="br0">(</span>err<span class="sy0">,</span> textImage<span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> image <span class="sy0">.</span>cover<span class="br0">(</span>settings<span class="sy0">.</span>width<span class="sy0">,</span> settings<span class="sy0">.</span>height<span class="br0">)</span> <span class="sy0">.</span>composite<span class="br0">(</span>textImage<span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">)</span> <span class="sy0">.</span>resize<span class="br0">(</span>settings<span class="sy0">.</span>width <span class="sy0">/</span> settings<span class="sy0">.</span>multiplicator<span class="sy0">,</span> settings<span class="sy0">.</span>height <span class="sy0">/</span> settings<span class="sy0">.</span>multiplicator<span class="br0">)</span> <span class="sy0">.</span>write<span class="br0">(</span>newImagePath<span class="sy0">,</span> <span class="br0">(</span><span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> console<span class="sy0">.</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="br0">(</span>`Текст <span class="st0">"<span class="es4">${text}</span>"</span> наложен на картинку`<span class="br0">)</span><span class="sy0">;</span> fs<span class="sy0">.</span><a href="http://www.php.net/unlink"><span class="kw3">unlink</span></a><span class="br0">(</span>resultDir <span class="sy0">+</span><span class="st_h">'/'</span><span class="sy0">+</span> index <span class="sy0">+</span> <span class="st_h">'text.png'</span><span class="sy0">,</span> <span class="br0">(</span><span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> console<span class="sy0">.</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="br0">(</span>`Файл $<span class="br0">{</span>resultDir <span class="sy0">+</span><span class="st_h">'/'</span><span class="sy0">+</span> index <span class="sy0">+</span> <span class="st_h">'text.png'</span><span class="br0">}</span> с текстом удалён`<span class="br0">)</span> resultCount<span class="sy0">++;</span> <span class="kw1">if</span><span class="br0">(</span>resultCount <span class="sy0">==</span> textsArr<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> error<span class="br0">(</span><span class="st_h">'Все файлы обработаны, спасибо за использование нашей супер-программы :)'</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span><span class="br0">)</span> <span class="br0">}</span><span class="br0">)</span> <span class="br0">}</span><span class="br0">)</span><span class="sy0">;</span> <span class="co4">/** * Подбираем шрифт для печати на картинке. * Написано быстро и плохо, один и тот же код повторяется много раз * @param ctx * @param text * @param maxWidth * @returns {number} */</span> <span class="kw2">function</span> chooseFontSize<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="sy0">,</span> settings<span class="br0">)</span><span class="br0">{</span> <span class="kw2">var</span> fontSize <span class="sy0">=</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>size<span class="sy0">;</span> <span class="kw2">var</span> lines <span class="sy0">=</span> wrapLines<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="br0">)</span><span class="sy0">;</span> <span class="kw2">var</span> marginTopMultiplikator <span class="sy0">=</span> settings<span class="sy0">.</span>marginTopMultiplikator<span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span>lines<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> <span class="co1">//Шрифт слишком большой, какое-то из слов не влезает по ширине</span> <span class="kw1">while</span> <span class="br0">(</span><span class="sy0">!</span>lines<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> fontSize <span class="sy0">=</span> fontSize <span class="sy0">-</span> <span class="nu0">1</span><span class="sy0">;</span> <span class="co1">// Уменьшаем шрифт, чтобы всё влезло</span> ctx<span class="sy0">.</span>font <span class="sy0">=</span> `$<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>style<span class="br0">}</span> $<span class="br0">{</span>fontSize<span class="br0">}</span>px $<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>name<span class="br0">}</span>`<span class="sy0">;</span> lines <span class="sy0">=</span> wrapLines<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span>fontSize <span class="sy0">==</span> <span class="nu0">0</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">break</span><span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="br0">}</span> <span class="kw1">else</span><span class="br0">{</span> <span class="co1">// Проверяем, сколько пустого места остаётся сверху</span> <span class="kw2">var</span> canvasHeight <span class="sy0">=</span> ctx<span class="sy0">.</span>canvas<span class="sy0">.</span>height<span class="sy0">;</span> <span class="kw2">var</span> lineHeight <span class="sy0">=</span> fontSize <span class="sy0">*</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>lineHeightMultiplicator<span class="sy0">;</span> <span class="kw2">var</span> marginTop <span class="sy0">=</span> <span class="br0">(</span>canvasHeight <span class="sy0">-</span> lines<span class="sy0">.</span>length <span class="sy0">*</span> lineHeight<span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span>marginTop <span class="sy0"><</span> <span class="br0">(</span><span class="br0">(</span>ctx<span class="sy0">.</span>canvas<span class="sy0">.</span>width <span class="sy0">-</span> maxWidth<span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="br0">)</span> <span class="sy0">*</span> marginTopMultiplikator<span class="br0">)</span><span class="br0">{</span> <span class="kw1">while</span> <span class="br0">(</span>marginTop <span class="sy0"><</span> <span class="br0">(</span><span class="br0">(</span>ctx<span class="sy0">.</span>canvas<span class="sy0">.</span>width <span class="sy0">-</span> maxWidth<span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="br0">)</span> <span class="sy0">*</span> marginTopMultiplikator<span class="br0">)</span><span class="br0">{</span> fontSize<span class="sy0">--;</span> <span class="co1">// Увеличиваем шрифт, чтобы отступ сверху был больше</span> lines <span class="sy0">=</span> wrapLines<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="br0">)</span><span class="sy0">;</span> lineHeight <span class="sy0">=</span> fontSize <span class="sy0">*</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>lineHeightMultiplicator<span class="sy0">;</span> marginTop <span class="sy0">=</span> <span class="br0">(</span>canvasHeight <span class="sy0">-</span> lines<span class="sy0">.</span>length <span class="sy0">*</span> lineHeight<span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span> ctx<span class="sy0">.</span>font <span class="sy0">=</span> `$<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>style<span class="br0">}</span> $<span class="br0">{</span>fontSize<span class="br0">}</span>px $<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>name<span class="br0">}</span>`<span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="kw1">else</span><span class="br0">{</span> <span class="kw1">while</span> <span class="br0">(</span>marginTop <span class="sy0">></span> <span class="br0">(</span><span class="br0">(</span>ctx<span class="sy0">.</span>canvas<span class="sy0">.</span>width <span class="sy0">-</span> maxWidth<span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="br0">)</span> <span class="sy0">*</span> marginTopMultiplikator <span class="sy0">&&</span> lines<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> fontSize<span class="sy0">++;</span> <span class="co1">// Увеличиваем шрифт, чтобы отступ сверху был больше</span> lines <span class="sy0">=</span> wrapLines<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="br0">)</span><span class="sy0">;</span> lineHeight <span class="sy0">=</span> fontSize <span class="sy0">*</span> settings<span class="sy0">.</span>font<span class="sy0">.</span>lineHeightMultiplicator<span class="sy0">;</span> marginTop <span class="sy0">=</span> <span class="br0">(</span>canvasHeight <span class="sy0">-</span> lines<span class="sy0">.</span>length <span class="sy0">*</span> lineHeight<span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span> ctx<span class="sy0">.</span>font <span class="sy0">=</span> `$<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>style<span class="br0">}</span> $<span class="br0">{</span>fontSize<span class="br0">}</span>px $<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>name<span class="br0">}</span>`<span class="sy0">;</span> <span class="br0">}</span> fontSize<span class="sy0">--;</span> <span class="br0">}</span> lines <span class="sy0">=</span> wrapLines<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span>lines<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> <span class="kw1">while</span> <span class="br0">(</span><span class="sy0">!</span>lines<span class="sy0">.</span>length<span class="br0">)</span><span class="br0">{</span> fontSize <span class="sy0">=</span> fontSize <span class="sy0">-</span> <span class="nu0">1</span><span class="sy0">;</span> <span class="co1">// Уменьшаем шрифт, чтобы всё влезло</span> ctx<span class="sy0">.</span>font <span class="sy0">=</span> `$<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>style<span class="br0">}</span> $<span class="br0">{</span>fontSize<span class="br0">}</span>px $<span class="br0">{</span>settings<span class="sy0">.</span>font<span class="sy0">.</span>name<span class="br0">}</span>`<span class="sy0">;</span> lines <span class="sy0">=</span> wrapLines<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span>fontSize <span class="sy0">==</span> <span class="nu0">0</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">break</span><span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="br0">}</span> <span class="br0">}</span> <span class="kw1">return</span> fontSize<span class="sy0">;</span> <span class="br0">}</span> <span class="co4">/** * Отдаёт кол-во линий текста, которые влезают в максимальную ширину канваса. * Если отдаёт пустой массив, то одно из слов не влезает по ширине и значит шрифт нужно уменьшать * @param ctx * @param text * @param maxWidth * @returns {Array} */</span> <span class="kw2">function</span> wrapLines<span class="br0">(</span>ctx<span class="sy0">,</span> text<span class="sy0">,</span> maxWidth<span class="br0">)</span> <span class="br0">{</span> <span class="kw2">var</span> lines <span class="sy0">=</span> <span class="br0">[</span><span class="br0">]</span><span class="sy0">,</span> words <span class="sy0">=</span> text<span class="sy0">.</span>replace<span class="br0">(</span><span class="sy0">/</span>\n\n<span class="sy0">/</span>g<span class="sy0">,</span><span class="st_h">' ` '</span><span class="br0">)</span><span class="sy0">.</span>replace<span class="br0">(</span><span class="sy0">/</span><span class="br0">(</span>\n\s<span class="sy0">|</span>\s\n<span class="br0">)</span><span class="sy0">/</span>g<span class="sy0">,</span><span class="st_h">'\r'</span><span class="br0">)</span> <span class="sy0">.</span>replace<span class="br0">(</span><span class="sy0">/</span>\s\s<span class="sy0">/</span>g<span class="sy0">,</span><span class="st_h">' '</span><span class="br0">)</span><span class="sy0">.</span>replace<span class="br0">(</span><span class="st_h">'`'</span><span class="sy0">,</span><span class="st_h">' '</span><span class="br0">)</span><span class="sy0">.</span>replace<span class="br0">(</span><span class="sy0">/</span><span class="br0">(</span>\r<span class="sy0">|</span>\n<span class="br0">)</span><span class="sy0">/</span>g<span class="sy0">,</span><span class="st_h">' '</span><span class="sy0">+</span><span class="st_h">' '</span><span class="br0">)</span><span class="sy0">.</span><a href="http://www.php.net/split"><span class="kw3">split</span></a><span class="br0">(</span><span class="st_h">' '</span><span class="br0">)</span><span class="sy0">,</span> space <span class="sy0">=</span> ctx<span class="sy0">.</span>measureText<span class="br0">(</span><span class="st_h">' '</span><span class="br0">)</span><span class="sy0">.</span>width<span class="sy0">,</span> width <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">,</span> line <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">,</span> word <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">,</span> len <span class="sy0">=</span> words<span class="sy0">.</span>length<span class="sy0">,</span> w <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">,</span> i<span class="sy0">;</span> <span class="kw1">for</span> <span class="br0">(</span>i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0"><</span> len<span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">)</span> <span class="br0">{</span> word <span class="sy0">=</span> words<span class="br0">[</span>i<span class="br0">]</span><span class="sy0">;</span> w <span class="sy0">=</span> word ? ctx<span class="sy0">.</span>measureText<span class="br0">(</span>word<span class="br0">)</span><span class="sy0">.</span>width <span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="kw1">if</span> <span class="br0">(</span>w<span class="br0">)</span> <span class="br0">{</span> width <span class="sy0">=</span> width <span class="sy0">+</span> space <span class="sy0">+</span> w<span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">if</span> <span class="br0">(</span>w <span class="sy0">></span> maxWidth<span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="br0">[</span><span class="br0">]</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">(</span>w <span class="sy0">&&</span> width <span class="sy0"><</span> maxWidth<span class="br0">)</span> <span class="br0">{</span> line <span class="sy0">+=</span> <span class="br0">(</span>i ? <span class="st_h">' '</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">)</span> <span class="sy0">+</span> word<span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span> <span class="br0">{</span> <span class="sy0">!</span>i <span class="sy0">||</span> lines<span class="sy0">.</span>push<span class="br0">(</span>line <span class="sy0">!==</span> <span class="st_h">''</span> ? line<span class="sy0">.</span><a href="http://www.php.net/trim"><span class="kw3">trim</span></a><span class="br0">(</span><span class="br0">)</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">)</span><span class="sy0">;</span> line <span class="sy0">=</span> word<span class="sy0">;</span> width <span class="sy0">=</span> w<span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="kw1">if</span> <span class="br0">(</span>len <span class="sy0">!==</span> i <span class="sy0">||</span> line <span class="sy0">!==</span> <span class="st_h">''</span><span class="br0">)</span> <span class="br0">{</span> lines<span class="sy0">.</span>push<span class="br0">(</span>line<span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">return</span> lines<span class="sy0">;</span> <span class="br0">}</span> <span class="co4">/** * Отдаёт кол-во линий в файле * @param file * @returns {number} */</span> <span class="kw2">function</span> countFileLines<span class="br0">(</span><a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="br0">)</span><span class="br0">{</span> <span class="kw1">if</span><span class="br0">(</span><a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="br0">)</span><span class="br0">{</span> <span class="kw2">var</span> match <span class="sy0">=</span> <a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="sy0">.</span>match<span class="br0">(</span><span class="sy0">/</span>\r?\n<span class="sy0">/</span>g<span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span>match<span class="br0">)</span><span class="br0">{</span> <span class="kw1">return</span> match<span class="sy0">.</span>length <span class="sy0">+</span> <span class="nu0">1</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span><span class="br0">{</span> <span class="kw1">return</span> <span class="nu0">1</span><span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="kw1">return</span> <span class="nu0">1</span><span class="sy0">;</span> <span class="br0">}</span><span class="sy0">;</span> <span class="co4">/** * Выводим ошибку в консоль * @param text */</span> <span class="kw2">function</span> error<span class="br0">(</span>text<span class="br0">)</span><span class="br0">{</span> console<span class="sy0">.</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="br0">(</span>text<span class="br0">)</span><span class="sy0">;</span> setTimeout<span class="br0">(</span><span class="kw2">function</span><span class="br0">(</span><span class="br0">)</span><span class="br0">{</span><span class="br0">}</span><span class="sy0">,</span> <span class="nu0">5000</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="co4">/** * Получаем настройки или, если их нет, то создаём файл с дефолтными * @param fs * @param yaml * @returns {{multiplicator: number, width: number, fontSize: number, height: number, maxWidth: number}} */</span> <span class="kw2">function</span> getSettings<span class="br0">(</span>fs<span class="sy0">,</span> yaml<span class="sy0">,</span> configPath<span class="br0">)</span><span class="br0">{</span> <span class="kw2">var</span> config <span class="sy0">=</span> <span class="br0">{</span><span class="br0">}</span><span class="sy0">;</span> <span class="co1">//Создаём файл и пишем дефолтные настройки</span> <span class="kw1">if</span> <span class="br0">(</span><span class="sy0">!</span>fs<span class="sy0">.</span>existsSync<span class="br0">(</span>configPath<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> config <span class="sy0">=</span> <span class="br0">{</span> multiplicator<span class="sy0">:</span> <span class="nu0">1</span><span class="sy0">,</span> width<span class="sy0">:</span> <span class="nu0">1024</span><span class="sy0">,</span> height<span class="sy0">:</span> <span class="nu0">1024</span><span class="sy0">,</span> maxWidth<span class="sy0">:</span> <span class="nu0">900</span><span class="sy0">,</span> marginTopMultiplikator<span class="sy0">:</span> <span class="nu19">2.5</span><span class="sy0">,</span> font<span class="sy0">:</span> <span class="br0">{</span> name<span class="sy0">:</span> <span class="st_h">'Segoe Print'</span><span class="sy0">,</span> style<span class="sy0">:</span> <span class="st_h">'bold'</span><span class="sy0">,</span> lineHeightMultiplicator<span class="sy0">:</span> <span class="nu19">1.5</span><span class="sy0">,</span> size<span class="sy0">:</span> <span class="nu0">100</span><span class="sy0">,</span> fillStyle<span class="sy0">:</span> <span class="st_h">'rgba(255, 255, 255,0.9)'</span><span class="sy0">,</span> textBaseline<span class="sy0">:</span> <span class="st_h">'middle'</span><span class="sy0">,</span> textAlign<span class="sy0">:</span> <span class="st_h">'center'</span><span class="sy0">,</span> shadow<span class="sy0">:</span> <span class="br0">{</span> offsetX<span class="sy0">:</span> <span class="nu0">1</span><span class="sy0">,</span> offsetY<span class="sy0">:</span> <span class="nu0">1</span><span class="sy0">,</span> color<span class="sy0">:</span> <span class="st_h">'rgba(0, 0, 0, 0.5)'</span><span class="sy0">,</span> blur<span class="sy0">:</span> <span class="nu0">8</span><span class="sy0">,</span> <span class="br0">}</span><span class="sy0">,</span> stroke<span class="sy0">:</span> <span class="br0">{</span> style<span class="sy0">:</span> <span class="st_h">'rgba(15, 15, 15, 0.9)'</span><span class="sy0">,</span> lineWidth<span class="sy0">:</span> <span class="nu0">5</span><span class="sy0">,</span> <span class="br0">}</span><span class="sy0">,</span> glow<span class="sy0">:</span> <span class="br0">{</span> offsetX<span class="sy0">:</span> <span class="nu0">1</span><span class="sy0">,</span> offsetY<span class="sy0">:</span> <span class="nu0">1</span><span class="sy0">,</span> color<span class="sy0">:</span> <span class="st_h">'rgba(255, 255, 255, 1)'</span> <span class="br0">}</span> <span class="br0">}</span> <span class="br0">}</span><span class="sy0">;</span> <span class="kw2">const</span> doc <span class="sy0">=</span> <span class="kw2">new</span> yaml<span class="sy0">.</span>Document<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> doc<span class="sy0">.</span>version <span class="sy0">=</span> <span class="kw4">true</span><span class="sy0">;</span> doc<span class="sy0">.</span>commentBefore <span class="sy0">=</span> <span class="br0">[</span> <span class="st_h">'Конфигурация для создания картинок. Если что-то пошло не так, то удали этот файл и он пересоздастся с настройками по умолчанию.'</span><span class="sy0">,</span> <span class="st_h">'multiplicator - множитель для увеличения картинки в самом начале, а потом уменьшения. Нужен, чтобы делать сглаживание. При увеличении - увеличивается время генерации'</span><span class="sy0">,</span> <span class="st_h">'width - ширина картинки'</span><span class="sy0">,</span> <span class="st_h">'height - высота картинки'</span><span class="sy0">,</span> <span class="st_h">'maxWidth - максимальная ширина текста'</span><span class="sy0">,</span> <span class="st_h">'marginTopMultiplikator - множитель для отступа сверху. Считает отступ сбоку((width - maxWidth) / 2) и умножает его на эту цифру'</span><span class="sy0">,</span> <span class="st_h">'font - настройки текста'</span><span class="sy0">,</span> <span class="st_h">' name - название шрифта'</span><span class="sy0">,</span> <span class="st_h">' style - стиль шрифта(bold, italic или пусто. шрифт должен уметь поддерживать этот стиль)'</span><span class="sy0">,</span> <span class="st_h">' lineHeightMultiplicator - множитель для высоты строки текста. На эту цифру умножается размер шрифта'</span><span class="sy0">,</span> <span class="st_h">' size - начальный размер в пикселях, отталкиваясь от этого значения идёт изменение размера'</span><span class="sy0">,</span> <span class="st_h">' shadow - тень под текстом'</span><span class="sy0">,</span> <span class="st_h">' strokeStyle, lineWidth - обводка текста'</span><span class="sy0">,</span> <span class="st_h">'glow - свечение под текстом'</span><span class="sy0">,</span> <span class="br0">]</span><span class="sy0">.</span><a href="http://www.php.net/join"><span class="kw3">join</span></a><span class="br0">(</span><span class="st_h">'\n'</span><span class="br0">)</span><span class="sy0">;</span> doc<span class="sy0">.</span>contents <span class="sy0">=</span> config<span class="sy0">;</span> fs<span class="sy0">.</span>writeFileSync<span class="br0">(</span>configPath<span class="sy0">,</span> String<span class="br0">(</span>doc<span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span><span class="br0">{</span> <span class="kw2">const</span> <a href="http://www.php.net/file"><span class="kw3">file</span></a> <span class="sy0">=</span> fs<span class="sy0">.</span>readFileSync<span class="br0">(</span>configPath<span class="sy0">,</span> <span class="st_h">'utf8'</span><span class="br0">)</span><span class="sy0">;</span> config <span class="sy0">=</span> yaml<span class="sy0">.</span>parse<span class="br0">(</span><a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="br0">)</span> <span class="br0">}</span> <span class="kw2">var</span> multiplicateFields <span class="sy0">=</span> <span class="br0">[</span><span class="st_h">'width'</span><span class="sy0">,</span> <span class="st_h">'height'</span><span class="sy0">,</span> <span class="st_h">'maxWidth'</span><span class="br0">]</span><span class="sy0">;</span> multiplicateFields<span class="sy0">.</span><span class="kw1">forEach</span><span class="br0">(</span><span class="br0">(</span>field<span class="br0">)</span> <span class="sy0">=></span> <span class="br0">{</span> config<span class="br0">[</span>field<span class="br0">]</span> <span class="sy0">*=</span> config<span class="sy0">.</span>multiplicator<span class="sy0">;</span> <span class="br0">}</span><span class="br0">)</span><span class="sy0">;</span> config<span class="sy0">.</span>font<span class="sy0">.</span>size <span class="sy0">*=</span> config<span class="sy0">.</span>multiplicator<span class="sy0">;</span> <span class="kw1">return</span> config<span class="sy0">;</span> <span class="br0">}</span></pre></div> </div> </pre><p> </p>
-
-
-
-
field_razdel (Array, 16 elements)
-
#theme (String, 5 characters ) field
-
#weight (String, 1 characters ) 3
-
#title (String, 12 characters ) Раздел
-
#access (Boolean) TRUE
-
#label_display (String, 6 characters ) inline
-
#view_mode (String, 4 characters ) full
-
#language (String, 3 characters ) und
-
#field_name (String, 12 characters ) field_razdel
-
#field_type (String, 23 characters ) taxonomy_term_reference
-
#field_translatable (String, 1 characters ) 0
-
#entity_type (String, 4 characters ) node
-
#bundle (String, 4 characters ) blog
-
#object (Object) stdClass
-
∞ (Recursion)
-
-
#items (Array, 1 element)
-
0 (Array, 2 elements)
-
tid (String, 2 characters ) 66
-
taxonomy_term (Object) stdClass
-
∞ (Recursion)
-
-
-
-
#formatter (String, 28 characters ) taxonomy_term_reference_link
-
0 (Array, 4 elements)
-
-
field_teg (Array, 17 elements)
-
#theme (String, 5 characters ) field
-
#weight (String, 1 characters ) 4
-
#title (String, 8 characters ) Тэги
-
#access (Boolean) TRUE
-
#label_display (String, 6 characters ) inline
-
#view_mode (String, 4 characters ) full
-
#language (String, 3 characters ) und
-
#field_name (String, 9 characters ) field_teg
-
#field_type (String, 23 characters ) taxonomy_term_reference
-
#field_translatable (String, 1 characters ) 0
-
#entity_type (String, 4 characters ) node
-
#bundle (String, 4 characters ) blog
-
#object (Object) stdClass
-
∞ (Recursion)
-
-
#items (Array, 2 elements)
-
0 (Array, 2 elements)
-
tid (String, 3 characters ) 336
-
taxonomy_term (Object) stdClass
-
∞ (Recursion)
-
-
-
1 (Array, 2 elements)
-
tid (String, 3 characters ) 337
-
taxonomy_term (Object) stdClass
-
∞ (Recursion)
-
-
-
-
#formatter (String, 28 characters ) taxonomy_term_reference_link
-
0 (Array, 4 elements)
-
1 (Array, 4 elements)
-
-
#pre_render (Array, 1 element)
-
0 (String, 30 characters ) _field_extra_fields_pre_render | (Callback) _field_extra_fields_pre_render();
-
-
#entity_type (String, 4 characters ) node
-
#bundle (String, 4 characters ) blog
-
links (Array, 5 elements)
-
#theme (String, 11 characters ) links__node
-
#pre_render (Array, 1 element)
-
0 (String, 23 characters ) drupal_pre_render_links | (Callback) drupal_pre_render_links();
-
-
#attributes (Array, 1 element)
-
node (Array, 3 elements)
-
comment (Array, 3 elements)
-
-
comments (Array, 4 elements)
-
comment_form (Array, 41 elements)
-
#node (Object) stdClass
-
∞ (Recursion)
-
-
#id (String, 12 characters ) comment-form
-
#attributes (Array, 1 element)
-
#theme (Array, 2 elements)
-
#attached (Array, 2 elements)
-
library (Array, 1 element)
-
js (Array, 1 element)
-
0 (Array, 2 elements)
-
type (String, 7 characters ) setting
-
data (Array, 1 element)
-
urlIsAjaxTrusted (Array, 1 element)
-
/comment/reply/620 (Boolean) TRUE
-
-
-
-
-
-
#action (String, 18 characters ) /comment/reply/620
-
author (Array, 15 elements)
-
#weight (Integer) -2
-
name (Array, 26 elements)
-
#type (String, 9 characters ) textfield
-
#title (String, 15 characters ) Ваше имя
-
#default_value (String, 0 characters )
-
#required (Boolean) FALSE
-
#maxlength (Integer) 60
-
#size (Integer) 30
-
#input (Boolean) TRUE
-
#autocomplete_path (Boolean) FALSE
-
#process (Array, 2 elements)
-
#theme (String, 9 characters ) textfield
-
#theme_wrappers (Array, 1 element)
-
0 (String, 12 characters ) form_element
-
-
#pre_render (Array, 1 element)
-
0 (String, 27 characters ) ctools_dependent_pre_render | (Callback) ctools_dependent_pre_render();
-
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 4 characters ) name
-
-
#array_parents (Array, 2 elements)
-
#weight (Integer) 0
-
#processed (Boolean) TRUE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 9 characters ) edit-name
-
#name (String, 4 characters ) name
-
#value (String, 0 characters )
-
#autocomplete_input (Array, 0 elements)
-
#ajax_processed (Boolean) FALSE
-
#sorted (Boolean) TRUE
-
-
mail (Array, 28 elements)
-
#type (String, 9 characters ) textfield
-
#title (String, 6 characters ) E-mail
-
#default_value (String, 0 characters )
-
#required (Boolean) FALSE
-
#maxlength (Integer) 64
-
#size (Integer) 30
-
#description (String, 132 characters ) Содержание этого поля является приватным и не п...
-
Содержание этого поля является приватным и не предназначено для показа.
-
-
#access (Boolean) TRUE
-
#input (Boolean) TRUE
-
#autocomplete_path (Boolean) FALSE
-
#process (Array, 2 elements)
-
#theme (String, 9 characters ) textfield
-
#theme_wrappers (Array, 1 element)
-
0 (String, 12 characters ) form_element
-
-
#pre_render (Array, 1 element)
-
0 (String, 27 characters ) ctools_dependent_pre_render | (Callback) ctools_dependent_pre_render();
-
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 4 characters ) mail | (Callback) mail();
-
-
#array_parents (Array, 2 elements)
-
#weight (Float) 0.001
-
#processed (Boolean) TRUE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 9 characters ) edit-mail
-
#name (String, 4 characters ) mail | (Callback) mail();
-
#value (String, 0 characters )
-
#autocomplete_input (Array, 0 elements)
-
#ajax_processed (Boolean) FALSE
-
#sorted (Boolean) TRUE
-
-
homepage (Array, 27 elements)
-
#type (String, 9 characters ) textfield
-
#title (String, 33 characters ) Домашняя страница
-
#default_value (String, 0 characters )
-
#maxlength (Integer) 255
-
#size (Integer) 30
-
#access (Boolean) TRUE
-
#input (Boolean) TRUE
-
#autocomplete_path (Boolean) FALSE
-
#process (Array, 2 elements)
-
#theme (String, 9 characters ) textfield
-
#theme_wrappers (Array, 1 element)
-
0 (String, 12 characters ) form_element
-
-
#pre_render (Array, 1 element)
-
0 (String, 27 characters ) ctools_dependent_pre_render | (Callback) ctools_dependent_pre_render();
-
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 8 characters ) homepage
-
-
#array_parents (Array, 2 elements)
-
#weight (Float) 0.002
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 13 characters ) edit-homepage
-
#name (String, 8 characters ) homepage
-
#value (String, 0 characters )
-
#autocomplete_input (Array, 0 elements)
-
#ajax_processed (Boolean) FALSE
-
#sorted (Boolean) TRUE
-
-
date (Array, 27 elements)
-
#type (String, 9 characters ) textfield
-
#title (String, 27 characters ) Время создания
-
#default_value (String, 0 characters )
-
#maxlength (Integer) 25
-
#size (Integer) 20
-
#access (Boolean) FALSE
-
#input (Boolean) TRUE
-
#autocomplete_path (Boolean) FALSE
-
#process (Array, 2 elements)
-
#theme (String, 9 characters ) textfield
-
#theme_wrappers (Array, 1 element)
-
0 (String, 12 characters ) form_element
-
-
#pre_render (Array, 1 element)
-
0 (String, 27 characters ) ctools_dependent_pre_render | (Callback) ctools_dependent_pre_render();
-
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 4 characters ) date | (Callback) date();
-
-
#array_parents (Array, 2 elements)
-
#weight (Float) 0.003
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 9 characters ) edit-date
-
#name (String, 4 characters ) date | (Callback) date();
-
#value (String, 0 characters )
-
#autocomplete_input (Array, 0 elements)
-
#ajax_processed (Boolean) FALSE
-
#sorted (Boolean) TRUE
-
-
status (Array, 23 elements)
-
#type (String, 6 characters ) radios
-
#title (String, 12 characters ) Статус
-
#default_value (Integer) 0
-
#options (Array, 2 elements)
-
#access (Boolean) FALSE
-
#input (Boolean) TRUE
-
#process (Array, 1 element)
-
0 (String, 19 characters ) form_process_radios | (Callback) form_process_radios();
-
-
#theme_wrappers (Array, 1 element)
-
0 (String, 6 characters ) radios
-
-
#pre_render (Array, 2 elements)
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 6 characters ) status
-
-
#array_parents (Array, 2 elements)
-
#weight (Float) 0.004
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 11 characters ) edit-status
-
#name (String, 6 characters ) status
-
#value (Integer) 0
-
1 (Array, 25 elements)
-
#type (String, 5 characters ) radio
-
#title (String, 24 characters ) Опубликовано
-
#return_value (Integer) 1
-
#default_value (Integer) 0
-
#attributes (Array, 0 elements)
-
#parents (Array, 1 element)
-
0 (String, 6 characters ) status
-
-
#id (String, 13 characters ) edit-status-1
-
#ajax (NULL)
-
#weight (Float) 0.001
-
#input (Boolean) TRUE
-
#process (Array, 1 element)
-
0 (String, 17 characters ) ajax_process_form | (Callback) ajax_process_form();
-
-
#theme (String, 5 characters ) radio
-
#theme_wrappers (Array, 1 element)
-
0 (String, 12 characters ) form_element
-
-
#title_display (String, 5 characters ) after
-
#pre_render (Array, 1 element)
-
0 (String, 27 characters ) ctools_dependent_pre_render | (Callback) ctools_dependent_pre_render();
-
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#access (Boolean) FALSE
-
#array_parents (Array, 3 elements)
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#name (String, 6 characters ) status
-
#value (Integer) 0
-
#ajax_processed (Boolean) FALSE
-
#sorted (Boolean) TRUE
-
-
0 (Array, 25 elements)
-
#type (String, 5 characters ) radio
-
#title (String, 29 characters ) Не опубликовано
-
#return_value (Integer) 0
-
#default_value (Integer) 0
-
#attributes (Array, 0 elements)
-
#parents (Array, 1 element)
-
0 (String, 6 characters ) status
-
-
#id (String, 13 characters ) edit-status-0
-
#ajax (NULL)
-
#weight (Float) 0.002
-
#input (Boolean) TRUE
-
#process (Array, 1 element)
-
0 (String, 17 characters ) ajax_process_form | (Callback) ajax_process_form();
-
-
#theme (String, 5 characters ) radio
-
#theme_wrappers (Array, 1 element)
-
0 (String, 12 characters ) form_element
-
-
#title_display (String, 5 characters ) after
-
#pre_render (Array, 1 element)
-
0 (String, 27 characters ) ctools_dependent_pre_render | (Callback) ctools_dependent_pre_render();
-
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#access (Boolean) FALSE
-
#array_parents (Array, 3 elements)
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#name (String, 6 characters ) status
-
#value (Integer) 0
-
#ajax_processed (Boolean) FALSE
-
#sorted (Boolean) TRUE
-
-
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 6 characters ) author
-
-
#array_parents (Array, 1 element)
-
0 (String, 6 characters ) author
-
-
#processed (Boolean) FALSE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 11 characters ) edit-author
-
#sorted (Boolean) TRUE
-
-
subject (Array, 27 elements)
-
#type (String, 9 characters ) textfield
-
#title (String, 8 characters ) Тема
-
#maxlength (Integer) 64
-
#default_value (String, 0 characters )
-
#access (Boolean) FALSE
-
#weight (Integer) -1
-
#input (Boolean) TRUE
-
#size (Integer) 60
-
#autocomplete_path (Boolean) FALSE
-
#process (Array, 2 elements)
-
#theme (String, 9 characters ) textfield
-
#theme_wrappers (Array, 1 element)
-
0 (String, 12 characters ) form_element
-
-
#pre_render (Array, 1 element)
-
0 (String, 27 characters ) ctools_dependent_pre_render | (Callback) ctools_dependent_pre_render();
-
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 7 characters ) subject
-
-
#array_parents (Array, 1 element)
-
0 (String, 7 characters ) subject
-
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 12 characters ) edit-subject
-
#name (String, 7 characters ) subject
-
#value (String, 0 characters )
-
#autocomplete_input (Array, 0 elements)
-
#ajax_processed (Boolean) FALSE
-
#sorted (Boolean) TRUE
-
-
is_anonymous (Array, 15 elements)
-
#type (String, 5 characters ) value
-
#value (Boolean) TRUE
-
#input (Boolean) TRUE
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 12 characters ) is_anonymous
-
-
#array_parents (Array, 1 element)
-
0 (String, 12 characters ) is_anonymous
-
-
#weight (Float) 0.002
-
#processed (Boolean) FALSE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 17 characters ) edit-is-anonymous
-
#name (String, 12 characters ) is_anonymous
-
#sorted (Boolean) TRUE
-
-
cid (Array, 15 elements)
-
#type (String, 5 characters ) value
-
#value (NULL)
-
#input (Boolean) TRUE
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 3 characters ) cid
-
-
#array_parents (Array, 1 element)
-
0 (String, 3 characters ) cid
-
-
#weight (Float) 0.003
-
#processed (Boolean) FALSE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 8 characters ) edit-cid
-
#name (String, 3 characters ) cid
-
#sorted (Boolean) TRUE
-
-
pid (Array, 15 elements)
-
#type (String, 5 characters ) value
-
#value (NULL)
-
#input (Boolean) TRUE
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 3 characters ) pid
-
-
#array_parents (Array, 1 element)
-
0 (String, 3 characters ) pid
-
-
#weight (Float) 0.004
-
#processed (Boolean) FALSE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 8 characters ) edit-pid
-
#name (String, 3 characters ) pid
-
#sorted (Boolean) TRUE
-
-
nid (Array, 15 elements)
-
#type (String, 5 characters ) value
-
#value (String, 3 characters ) 620
-
#input (Boolean) TRUE
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 3 characters ) nid
-
-
#array_parents (Array, 1 element)
-
0 (String, 3 characters ) nid
-
-
#weight (Float) 0.005
-
#processed (Boolean) FALSE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 8 characters ) edit-nid
-
#name (String, 3 characters ) nid
-
#sorted (Boolean) TRUE
-
-
language (Array, 15 elements)
-
#type (String, 5 characters ) value
-
#value (String, 3 characters ) und
-
#input (Boolean) TRUE
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 8 characters ) language
-
-
#array_parents (Array, 1 element)
-
0 (String, 8 characters ) language
-
-
#weight (Float) 0.006
-
#processed (Boolean) FALSE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 13 characters ) edit-language
-
#name (String, 8 characters ) language
-
#sorted (Boolean) TRUE
-
-
uid (Array, 15 elements)
-
#type (String, 5 characters ) value
-
#value (Integer) 0
-
#input (Boolean) TRUE
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 3 characters ) uid
-
-
#array_parents (Array, 1 element)
-
0 (String, 3 characters ) uid
-
-
#weight (Float) 0.007
-
#processed (Boolean) FALSE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 8 characters ) edit-uid
-
#name (String, 3 characters ) uid
-
#sorted (Boolean) TRUE
-
-
node_type (Array, 15 elements)
-
#type (String, 5 characters ) value
-
#value (String, 17 characters ) comment_node_blog
-
#input (Boolean) TRUE
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 9 characters ) node_type
-
-
#array_parents (Array, 1 element)
-
0 (String, 9 characters ) node_type
-
-
#weight (Float) 0.008
-
#processed (Boolean) FALSE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 14 characters ) edit-node-type
-
#name (String, 9 characters ) node_type
-
#sorted (Boolean) TRUE
-
-
actions (Array, 15 elements)
-
#type (String, 7 characters ) actions
-
submit (Array, 22 elements)
-
#type (String, 6 characters ) submit
-
#value (String, 18 characters ) Сохранить
-
#access (Boolean) FALSE
-
#weight (Integer) 19
-
#input (Boolean) TRUE
-
#name (String, 2 characters ) op
-
#button_type (String, 6 characters ) submit
-
#executes_submit_callback (Boolean) TRUE
-
#limit_validation_errors (Boolean) FALSE
-
#process (Array, 1 element)
-
0 (String, 17 characters ) ajax_process_form | (Callback) ajax_process_form();
-
-
#theme_wrappers (Array, 1 element)
-
0 (String, 6 characters ) button
-
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 6 characters ) submit
-
-
#array_parents (Array, 2 elements)
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 11 characters ) edit-submit
-
#ajax_processed (Boolean) FALSE
-
#sorted (Boolean) TRUE
-
-
preview (Array, 23 elements)
-
#type (String, 6 characters ) submit
-
#value (String, 24 characters ) Предпросмотр
-
#access (Boolean) TRUE
-
#weight (Integer) 20
-
#submit (Array, 1 element)
-
0 (String, 26 characters ) comment_form_build_preview | (Callback) comment_form_build_preview();
-
-
#input (Boolean) TRUE
-
#name (String, 2 characters ) op
-
#button_type (String, 6 characters ) submit
-
#executes_submit_callback (Boolean) TRUE
-
#limit_validation_errors (Boolean) FALSE
-
#process (Array, 1 element)
-
0 (String, 17 characters ) ajax_process_form | (Callback) ajax_process_form();
-
-
#theme_wrappers (Array, 1 element)
-
0 (String, 6 characters ) button
-
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 7 characters ) preview
-
-
#array_parents (Array, 2 elements)
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 12 characters ) edit-preview
-
#ajax_processed (Boolean) FALSE
-
#sorted (Boolean) TRUE
-
-
#theme_wrappers (Array, 1 element)
-
0 (String, 9 characters ) container
-
-
#process (Array, 2 elements)
-
#weight (Integer) 100
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 7 characters ) actions
-
-
#array_parents (Array, 1 element)
-
0 (String, 7 characters ) actions
-
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#attributes (Array, 1 element)
-
#title_display (String, 6 characters ) before
-
#id (String, 12 characters ) edit-actions
-
-
#parents (Array, 0 elements)
-
#entity (Object) stdClass
-
nid (String, 3 characters ) 620
-
name (String, 0 characters )
-
mail (String, 0 characters )
-
homepage (String, 0 characters )
-
subject (String, 0 characters )
-
comment (String, 0 characters )
-
cid (NULL)
-
pid (NULL)
-
language (String, 3 characters ) und
-
uid (Integer) 0
-
node_type (String, 17 characters ) comment_node_blog
-
-
comment_body (Array, 17 elements)
-
#type (String, 9 characters ) container
-
#attributes (Array, 1 element)
-
#weight (Integer) 0
-
#tree (Boolean) TRUE
-
#language (String, 3 characters ) und
-
und (Array, 22 elements)
-
0 (Array, 34 elements)
-
#entity_type (String, 7 characters ) comment
-
#entity (Object) stdClass
-
∞ (Recursion)
-
-
#bundle (String, 17 characters ) comment_node_blog
-
#field_name (String, 12 characters ) comment_body
-
#language (String, 3 characters ) und
-
#field_parents (Array, 0 elements)
-
#columns (Array, 2 elements)
-
#title (String, 22 characters ) Комментарий
-
#description (String, 0 characters )
-
#required (Boolean) TRUE
-
#delta (Integer) 0
-
#weight (Integer) 0
-
#type (String, 11 characters ) text_format
-
#default_value (NULL)
-
#rows (String, 1 characters ) 5
-
#attributes (Array, 1 element)
-
#format (String, 13 characters ) filtered_html
-
#base_type (String, 8 characters ) textarea
-
#after_build (Array, 1 element)
-
0 (String, 33 characters ) simplify_hide_text_format_element | (Callback) simplify_hide_text_format_element();
-
-
#process (Array, 1 element)
-
0 (String, 21 characters ) filter_process_format | (Callback) filter_process_format();
-
-
#theme_wrappers (Array, 1 element)
-
0 (String, 19 characters ) text_format_wrapper
-
-
#pre_render (Array, 2 elements)
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) TRUE
-
#parents (Array, 3 elements)
-
#array_parents (Array, 3 elements)
-
#processed (Boolean) TRUE
-
#title_display (String, 6 characters ) before
-
#id (String, 23 characters ) edit-comment-body-und-0
-
value (Array, 37 elements)
-
#entity_type (String, 7 characters ) comment
-
#entity (Object) stdClass
-
∞ (Recursion)
-
-
#bundle (String, 17 characters ) comment_node_blog
-
#field_name (String, 12 characters ) comment_body
-
#language (String, 3 characters ) und
-
#field_parents (Array, 0 elements)
-
#columns (Array, 2 elements)
-
#title (String, 22 characters ) Комментарий
-
#required (Boolean) TRUE
-
#delta (Integer) 0
-
#type (String, 8 characters ) textarea
-
#default_value (NULL)
-
#rows (String, 1 characters ) 5
-
#attributes (Array, 1 element)
-
#format (NULL)
-
#base_type (String, 8 characters ) textarea
-
#after_build (Array, 1 element)
-
0 (String, 33 characters ) simplify_hide_text_format_element | (Callback) simplify_hide_text_format_element();
-
-
#pre_render (Array, 2 elements)
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) TRUE
-
#array_parents (Array, 4 elements)
-
#title_display (String, 6 characters ) before
-
#process (Array, 2 elements)
-
#input (Boolean) TRUE
-
#cols (Integer) 60
-
#resizable (Boolean) TRUE
-
#theme (String, 8 characters ) textarea
-
#theme_wrappers (Array, 1 element)
-
0 (String, 12 characters ) form_element
-
-
#parents (Array, 4 elements)
-
#weight (Integer) 0
-
#processed (Boolean) TRUE
-
#id (String, 29 characters ) edit-comment-body-und-0-value
-
#name (String, 27 characters ) comment_body[und][0][value]
-
#value (String, 0 characters )
-
#ajax_processed (Boolean) FALSE
-
#sorted (Boolean) TRUE
-
#after_build_done (Boolean) TRUE
-
-
#attached (Array, 2 elements)
-
format (Array, 23 elements)
-
#type (String, 8 characters ) fieldset
-
#attributes (Array, 1 element)
-
guidelines (Array, 16 elements)
-
#type (String, 9 characters ) container
-
#attributes (Array, 1 element)
-
#weight (Integer) 20
-
filtered_html (Array, 12 elements)
-
#theme (String, 17 characters ) filter_guidelines
-
#format (Object) stdClass
-
#tree (Boolean) TRUE
-
#parents (Array, 6 elements)
-
#array_parents (Array, 6 elements)
-
#weight (Integer) 0
-
#processed (Boolean) FALSE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 55 characters ) edit-comment-body-und-0-format-guidelines-filte...
-
edit-comment-body-und-0-format-guidelines-filtered-html
-
-
#sorted (Boolean) TRUE
-
-
plain_text (Array, 12 elements)
-
#theme (String, 17 characters ) filter_guidelines
-
#format (Object) stdClass
-
#tree (Boolean) TRUE
-
#parents (Array, 6 elements)
-
#array_parents (Array, 6 elements)
-
#weight (Float) 0.001
-
#processed (Boolean) FALSE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 52 characters ) edit-comment-body-und-0-format-guidelines-plain...
-
edit-comment-body-und-0-format-guidelines-plain-text
-
-
#sorted (Boolean) TRUE
-
-
#theme_wrappers (Array, 1 element)
-
0 (String, 9 characters ) container
-
-
#process (Array, 1 element)
-
0 (String, 22 characters ) form_process_container | (Callback) form_process_container();
-
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) TRUE
-
#parents (Array, 5 elements)
-
#array_parents (Array, 5 elements)
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#title_display (String, 6 characters ) before
-
#id (String, 41 characters ) edit-comment-body-und-0-format-guidelines
-
#sorted (Boolean) TRUE
-
-
format (Array, 25 elements)
-
#type (String, 6 characters ) select
-
#title (String, 25 characters ) Формат текста
-
#options (Array, 2 elements)
-
filtered_html (String, 13 characters ) Filtered HTML
-
plain_text (String, 10 characters ) Plain text
-
-
#default_value (String, 13 characters ) filtered_html
-
#access (Boolean) TRUE
-
#weight (Integer) 10
-
#attributes (Array, 1 element)
-
#parents (Array, 4 elements)
-
#input (Boolean) TRUE
-
#multiple (Boolean) FALSE
-
#process (Array, 2 elements)
-
#theme (String, 6 characters ) select
-
#theme_wrappers (Array, 1 element)
-
0 (String, 12 characters ) form_element
-
-
#pre_render (Array, 2 elements)
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) TRUE
-
#array_parents (Array, 5 elements)
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#title_display (String, 6 characters ) before
-
#id (String, 33 characters ) edit-comment-body-und-0-format--2
-
#name (String, 28 characters ) comment_body[und][0][format]
-
#value (String, 13 characters ) filtered_html
-
#ajax_processed (Boolean) FALSE
-
#sorted (Boolean) TRUE
-
-
help (Array, 15 elements)
-
#type (String, 9 characters ) container
-
#theme (String, 21 characters ) filter_tips_more_info
-
#attributes (Array, 1 element)
-
#weight (Integer) 0
-
#theme_wrappers (Array, 1 element)
-
0 (String, 9 characters ) container
-
-
#process (Array, 1 element)
-
0 (String, 22 characters ) form_process_container | (Callback) form_process_container();
-
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) TRUE
-
#parents (Array, 5 elements)
-
#array_parents (Array, 5 elements)
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#title_display (String, 6 characters ) before
-
#id (String, 35 characters ) edit-comment-body-und-0-format-help
-
#sorted (Boolean) TRUE
-
-
#collapsible (Boolean) FALSE
-
#collapsed (Boolean) FALSE
-
#value (NULL)
-
#process (Array, 2 elements)
-
#pre_render (Array, 2 elements)
-
#theme_wrappers (Array, 1 element)
-
0 (String, 8 characters ) fieldset
-
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) TRUE
-
#parents (Array, 4 elements)
-
#array_parents (Array, 4 elements)
-
#weight (Float) 0.001
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#title_display (String, 6 characters ) before
-
#id (String, 30 characters ) edit-comment-body-und-0-format
-
#groups (Array, 1 element)
-
comment_body][und][0][format (Array, 1 element)
-
#group_exists (Boolean) TRUE
-
-
-
#attached (Array, 1 element)
-
#ajax_processed (Boolean) FALSE
-
-
#sorted (Boolean) TRUE
-
#after_build_done (Boolean) TRUE
-
-
#theme (String, 25 characters ) field_multiple_value_form | (Callback) field_multiple_value_form();
-
#field_name (String, 12 characters ) comment_body
-
#cardinality (String, 1 characters ) 1
-
#title (String, 22 characters ) Комментарий
-
#required (Integer) 1
-
#description (String, 0 characters )
-
#prefix (String, 40 characters ) <div id="comment-body-add-more-wrapper">
-
#suffix (String, 6 characters ) </div>
-
#max_delta (Integer) 0
-
#after_build (Array, 1 element)
-
0 (String, 30 characters ) field_form_element_after_build | (Callback) field_form_element_after_build();
-
-
#language (String, 3 characters ) und
-
#field_parents (Array, 0 elements)
-
#tree (Boolean) TRUE
-
#parents (Array, 2 elements)
-
#array_parents (Array, 2 elements)
-
#weight (Integer) 0
-
#processed (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 21 characters ) edit-comment-body-und
-
#after_build_done (Boolean) TRUE
-
-
#access (Boolean) TRUE
-
#theme_wrappers (Array, 1 element)
-
0 (String, 9 characters ) container
-
-
#process (Array, 1 element)
-
0 (String, 22 characters ) form_process_container | (Callback) form_process_container();
-
-
#defaults_loaded (Boolean) TRUE
-
#parents (Array, 1 element)
-
0 (String, 12 characters ) comment_body
-
-
#array_parents (Array, 1 element)
-
0 (String, 12 characters ) comment_body
-
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#title_display (String, 6 characters ) before
-
#id (String, 17 characters ) edit-comment-body
-
#sorted (Boolean) TRUE
-
-
#pre_render (Array, 1 element)
-
0 (String, 30 characters ) _field_extra_fields_pre_render | (Callback) _field_extra_fields_pre_render();
-
-
#entity_type (String, 7 characters ) comment
-
#bundle (String, 17 characters ) comment_node_blog
-
#form_id (String, 22 characters ) comment_node_blog_form
-
#type (String, 4 characters ) form
-
#build_id (String, 48 characters ) form-AymD0ONq8PpXgvGVZn2Ok8c1L8zLN2UN2hvuTfCmh2c
-
form_build_id (Array, 18 elements)
-
#type (String, 6 characters ) hidden
-
#value (String, 48 characters ) form-AymD0ONq8PpXgvGVZn2Ok8c1L8zLN2UN2hvuTfCmh2c
-
#id (String, 48 characters ) form-AymD0ONq8PpXgvGVZn2Ok8c1L8zLN2UN2hvuTfCmh2c
-
#name (String, 13 characters ) form_build_id
-
#parents (Array, 1 element)
-
0 (String, 13 characters ) form_build_id
-
-
#input (Boolean) TRUE
-
#process (Array, 1 element)
-
0 (String, 17 characters ) ajax_process_form | (Callback) ajax_process_form();
-
-
#theme (String, 6 characters ) hidden
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#array_parents (Array, 1 element)
-
0 (String, 13 characters ) form_build_id
-
-
#weight (Float) 0.011
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#ajax_processed (Boolean) FALSE
-
#sorted (Boolean) TRUE
-
-
form_id (Array, 18 elements)
-
#type (String, 6 characters ) hidden
-
#value (String, 22 characters ) comment_node_blog_form
-
#id (String, 27 characters ) edit-comment-node-blog-form
-
#parents (Array, 1 element)
-
0 (String, 7 characters ) form_id
-
-
#input (Boolean) TRUE
-
#process (Array, 1 element)
-
0 (String, 17 characters ) ajax_process_form | (Callback) ajax_process_form();
-
-
#theme (String, 6 characters ) hidden
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#array_parents (Array, 1 element)
-
0 (String, 7 characters ) form_id
-
-
#weight (Float) 0.012
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#name (String, 7 characters ) form_id
-
#ajax_processed (Boolean) FALSE
-
#sorted (Boolean) TRUE
-
-
#method (String, 4 characters ) post
-
#theme_wrappers (Array, 1 element)
-
0 (String, 4 characters ) form
-
-
#tree (Boolean) FALSE
-
#validate (Array, 2 elements)
-
#submit (Array, 1 element)
-
0 (String, 19 characters ) comment_form_submit | (Callback) comment_form_submit();
-
-
captcha (Array, 29 elements)
-
#type (String, 7 characters ) captcha
-
#captcha_type (String, 35 characters ) draggable_captcha/Draggable Captcha
-
#description (String, 236 characters ) Этот вопрос задается для того, чтобы выяснить, ...
-
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
-
-
#weight (Float) 98.9
-
#input (Boolean) TRUE
-
#process (Array, 3 elements)
-
0 (String, 36 characters ) recaptcha_v3_element_captcha_process | (Callback) recaptcha_v3_element_captcha_process();
-
1 (String, 23 characters ) captcha_element_process | (Callback) captcha_element_process();
-
2 (String, 45 characters ) recaptcha_v3_element_captcha_process_validate | (Callback) recaptcha_v3_element_captcha_process_validate();
-
-
#captcha_always (Boolean) FALSE
-
#default_value (String, 0 characters )
-
#captcha_admin_mode (Boolean) FALSE
-
#captcha_validate (String, 35 characters ) draggable_captcha_custom_validation | (Callback) draggable_captcha_custom_validation();
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 7 characters ) captcha
-
-
#array_parents (Array, 1 element)
-
0 (String, 7 characters ) captcha
-
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 12 characters ) edit-captcha
-
#name (String, 7 characters ) captcha
-
#value (String, 0 characters )
-
captcha_sid (Array, 18 elements)
-
#type (String, 6 characters ) hidden
-
#value (String, 7 characters ) 3379366
-
#input (Boolean) TRUE
-
#process (Array, 1 element)
-
0 (String, 17 characters ) ajax_process_form | (Callback) ajax_process_form();
-
-
#theme (String, 6 characters ) hidden
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 11 characters ) captcha_sid
-
-
#array_parents (Array, 2 elements)
-
#weight (Integer) 0
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 16 characters ) edit-captcha-sid
-
#name (String, 11 characters ) captcha_sid
-
#ajax_processed (Boolean) FALSE
-
#sorted (Boolean) TRUE
-
-
captcha_token (Array, 18 elements)
-
#type (String, 6 characters ) hidden
-
#value (String, 32 characters ) b7a8055fb8e7750b9ad2e513efa368d6
-
#input (Boolean) TRUE
-
#process (Array, 1 element)
-
0 (String, 17 characters ) ajax_process_form | (Callback) ajax_process_form();
-
-
#theme (String, 6 characters ) hidden
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 13 characters ) captcha_token
-
-
#array_parents (Array, 2 elements)
-
#weight (Float) 0.001
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 18 characters ) edit-captcha-token
-
#name (String, 13 characters ) captcha_token
-
#ajax_processed (Boolean) FALSE
-
#sorted (Boolean) TRUE
-
-
#captcha_info (Array, 3 elements)
-
form_id (String, 22 characters ) comment_node_blog_form
-
captcha_sid (String, 7 characters ) 3379366
-
solution (String, 53 characters ) draggable_JDHKljYCiOStCs5lXv9v3K2hNDe7WRbW6QSBt...
-
draggable_JDHKljYCiOStCs5lXv9v3K2hNDe7WRbW6QSBtefyuQ0
-
-
-
captcha_widgets (Array, 12 elements)
-
captca_image (Array, 15 elements)
-
#type (String, 6 characters ) markup
-
#markup (String, 1151 characters ) <div id="draggable-captcha"> <label> Dra...
-
<div id="draggable-captcha"> <label> Drag or click the correct shape to the grey "drop area". </label> <div class="captchaWrapper" id="captchaWrapper"> <a href="/draggable-captcha/3379366/refresh/nojs/" class="captchaRefresh use-ajax"></a> <div id="draggable_K9jREYc-wQ0-LUNng0qAaC3lqvmAEWulKJaXJQaqT-E" class="draggable" style="left:15px;background-position:-56px -3px;"> </div> <div id="draggable_frLIRUJ73s34opVoaRy4wSV2MpOG0mLXV1Um9sAdK4Q" class="draggable" style="left:83px;background-position:0 -3px;"> </div> <div id="draggable_JDHKljYCiOStCs5lXv9v3K2hNDe7WRbW6QSBtefyuQ0" class="draggable" style="left:151px;background-position:-185px -3px;"> </div> <div id="draggable_rhVFRtnMwNf_dxWRuiVdJ4kZ4jH34rSn9PnFtLfw-eg" class="draggable" style="left:219px;background-position:-120px -3px;"> </div> <div class="targetWrapper"> <div class="target" style="background:none;"> <img alt="Target Image" src="/draggable-captcha/target-img?v2726" /> </div> </div> </div> </div>
-
-
#attached (Array, 2 elements)
-
css (Array, 1 element)
-
0 (String, 60 characters ) sites/all/modules/draggable_captcha/css/draggab...
-
sites/all/modules/draggable_captcha/css/draggable-styles.css
-
-
-
js (Array, 6 elements)
-
0 (String, 49 characters ) https://borodiny.ru/misc/ui/jquery.ui.core.min.js
-
1 (String, 51 characters ) https://borodiny.ru/misc/ui/jquery.ui.widget.mi...
-
https://borodiny.ru/misc/ui/jquery.ui.widget.min.js
-
-
2 (String, 50 characters ) https://borodiny.ru/misc/ui/jquery.ui.mouse.min.js
-
3 (String, 54 characters ) https://borodiny.ru/misc/ui/jquery.ui.draggable...
-
https://borodiny.ru/misc/ui/jquery.ui.draggable.min.js
-
-
4 (String, 54 characters ) https://borodiny.ru/misc/ui/jquery.ui.droppable...
-
https://borodiny.ru/misc/ui/jquery.ui.droppable.min.js
-
-
5 (String, 59 characters ) sites/all/modules/draggable_captcha/js/draggabl...
-
sites/all/modules/draggable_captcha/js/draggable_captcha.js
-
-
-
-
#pre_render (Array, 2 elements)
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 12 characters ) captca_image
-
-
#array_parents (Array, 3 elements)
-
#weight (Integer) 0
-
#processed (Boolean) FALSE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 17 characters ) edit-captca-image
-
#sorted (Boolean) TRUE
-
-
captcha_response (Array, 25 elements)
-
#type (String, 9 characters ) textfield
-
#attributes (Array, 1 element)
-
#default_value (String, 0 characters )
-
#required (Boolean) TRUE
-
#input (Boolean) TRUE
-
#size (Integer) 60
-
#maxlength (Integer) 128
-
#autocomplete_path (Boolean) FALSE
-
#process (Array, 2 elements)
-
#theme (String, 9 characters ) textfield
-
#theme_wrappers (Array, 1 element)
-
0 (String, 12 characters ) form_element
-
-
#pre_render (Array, 1 element)
-
0 (String, 27 characters ) ctools_dependent_pre_render | (Callback) ctools_dependent_pre_render();
-
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 16 characters ) captcha_response
-
-
#array_parents (Array, 3 elements)
-
#weight (Float) 0.001
-
#processed (Boolean) TRUE
-
#title_display (String, 6 characters ) before
-
#id (String, 21 characters ) edit-captcha-response
-
#name (String, 16 characters ) captcha_response
-
#value (String, 0 characters )
-
#autocomplete_input (Array, 0 elements)
-
#ajax_processed (Boolean) FALSE
-
#sorted (Boolean) TRUE
-
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 15 characters ) captcha_widgets
-
-
#array_parents (Array, 2 elements)
-
#weight (Float) 0.002
-
#processed (Boolean) FALSE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 20 characters ) edit-captcha-widgets
-
#sorted (Boolean) TRUE
-
-
#element_validate (Array, 1 element)
-
0 (String, 16 characters ) captcha_validate | (Callback) captcha_validate();
-
-
#theme (String, 7 characters ) captcha
-
#pre_render (Array, 1 element)
-
0 (String, 26 characters ) captcha_pre_render_process | (Callback) captcha_pre_render_process();
-
-
#sorted (Boolean) TRUE
-
-
notify_settings (Array, 12 elements)
-
notify (Array, 24 elements)
-
#type (String, 8 characters ) checkbox
-
#title (String, 68 characters ) Уведомлять меня о новых комментариях...
-
Уведомлять меня о новых комментариях
-
-
#default_value (Boolean) TRUE
-
#input (Boolean) TRUE
-
#return_value (Integer) 1
-
#theme (String, 8 characters ) checkbox
-
#process (Array, 2 elements)
-
#theme_wrappers (Array, 1 element)
-
0 (String, 12 characters ) form_element
-
-
#title_display (String, 5 characters ) after
-
#pre_render (Array, 1 element)
-
0 (String, 27 characters ) ctools_dependent_pre_render | (Callback) ctools_dependent_pre_render();
-
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 6 characters ) notify
-
-
#array_parents (Array, 2 elements)
-
#weight (Integer) 0
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#id (String, 11 characters ) edit-notify
-
#name (String, 6 characters ) notify
-
#value (Boolean) TRUE
-
#checked (Boolean) TRUE
-
#ajax_processed (Boolean) FALSE
-
#sorted (Boolean) TRUE
-
-
notify_type (Array, 21 elements)
-
#type (String, 6 characters ) radios
-
#options (Array, 2 elements)
-
#default_value (String, 1 characters ) 1
-
#input (Boolean) TRUE
-
#process (Array, 1 element)
-
0 (String, 19 characters ) form_process_radios | (Callback) form_process_radios();
-
-
#theme_wrappers (Array, 1 element)
-
0 (String, 6 characters ) radios
-
-
#pre_render (Array, 2 elements)
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 11 characters ) notify_type
-
-
#array_parents (Array, 2 elements)
-
#weight (Float) 0.001
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 16 characters ) edit-notify-type
-
#name (String, 11 characters ) notify_type
-
#value (String, 1 characters ) 1
-
1 (Array, 24 elements)
-
#type (String, 5 characters ) radio
-
#title (String, 29 characters ) Все комментарии
-
#return_value (Integer) 1
-
#default_value (String, 1 characters ) 1
-
#attributes (Array, 0 elements)
-
#parents (Array, 1 element)
-
0 (String, 11 characters ) notify_type
-
-
#id (String, 18 characters ) edit-notify-type-1
-
#ajax (NULL)
-
#weight (Float) 0.001
-
#input (Boolean) TRUE
-
#process (Array, 1 element)
-
0 (String, 17 characters ) ajax_process_form | (Callback) ajax_process_form();
-
-
#theme (String, 5 characters ) radio
-
#theme_wrappers (Array, 1 element)
-
0 (String, 12 characters ) form_element
-
-
#title_display (String, 5 characters ) after
-
#pre_render (Array, 1 element)
-
0 (String, 27 characters ) ctools_dependent_pre_render | (Callback) ctools_dependent_pre_render();
-
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#array_parents (Array, 3 elements)
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#name (String, 11 characters ) notify_type
-
#value (String, 1 characters ) 1
-
#ajax_processed (Boolean) FALSE
-
#sorted (Boolean) TRUE
-
-
2 (Array, 24 elements)
-
#type (String, 5 characters ) radio
-
#title (String, 47 characters ) Ответы на мой комментарий
-
#return_value (Integer) 2
-
#default_value (String, 1 characters ) 1
-
#attributes (Array, 0 elements)
-
#parents (Array, 1 element)
-
0 (String, 11 characters ) notify_type
-
-
#id (String, 18 characters ) edit-notify-type-2
-
#ajax (NULL)
-
#weight (Float) 0.002
-
#input (Boolean) TRUE
-
#process (Array, 1 element)
-
0 (String, 17 characters ) ajax_process_form | (Callback) ajax_process_form();
-
-
#theme (String, 5 characters ) radio
-
#theme_wrappers (Array, 1 element)
-
0 (String, 12 characters ) form_element
-
-
#title_display (String, 5 characters ) after
-
#pre_render (Array, 1 element)
-
0 (String, 27 characters ) ctools_dependent_pre_render | (Callback) ctools_dependent_pre_render();
-
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#array_parents (Array, 3 elements)
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#name (String, 11 characters ) notify_type
-
#value (String, 1 characters ) 1
-
#ajax_processed (Boolean) FALSE
-
#sorted (Boolean) TRUE
-
-
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 15 characters ) notify_settings
-
-
#array_parents (Array, 1 element)
-
0 (String, 15 characters ) notify_settings
-
-
#weight (Float) 0.014
-
#processed (Boolean) FALSE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 20 characters ) edit-notify-settings
-
#sorted (Boolean) TRUE
-
-
url (Array, 29 elements)
-
#type (String, 9 characters ) textfield
-
#title (String, 22 characters ) Leave this field blank
-
#size (Integer) 20
-
#weight (Integer) 100
-
#attributes (Array, 1 element)
-
autocomplete (String, 3 characters ) off
-
-
#element_validate (Array, 1 element)
-
0 (String, 27 characters ) _honeypot_honeypot_validate | (Callback) _honeypot_honeypot_validate();
-
-
#prefix (String, 27 characters ) <div class="url-textfield">
-
#suffix (String, 6 characters ) </div>
-
#attached (Array, 1 element)
-
#input (Boolean) TRUE
-
#maxlength (Integer) 128
-
#autocomplete_path (Boolean) FALSE
-
#process (Array, 2 elements)
-
#theme (String, 9 characters ) textfield
-
#theme_wrappers (Array, 1 element)
-
0 (String, 12 characters ) form_element
-
-
#pre_render (Array, 1 element)
-
0 (String, 27 characters ) ctools_dependent_pre_render | (Callback) ctools_dependent_pre_render();
-
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 3 characters ) url | (Callback) url();
-
-
#array_parents (Array, 1 element)
-
0 (String, 3 characters ) url | (Callback) url();
-
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#title_display (String, 6 characters ) before
-
#id (String, 8 characters ) edit-url
-
#name (String, 3 characters ) url | (Callback) url();
-
#value (String, 0 characters )
-
#autocomplete_input (Array, 0 elements)
-
#ajax_processed (Boolean) FALSE
-
#sorted (Boolean) TRUE
-
-
honeypot_time (Array, 21 elements)
-
#type (String, 6 characters ) hidden
-
#title (String, 10 characters ) Время
-
#default_value (String, 54 characters ) 1773376380|67He_agUsMfYzoTcPM4zdRkHqR8A1Ec5646L...
-
1773376380|67He_agUsMfYzoTcPM4zdRkHqR8A1Ec5646LEoEV2bs
-
-
#element_validate (Array, 1 element)
-
0 (String, 35 characters ) _honeypot_time_restriction_validate | (Callback) _honeypot_time_restriction_validate();
-
-
#input (Boolean) TRUE
-
#process (Array, 1 element)
-
0 (String, 17 characters ) ajax_process_form | (Callback) ajax_process_form();
-
-
#theme (String, 6 characters ) hidden
-
#defaults_loaded (Boolean) TRUE
-
#tree (Boolean) FALSE
-
#parents (Array, 1 element)
-
0 (String, 13 characters ) honeypot_time
-
-
#array_parents (Array, 1 element)
-
0 (String, 13 characters ) honeypot_time
-
-
#weight (Float) 0.016
-
#processed (Boolean) TRUE
-
#required (Boolean) FALSE
-
#attributes (Array, 0 elements)
-
#title_display (String, 6 characters ) before
-
#id (String, 18 characters ) edit-honeypot-time
-
#name (String, 13 characters ) honeypot_time
-
#value (String, 54 characters ) 1773376380|67He_agUsMfYzoTcPM4zdRkHqR8A1Ec5646L...
-
1773376380|67He_agUsMfYzoTcPM4zdRkHqR8A1Ec5646LEoEV2bs
-
-
#ajax_processed (Boolean) FALSE
-
#sorted (Boolean) TRUE
-
-
#processed (Boolean) FALSE
-
#defaults_loaded (Boolean) TRUE
-
#required (Boolean) FALSE
-
#title_display (String, 6 characters ) before
-
#array_parents (Array, 0 elements)
-
-
#theme (String, 26 characters ) comment_wrapper__node_blog
-
#node (Object) stdClass
-
∞ (Recursion)
-
-
comments (Array, 0 elements)
-
-
field_blog_image (Array, 16 elements)
-
#theme (String, 5 characters ) field
-
#weight (Integer) 1
-
#title (String, 16 characters ) Картинки
-
#access (Boolean) TRUE
-
#label_display (String, 6 characters ) hidden
-
#view_mode (String, 15 characters ) _custom_display
-
#language (String, 3 characters ) und
-
#field_name (String, 16 characters ) field_blog_image
-
#field_type (String, 5 characters ) image
-
#field_translatable (String, 1 characters ) 0
-
#entity_type (String, 4 characters ) node
-
#bundle (String, 4 characters ) blog
-
#object (Object) stdClass
-
∞ (Recursion)
-
-
#items (Array, 3 elements)
-
0 (Array, 13 elements)
-
fid (String, 4 characters ) 1330
-
uid (String, 1 characters ) 1
-
filename (String, 30 characters ) 0a4456cbf6b2dba896e61e9e50.jpg
-
uri (String, 39 characters ) public://0a4456cbf6b2dba896e61e9e50.jpg
-
filemime (String, 10 characters ) image/jpeg
-
filesize (String, 6 characters ) 696533
-
status (String, 1 characters ) 1
-
timestamp (String, 10 characters ) 1590308321
-
alt (String, 0 characters )
-
title (String, 0 characters )
-
width (String, 3 characters ) 900
-
height (String, 3 characters ) 900
-
image_field_caption (Array, 2 elements)
-
-
1 (Array, 13 elements)
-
fid (String, 4 characters ) 1333
-
uid (String, 1 characters ) 1
-
filename (String, 26 characters ) 2pdxbojb9jua_kopirovat.jpg
-
uri (String, 35 characters ) public://2pdxbojb9jua_kopirovat.jpg
-
filemime (String, 10 characters ) image/jpeg
-
filesize (String, 6 characters ) 246238
-
status (String, 1 characters ) 1
-
timestamp (String, 10 characters ) 1590308834
-
alt (String, 0 characters )
-
title (String, 0 characters )
-
width (String, 3 characters ) 800
-
height (String, 3 characters ) 800
-
image_field_caption (Array, 2 elements)
-
-
2 (Array, 13 elements)
-
fid (String, 4 characters ) 1331
-
uid (String, 1 characters ) 1
-
filename (String, 34 characters ) 3dary-dushi-1024x718_kopirovat.jpg
-
uri (String, 43 characters ) public://3dary-dushi-1024x718_kopirovat.jpg
-
filemime (String, 10 characters ) image/jpeg
-
filesize (String, 6 characters ) 246684
-
status (String, 1 characters ) 1
-
timestamp (String, 10 characters ) 1590308701
-
alt (String, 0 characters )
-
title (String, 0 characters )
-
width (String, 3 characters ) 800
-
height (String, 3 characters ) 800
-
image_field_caption (Array, 2 elements)
-
-
-
#formatter (String, 19 characters ) my_image_right_text
-
0 (Array, 1 element)
-
#markup (String, 1154 characters ) <table> <tbody> <tr class="odd"><td><a href="h...
-
<table> <tbody> <tr class="odd"><td><a href="https://borodiny.ru/sites/default/files/0a4456cbf6b2dba896e61e9e50.jpg" class="colorbox" title="" alt=""><img src="https://borodiny.ru/sites/default/files/styles/front_foto_square_image/public/0a4456cbf6b2dba896e61e9e50.jpg" alt="" /></a></td><td><p>Пример короткого текста на картинке</p> </td> </tr> <tr class="even"><td><a href="https://borodiny.ru/sites/default/files/2pdxbojb9jua_kopirovat.jpg" class="colorbox" title="" alt=""><img src="https://borodiny.ru/sites/default/files/styles/front_foto_square_image/public/2pdxbojb9jua_kopirovat.jpg" alt="" /></a></td><td><p>Текст среднего размера</p> </td> </tr> <tr class="odd"><td><a href="https://borodiny.ru/sites/default/files/3dary-dushi-1024x718_kopirovat.jpg" class="colorbox" title="" alt=""><img src="https://borodiny.ru/sites/default/files/styles/front_foto_square_image/public/3dary-dushi-1024x718_kopirovat.jpg" alt="" /></a></td><td><p>Очень длинный текст, в котором появляются артефакты на тенях.</p> </td> </tr> </tbody> </table>
-
-
-
-
#view_mode (String, 4 characters ) full
-
#theme (String, 4 characters ) node
-
#node (Object) stdClass
-
∞ (Recursion)
-
-
#language (String, 2 characters ) ru
-
-
Krumo version 0.2.1a
| http://krumo.sourceforge.net
