Блог
Главные вкладки
Вторичные вкладки
-
... (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)
-
field_teg (Array, 1 element)
-
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;}
-
-
-
Krumo version 0.2.1a
| http://krumo.sourceforge.net
