рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!
рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдмрд╣реБрдд рдкрд╣рд▓реЗ, рдПрдХ рдЯрд░реНрдо рдкреЗрдкрд░ рд▓рд┐рдЦрдирд╛ рд╕реАрдЦрдиреЗ рдХрд╛ рдХрд╛рдо рдореЗрд░реЗ рдкрд╛рд╕ рдЖрдпрд╛, рдФрд░ рдореИрдВрдиреЗ рдЖрдЦрд┐рд░рдХрд╛рд░ рдЗрд╕реЗ рд▓рд┐рдЦрд╛ред рддрд╛рдХрд┐ рдЕрдЪреНрдЫрд╛ рдЧрд╛рдпрдм рди рд╣реЛ, рдореИрдВрдиреЗ рдПрдХ рд▓реЗрдЦ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ (рдкрд╛рдареНрдпрдХреНрд░рдо) рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рди рдХреЗрд╡рд▓ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬреЛ рд╡реЗрдм рд╡рд┐рдХрд╛рд╕ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЙрддрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЬреЛ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдзреБрдирд┐рдХ рд╡реЗрдм рдПрдХ рдЙрдЪреНрдЪ рд╡реЗрддрди рдХрд╛ рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред
рддреЛ, рдкрд╛рдареНрдпрдХреНрд░рдо рдХрд╛ рд╡рд┐рд╖рдп:
рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо "рдЦреЛрдЬ" рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВред рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдкрд╛рда рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджрд┐рдП рдЧрдП рд╢рдмреНрджреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рд╢рдмреНрдж рдХреАрдмреЛрд░реНрдб рд╕реЗ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рджрд░реНрдЬ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдХреЗ рд▓рд┐рдП, рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдкрд╛рда рдХреА рд▓рд╛рдЗрди рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╢рдмреНрдж рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореИрдВ рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрд╕рдкреАрдП рдФрд░ рдкреАрдбрдмреНрд▓реНрдпреВрдП рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рддрд░рд╣ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдХреЛ рдЫреВрдиреЗ рдХрд╛ рдХреЛрдИ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рдерд╛ ред рдзреАрд░реЗ-рдзреАрд░реЗ рдПрдордПрд╕ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЛ рдмрдВрдж рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, рдХреНрдпреЛрдВ рдирд╣реАрдВ ...
рдФрд░, рдЪрд▓реЛ рдбреЗрд╡рд▓рдкрд░ рдЯреВрд▓ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рдЖрдзреБрдирд┐рдХ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ ISR (IDE) - рдЗрдВрдЯреАрдЧреНрд░реЗрдЯреЗрдб рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рдХрд╛рд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ ( рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ ) рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ , рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб, рд╕рдВрдХрд▓рди, рдЕрд╕реЗрдВрдмрд▓реА рдФрд░ рдбреАрдмрдЧрд┐рдВрдЧ рдХреЗ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рд▓реЗрдЦрди, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕реНрд╡рдд: рд▓реЙрдиреНрдЪ, рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░ рдЯреВрд▓ рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЪрд░рдгреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВред рдЖрдИрдПрд╕рдЖрд░ рдХреЗ рдЖрдЧрдорди рд╕реЗ рдкрд╣рд▓реЗ , рд╡рд┐рдХрд╛рд╕ рдиреЗ рд╕рд░рд▓рддрдо рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдлреА рд╕рдордп рд▓рд┐рдпрд╛ред рд╕рд╛рде рд╣реА, рд╡рд┐рдХрд╛рд╕ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реБрдИред SRI рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИред рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдФрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдЬрд┐рддрдирд╛ рдЬрдЯрд┐рд▓ рд╣реЛрдЧрд╛, рдЙрддрдирд╛ рд╣реА рд▓рдЪреАрд▓рд╛ рдФрд░ рдЬрдЯрд┐рд▓ рд╣реЛрдЧрд╛ISR рдФрд░ рдЙрдкрдХрд░рдг рдЬреЛ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
. . тАФ Visual Studio Code, Microsoft Windows, Linux macOS. ┬л┬╗ - . , Git, , IntelliSense . : , . , , . Visual Studio Code , тАж

- Visual Studio Code
тАУ PhpStorm. - Web . JetBrains IntelliJ IDEA. PhpStorm PHP, HTML JavaScript , PHP JavaScript. PhpStorm PHP 5.3, 5.4, 5.5, 5.6, 7.0, 7.1, 7.2 7.4 ( ), , , , , . SQL- .
, IntelliJ, .
"" PhpStorm , 7 .

тАУ PhpStorm
1.
1.1
Electron тАФ , , GitHub, HTML, CSS JavaScript. Electron Chromium Node.js , Mac, Windows Linux.
Electron 2013 Atom. 2014 . Electron , .
Chromium тАФ , , . Chromium Google Chrome. Electron Chromium .
Node.js тАФ , V8 ( JavaScript ), JavaScript . Node.js JavaScript - API ( C++), , , JavaScript-. Node.js , -, Node.js ( NW.js, AppJS Electron Linux, Windows macOS) (, tessel espruino). Node.js - ( ) /.
Electron Google Chrome тАУ n- . .

Electron
Electron IPC.
IPC ( inter-process communication) тАФ . , , IPC. , .
, IPC, :
, - , . Electron', , API Node.js -, .
. , ┬л┬╗. . .
"" . , , . , , . , , ( ) тАУ npm (Node Package Manager), GitHub ( 2018 Microsoft).
Npm :
(CLI), , .
, / , .
, .
1.2 /
:
- web Electron тАУ ;
- , Electron.
() web . web .
, ┬л┬╗:
- Webpack, webpack-cli, webpack-merge. Webpack тАУ , () , , . , Webpack JavsScript-, CSS, , html- .
Webpack тАФ code splitting ( ). , . - @ babel/core тАУ Babel.JS , javascript ES5 ES-2015+. babel/core тАФ , .
- @ babel/preset-env тАУ
@babel/core
, , , . ┬лbabel/preset-env┬╗ .browserslistrc, . . - babel-plugin-prismjs тАУ babel. PrismJS , , Prism.
- babel-loader тАУ Webpack. babel/core .
- copy-webpack-plugin тАУ Webpack. .
- css-loader тАУ Webpack. import url() import/require() (resolve) .
- html-webpack-plugin тАУ Webpack. html index WebpackтАЩ. , , , .
- mini-css-extract-plugin тАУ / Webpack. .css , .
- null-loader тАУ Webpack. "" , .
- Pug, pug-loader, pug-plain-loader тАУ Pug- , Haml JavaScript Node.js . pug-loader, pug-plain-loader тАУ Webpack, , .
- sass-loader тАУ Webpack. sass (Syntactically Awesome Stylesheets) тАУ CSS, CSS . sass-loader CSS pug.
- style-loader тАУ css css
<style>
Web . - vue-loader, vue-template-compiler тАУ .vue, . vue-template-compiler Vue ( template) , .
, ┬л┬╗:
- prismjs тАУ Prism, , , -. -, , .
- Vue тАУ JavaScript Framework. Framework ┬л┬╗. Framework Google тАФ .
- Vuex тАУ , . Vuex . Vue , , . . тАФ . , , .
- vue-prism-editor тАУ vue prismjs. prismjs, vue .
- electron-find тАУ node.js electron, , .
2. ┬л┬╗
2.1
┬л┬╗ Windows. . - OC ( ) .
. Node.JS. https://nodejs.org/ru/ . Node.JS npm (Node Package Manager) (CLI).
Node.JS , , :
npm init
:
- ;
- ;
- ;
- JavaScript ;
- ;
- Git ;
- , , npm;
- ;
- , , npm;
JSON.

npm .
, Enter. : package.json, .
, ( PhpStorm) , JSON .
package.json{
"name": "stext",
"version": "1.0.0",
"description": " : : ┬л┬╗. . . . , ",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "electron .",
"dev": "webpack --mode=development --config webpack.dev.js --progress",
"build": "webpack --config webpack.prod.js --env.F --mode=production --progress --hide-modules",
"pack": "electron-builder --dir",
"dist": "electron-builder"
},
"build": {
"appId": "roman.gavrilow.ru.stext",
"icon": "app/mainicon.png",
"win": {
"target": [
{
"target": "nsis",
"arch": [
"x64"
]
}
]
}
},
"author": "roman@gavrilow.ru",
"license": "ISC",
"devDependencies": {
"@babel/core": "^7.9.0",
"@babel/preset-env": "^7.9.5",
"babel-loader": "^8.1.0",
"babel-plugin-prismjs": "^2.0.1",
"copy-webpack-plugin": "^5.1.1",
"css-loader": "^3.5.1",
"electron": "^8.2.1",
"electron-builder": "^22.4.1",
"html-webpack-plugin": "^4.0.4",
"mini-css-extract-plugin": "^0.9.0",
"null-loader": "^3.0.0",
"prismjs": "^1.20.0",
"pug": "^2.0.4",
"pug-loader": "^2.4.0",
"pug-plain-loader": "^1.0.0",
"sass-loader": "^8.0.2",
"style-loader": "^1.1.3",
"vue": "^2.6.11",
"vue-loader": "^15.9.1",
"vue-template-compiler": "^2.6.11",
"vuex": "^3.1.3",
"webpack": "^4.42.1",
"webpack-cli": "^3.3.11",
"webpack-merge": "^4.2.2"
},
"dependencies": {
"electron-find": "^1.0.6",
"vue-prism-editor": "^0.5.1"
}
}
package.json. :
"scripts"
"start": "electron ."
, Electron . , , , "main"
."dev": "webpack --mode=development --config webpack.dev.js --progress"
, . , ."build": "webpack --config webpack.prod.js --env.F --mode=production --progress --hide-modules"
, , ."pack": "electron-builder --dir"
, Electron ┬лdist\┬╗ ."dist": "electron-builder"
тАФ Electron , .
devDependencies
dependencies
, . 1.2
package.json , npm install npm. node_modules , , , , тАж
2.2
2.2.1 .
Electron main
package.json. "main.js".
:
const { app, BrowserWindow, globalShortcut, Menu, dialog } = require('electron');
app
тАФ Electron .BrowserWindow
тАУ render .globalShortcut
тАУ .Menu
тАУ .Dialog
тАУ .
. , . Electron. :
main.jsconst { app, BrowserWindow, globalShortcut, Menu, dialog } = require('electron');
let win;
const isMac = process.platform === 'darwin';
function createWindow () {
win = new BrowserWindow({
width: 800,
height: 600,
center: true,
title: ' . ..',
icon: 'app/mainicon.png',
webPreferences: {
nodeIntegration: true
}
});
win.loadFile('app/index.html');
win.on('focus', () => {
globalShortcut.register('CommandOrControl+F', function () {
if (win && win.webContents) {
win.webContents.send('on-find')
}
})
});
win.on('blur', () => {
globalShortcut.unregister('CommandOrControl+F')
});
}
const template = [
{
label: '',
submenu: [
{
label: '',
click: async () => {
let files = await dialog.showOpenDialog(win,{ properties: ['openFile'] });
if (win && win.webContents) {
await win.webContents.send('on-files-select', files)
}
}
},
{ type: 'separator' },
isMac ? { role: 'close' } : { role: 'quit' }
]
},
{
label: '',
submenu: [
{
label: '',
click: async () => {
if (win && win.webContents) {
win.webContents.send('on-find')
}
}
}
]
}
];
app.whenReady().then(function(){
createWindow();
});
app.on('will-quit', () => {
globalShortcut.unregisterAll()
});
const menu = Menu.buildFromTemplate(template);
Menu.setApplicationMenu(menu);
Menu
Menu.buildFromTemplate(template)
, template
JSON JavaScript Object. "main.js". :
const menu = Menu.buildFromTemplate(template);
Menu.setApplicationMenu(menu);

┬л┬╗
2.2.2 IPC.
, , Electron. , - render , IPC . Electron , , BrowserWindow
:
win.webContents.send('on-find')
await win.webContents.send('on-files-select', files)
, ┬лsrc/electron.js┬╗
ipcRenderer.on('on-find', (e, args) => {
});
ipcRenderer.on('on-files-select', (e, args) => {
});
'on-find'
тАУ .
'on-files-select'
тАУ , , ┬л┬╗. . , .
2.2.3
┬л┬╗ Vue. -, Vue . (view), . , Vue (SPA, Single-Page Applications), .
Vue Model-View-ViewModel (MVVM) . 2005 (John Gossman), Presentation Model. , Windows Presentation Foundation, Silverlight Microsoft.
MVVM MVC , , , ┬л ┬╗. MVC/MVP , (. Controller) Presenter. WPF Silverlight ┬л ┬╗, . , MVC, - , MVC/MVP.
Vue . ┬л┬╗. . , , :

Vue тАФ , , Vue .
Vue , Webpack, (entry). JavaScript ┬л.js┬╗. ┬лsrc/main.js┬╗. Web , , (bundle).
, Webpack webpack.common.js, . Webpack :
- webpack.common.js
- webpack.dev.js
- webpack.prod.js
Webpack , .
Vue, vue-prism-editor, 1.2 . ( ) ┬л┬╗.
Vue 3 : , . . . тАЬsrc/app.vueтАЭ. template
lang="pug"
, vue-loader pug , pug html . , html.
<script> . Vue , (hooks) . , , , . ┬л┬╗ created()
, . , - тАЬsrc/main.jsтАЭ. (ON_SELECT_FILE) , IPC, Electron. IPC тАЬon-files-selectтАЭ
ON_SELECT_FILE . created()
, , , , language
, . language
тАУ . , prism-editor
. , text
. text
, prism-editor
, .
2.3
Electron , WebpackтАЩ. 2 : development (webpack.dev.js) production (webpack.prod.js). webpack.dev.js webpack.prod.js webpack.common.js. , . "webpack-merge
" npm. devDependencies
┬лpackage.json┬╗. , , WebpackтАЩ (. scripts
┬лpackage.json┬╗.) WebpackтАЩ : path: path.resolve(__dirname, './app')
. development production , production : + js, css , , VueJS , (bundle) WebpackтАЩ.
development :
npm run dev
┬л/app┬╗.

, , .
"production" :
npm run build

┬л/app┬╗ Webpack .
2.4 ┬л┬╗
Electron :
npm start
"scripts"
:
"start": "electron ."
┬лelectron .┬╗
Electron ┬л┬╗ , "main"
┬лpackage.json┬╗

2.4.1
┬л┬╗. ┬лmain.js┬╗, .
, ┬л┬╗ ┬л┬╗ Ctrl+F.

, .
(. .). . , , / (1/2). "<" ">" .

, , "0/0".
2.4.2
, . , , open source npm, API Electron. dependencies
┬лpackage.json┬╗ 'electron-find'
. ┬лsrc/electron.js┬╗. WebpakтАЩ . () ipc 'on-find'
, Electron Ctrl+F ┬л┬╗. (. main.js)
2.5 ┬л┬╗
, - Web , ┬л ┬╗ . Electron Chromium, , , , Google Chrome. , (main.js), Electron, ┬лDev Tools┬╗. (render ):
win.webContents.openDevTools();
2.6 ┬л┬╗
, - , , . 'devDependencies
'electron-builder
. 'electron-builder
тАФ Electron ┬л ┬╗. 'electron-builder
┬лpackage.json┬╗. 64- Windows:
"build": {
"appId": "roman.gavrilow.ru.stext",
"icon": "app/mainicon.png",
"win": {
"target": [
{
"target": "nsis",
"arch": [
"x64"
]
}
]
}
},
:
, :
npm run dist
.

. :
npm run pack

┬лdist/win-unpacked┬╗ .

web (), Webpack ┬л/app┬╗, . , electron-builder
┬л┬╗ () .asar resources. tar- , . Electron .
Electron API: Node API, Node.js Web API, Chromium. API asar:
┬л.asar┬╗ , , , original-fs, fs asar:
const originalFs = require('original-fs');
originalFs.readFileSync('/path/to/example.asar');
┬л┬╗ Web , , - , . тАУ Electron (Chromium). (50 ; 180 тАУ ),

Electron , ( Skype). , ( (IDE) тАФ Visual Studio Code).
.
┬л┬╗ , , , , .
, Ctrl+F .
, - , Electron . тАж ┬л┬╗ , . .
, , . , , C++ C++ QT. web , , , C++ , Web , , GET POST . , , , .
рд╢рд╛рдпрдж рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдХреНрд░реЛрдорд┐рдпрдо рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╢реЛрдзрди рдХреЗ рд╕рд╛рде, рд╣рдо рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ рдЬреЛ Google рдХреНрд░реЛрдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рдкрд╣рд▓реЗ рд╕реЗ рдЪрд▓ рд░рд╣реА рдореБрдЦреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд░реЗрдВрдбрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рдиреА рд╣реЛрдЧреА, рдЬрд┐рд╕рд╕реЗ рд░реИрдо рдФрд░ рд░реИрдо рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдиреНрдпреВрдирддрдо рдЖрдХрд╛рд░ рд╕реНрд╡рдпрдВ рд╣реЛрдирд╛, рдЬрд┐рд╕рдореЗрдВ рдЕрдм рдкреВрд░реНрдг рдХреНрд░реЛрдорд┐рдпрдо рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдЧрд┐рдЯрд╣рдм рдкрд░рд┐рдпреЛрдЬрдирд╛:
https://github.com/gewisser/SText
рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕реНрд░реЛрддреЛрдВ рдХреА рд╕реВрдЪреА