На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА
1. Раздел предназначен для обсуждения ПО.
2. Поиск кряков, серийников, варезных версий ПО - запрещен.
3. Холивары также не приветствуются - для этого есть соответствующий раздел.
4. При создании тем в разделе настоятельно рекомендуется придерживаться следующего шаблона оформления.
5. Ссылки для скачивания дистрибутивов ПО должны вести на официальный сайт! Запрещено размещение ссылок на файлы, находящиеся на файлообменниках типа RapidShare, iFolder, DepositFiles, Sms4File, VipFile и прочих "условно-бесплатных" ресурсах.
Модераторы: winsoft
Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
> FAR Manager
    Far Manager

    Windows. FreeWare.

    Многофункциональный файловый менеджер для работы с различными файлами, позволяет просматривать файлы и каталоги, редактировать, копировать и переименовывать файлы. Поддерживает Unicode имеет удобный и простой в использовании пользовательский интерфейс с многоязычной поддержкой. Позволяет работать с архивами, FTP-клиентами, и просматривать сеть с помощью реализованных в стандартную поставку плагинов. Кроме того есть возможность расширения функциональности за счет подключения дополнительных плагинов.

    user posted image

    Ну очень странно что его уже давным давно не включили в разделе "Полезного ПО" :-?

    Подключаемые модули (плагины)

    Возможности FAR существенно расширяются благодаря плагинам различного назначения:

    • управление принтерами, как подключёнными к ПК, так и сетевыми;
    • подсветка синтаксиса в исходных текстах программ;
    • работа с FTP-серверами (с поддержкой доступа через различные типы прокси, автоматической докачкой и прочее);
    • работа с SFTP-серверами (плагин WinSCP);
    • поиск и замена символов одновременно во множестве файлов с применением регулярных выражений;
    • средства переименования групп файлов с возможностью использования сложных составных масок из символов подстановки и шаблонов;
    • NNTP/SMTP/POP3/IMAP4 клиенты и отправка сообщений на пейджер;
    • работа при нестандартных размерах текстового экрана;
    • перекодировка текстов с учётом национальных кодовых таблиц;
    • манипуляции с содержимым корзины;
    • управление приоритетами процессов на локальном или на сетевом ПК;
    • автозавершение слов в редакторе и работа с шаблонами;
    • редактирование реестра Windows;
    • создание и изменение ярлыков Windows;
    • всевозможные манипуляции с файлами и текстом, делающие комфортной работу с фидонетовскими материалами;
    • кодирование и декодирование файлов в формате UUE;
    • симметричное и асимметричное шифрование файлов;
    • управление программой Winamp и модификация комментариев MP3-файлов;
    • просмотр и редактирование содержимого ресурсов различных игр;
    • работа с различными серверами через ODBC + работа с серверами Oracle через OCI;
    • управление службой RAS;
    • запуск внешних программ (компиляторов, конвертеров и проч.) при редактировании текстов в редакторе FAR;
    • отображение содержимого файлов справки Windows (.hlp и .chm);
    • калькуляторы с разными возможностями;
    • функции проверки орфографии при обработке текста в редакторе FAR;
    • работа с файл-образами дисков для ZX Spectrum и пк Вектор-06Ц;
    • подготовка каталога сменных накопителей и многое другое.
    • вычисление и проверка CRC и криптографических хеш значений файлов (SHA-1; SHA-2; Whirlpool и других).
    • Отображение скрытой файловой системы на телефонах SonyEricsson
    • Некоторые важные плагины (например, для работы с FTP, печати, сравнения файлов, работы с архивами, сетью) входят в поставку FAR. Но подавляющее большинство плагинов доступно для скачивания в интернете, пользователь может устанавливать их в соответствии со своими задачами. В настоящее время насчитывается более 700 плагинов для FAR.

    Домашняя страничка: https://farmanager.com
      В общем, разгадка на поверхности, хотя и не так уж очевидна. CompareString() же выполняет лексикографическое сравнение с учётом национальных предпочтений. Это очевидно. А вот что не так уж, так это то, что '-' ассоциируется с дефисами и тире, в частности переносами, как явными, так и мягкими. Ну и лексикографически они располагаются перед разделителями, типа там пробел, таб итп, т.к. по сравнению с ними должны иметь меньший вес.
      Я заглянул в 7-ку, там такое же поведение. Даже поставил XPю на виртуалку и заморочился пакетом её поддержки в Студии, что собрать под неё. И в ней тоже Greater. Осталось только ради интереса чекнуть 98SE, но это VS6 расчехлять... ну так мы тут крутые парни или зумеры ленивые
      Сообщение отредактировано: Qraizer -
        В общем, это был непростой процесс. Даже на виртуалке под современными процессорами 98-я не работает должным образом. Пришлось искать патчи. Но это уже был не просто спортивный интерес, это было дело принципа. Нашёл образ, нашёл патчи, нашёл ключ активации, проинсталил, нашёл, как и чем собрать под Win98. Greater. Ну кто б сомневался.
          Цитата Qraizer @
          Так он сортирует по одному указанному критерию. По другим критериям никаких гарантий какого-либо порядка. Тебе же нужно два критерия одновременно.
          Частично. Указывая сортировать по расширению, он группирует мои *.txt-файлы, это так. Но далее меня б более чем устроила сортировка по коду символа (в некоем смысле это очевидный порядок), но разрабы зачек-то замутили ещё какой-то смысл в дальнейшем упорядочении. Эх...
            Это не разрабы, это правила юникода. Тебе бы понравилось, если файлы с именами из латиницы+кириллицы сортировались на основе хрен пойми чего вместо национальных правил? и заметь, кириллица не обязательно означает русский, как и латиница не обязательно английский, французы с немцами тебе это подтвердят, а уж турки так вообще.
              Цитата Qraizer @
              Тебе бы понравилось, если файлы с именами из латиницы+кириллицы сортировались на основе хрен пойми чего вместо национальных правил?
              1. Хочется пример этого "хрен пойми чего", дабы не на эмоциях рассуждать, а по логике.
              2. Думаю, что понравилось бы, несмотря на местами встречавшийся порядок "ЁЈАБВ...", т.к. логика абсолютна.
                Хозяйке на заметку: временнЫе штампы

                Может кому и пригодиться...

                Моя шляпа позволяет в начало имени файла или каталога вставлять дату-время. Спросите "зачем это надо". А-б-и-с-ь-н-я-ю! Очень удобно иметь список файлов и каталогов, отсортированных по имени (а по факту по дате-времени) не меняя порядок сортировки в самом ФАРе. Особенно прекрасно это ощущается в каталогах резервных копий - просто душа дятлом поёт!!!

                Т.е. делаете просто файл или каталог под именем "1", травите на него команду и получаете к примеру "2025.08.19-15.43.56_1". Осталось только при переименовании убрать последних два символа, если нужен просто временной штамп.

                ⭐ Солюшен

                1) В самом ФАРе делаете очередной пункт меню в его меню, вызываемом по [F2], допустим "Вставить временной штамп"
                2) В качестве горячей клавиши что угодно, а можно и без нее. А в качестве команды что-то типа C:\Tools\set-timestamp.cmd "!.!", ну или ваш варик

                В качестве командного файла:

                ExpandedWrap disabled
                  @echo off
                  SET HOUR=%TIME:~0,2%
                  SET STAMP=%date:~6,4%.%date:~3,2%.%date:~0,2%-%HOUR: =0%.%TIME:~3,2%.%TIME:~6,2%
                  SET FOLDER=%STAMP::=-%
                  SET FILE=%1
                  SET FILE=%FILE:~1,-1%
                  ren %1 "%FOLDER%_%FILE%"

                :victory:
                  Нужна была подобная функциональность для ведения логов. Никак не смог заставить возвращать секунды.
                    Цитата Qraizer @
                    Никак не смог заставить возвращать секунды.

                    ?? %TIME% возвращает секунды с точностью до сотых...
                      Я ж об этом. Сорри, непонятно выразился. Я использовал что-то типа
                      ExpandedWrap disabled
                        rem Время запуска
                        for /f %%a in ('date /t') do set curdate=%%a
                        for /f %%a in ('time /t') do set curtime=%%a
                        echo: >>> %~dp0runlog.txt
                        echo ----------------------------------------------------------------------------------- >>> %~dp0runlog.txt
                        echo %curdate% %curtime%: run started >>> %~dp0runlog.txt
                        echo ----------------------------------------------------------------------------------- >>> %~dp0runlog.txt
                      а про наличие переменных запамятовал напрочь.
                      Сообщение отредактировано: Qraizer -
                        Хозяйке на заметку: удобочитаемая распечатка PATH

                        Может кому и пригодиться...

                        Так бывает, что при "задействовании" очередного пакета, требующего изменение системного параметра PATH, уже теряется "понимание" содержимого этой переменной. Ибо путей уже over дохера...
                        Мой солюшен это решает - он позволяет вывести содержимое переменной поэлементно и в столбец.

                        Для этого делаем пункт в меню Фар, вызываемом по [F2], допустим "Смотрим пути". В качестве горячей клавиши что угодно, а можно и без нее. А в качестве команды что-то типа:

                        ExpandedWrap disabled
                          path | E:\Tools\MSys64\usr\bin\sed -e 's/;/\n/g'

                        И получаем что-то типа на выводе в консоль:

                        ExpandedWrap disabled
                          E:\Documents\3.Projects>path | E:\Tools\MSys64\usr\bin\sed -e 's/;/\n/g'
                          C:\Tools\Perl-5.40.0-x64\c\bin
                          C:\Tools\Perl-5.40.0-x64\perl\site\bin
                          C:\Program Files\Common Files\Oracle\Java\javapath
                          C:\Program Files (x86)\VMware\VMware Workstation\bin\
                          C:\Program Files (x86)\Common Files\Intel\Shared Libraries\redist\intel64\compiler
                          C:\Program Files (x86)\Common Files\Intel\Shared Files\cpp\bin\Intel64
                          C:\Tools\Python310\
                          C:\Tools\Python310\Scripts\
                          C:\Tools\Prolog\bin
                          C:\Tools\ImageMagick
                          C:\Program Files\dotnet\
                          C:\WINDOWS\system32
                          C:\WINDOWS
                          C:\WINDOWS\System32\Wbem
                          C:\WINDOWS\System32\WindowsPowerShell\v1.0\
                          C:\WINDOWS\System32\OpenSSH\
                          C:\Tools\gs\bin
                          D:\Tools\SDK-Flutter\bin
                          C:\Program Files\Java\jdk-17\bin
                          C:\Program Files\nodejs\
                          C:\Tools\Git\cmd
                          D:\Tools\Topaz Gigapixel AI\bin\
                          C:\Program Files\Calibre2\
                          D:\Tools\OpenServer\bin
                          C:\Users\Majestio\AppData\Local\ValidatorBuddy
                          C:\Users\Majestio\AppData\Local\Microsoft\WindowsApps
                          C:\Users\Majestio\AppData\Roaming\Programs\Zero Install
                          C:\Users\Majestio\AppData\Roaming\npm

                        Одна "беда" - нужно иметь установленным MSYS2. В моём случае в E:\Tools\MSys64
                          У кого его нет:
                          ExpandedWrap disabled
                            @echo off
                             
                            setlocal
                            set var=%path%
                            :onceMore
                             
                            for /f "tokens=1,* delims=;" %%a in ("%var%") do (
                              echo %%a
                             
                              set var=%%b
                              goto onceMore
                            )
                            endlocal
                            Хозяйке на заметку: отступы во встроенном редакторе Far

                            Может кому и пригодиться... Как говорится "мопед не мой". Пришлось знатно переписать скрипт, так как оригинальный постоянно съедал последнюю строку. Сегодня меня это уже достало!

                            Shift+Tab - сдвигает выделенный потоковый блок вправо
                            Shift+BS - сдвигает выделенный потоковый блок влево


                            УПС: Есть баги! Буду дорабатывать >:(

                            Макро ложить вот сюда: %FARHOME%\Profile\Macros\scripts\BlockIndent (ну или где у вас там хранится, может в профилях пользователя венды)

                            Скрытый текст
                            BlockIndent.lua

                            ExpandedWrap disabled
                              --[[
                                Block Indent for Far Manager
                                Version: 2.2
                                  Copyright (C) 2001 Alex Yaroslavsky
                                  Copyright (C) 2025 Majestio (fixxxx)
                               
                                  This program is free software; you can redistribute it and/or modify
                                  it under the terms of the GNU General Public License as published by
                                  the Free Software Foundation; either version 2 of the License, or
                                  (at your option) any later version.
                               
                                  This program is distributed in the hope that it will be useful,
                                  but WITHOUT ANY WARRANTY; without even the implied warranty of
                                  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                                  GNU General Public License for more details.
                               
                                  You should have received a copy of the GNU General Public License
                                along with this program; if not, write to the Free Software
                                  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                               
                                Features:
                                - Right or Left Indentation of the selected block (or the  current  line)  by
                                  a tab or a space.
                                - Each line in the block is indented relatively to its own position  with  no
                                  respect to other lines in the block.
                                - Tab indentation as in Borland Turbo IDE, text is indented  to  the  nearest
                                  tab position and not just by tab size.
                                - Works correctly with any editor settings (expand tabs or not, inserts  real
                                  tabs).
                              --]]
                               
                              local function Indent(IndentByTabSize, Forward)
                                local F = far.Flags
                                local ei = editor.GetInfo()
                                if not ei then return end
                               
                                local hasBlock = (ei.BlockType == F.BTYPE_STREAM or ei.BlockType == F.BTYPE_COLUMN) and ei.BlockStartLine
                                local startLine = hasBlock and ei.BlockStartLine or ei.CurLine
                               
                                editor.UndoRedo(nil, F.EUR_BEGIN)
                               
                                if hasBlock then
                                  if ei.BlockType == F.BTYPE_STREAM then
                                    -- Принудительно делаем выделение "до конца окна" на всех строках блока
                                    editor.Select(nil, "BTYPE_STREAM", ei.BlockStartLine, 1, -1, ei.TotalLines)
                                  elseif ei.BlockType == F.BTYPE_COLUMN then
                                    -- Для вертикального блока — просто расширяем до конца файла
                                    editor.Select(nil, "BTYPE_COLUMN", ei.BlockStartLine, ei.BlockStartCol,
                                                  ei.TotalLines - ei.BlockStartLine + 1, ei.BlockWidth)
                                  end
                                end
                               
                                local IndentSize = IndentByTabSize and ei.TabSize or 1
                                local IndentChar = IndentByTabSize and "\t" or " "
                               
                                local line = startLine
                                while true do
                                  local s = editor.GetString(nil, line, 0)
                                  if not s then break end
                               
                                  local inBlock = not hasBlock
                                  if hasBlock then
                                    local ss = s.SelStart or 0
                                    local se = s.SelEnd or 0
                                    inBlock = (ss > 0) and (se == -1 or ss <= se)
                                  end
                               
                                  if not inBlock then break end
                               
                                  local text = s.StringText or ""
                                  local firstNonSpace = text:find("[^ \t]") or (#text + 1)
                               
                                  local tabCol = editor.RealToTab(nil, line, firstNonSpace) - 1
                                  local steps = math.floor(tabCol / IndentSize)
                                  if not Forward and (tabCol % IndentSize) == 0 then
                                    steps = steps - 1
                                  end
                                  steps = math.max(0, Forward and steps + 1 or steps)
                               
                                  -- Удаляем старый отступ
                                  editor.SetString(nil, line, text:sub(firstNonSpace), s.StringEOL)
                               
                                  -- Вставляем новый
                                  editor.SetPosition(nil, line, 1)
                                  for i = 1, steps do
                                    editor.InsertText(nil, IndentChar)
                                  end
                               
                                  line = line + 1
                                end
                               
                                -- Восстанавливаем курсор
                                editor.SetPosition(nil, ei)
                                editor.Redraw()
                                editor.UndoRedo(nil, F.EUR_END)
                              end
                               
                              Macro {
                                area="Editor"; key="ShiftTab"; flags=""; description="Indent right by space"; action = function()
                                  Indent(false, true)
                                end;
                              }
                               
                              Macro {
                                area="Editor"; key="ShiftBS"; flags=""; description="Indent left by space"; action = function()
                                  Indent(false, false)
                                end;
                              }
                               
                              NoMacro {
                                area="Editor"; key=""; flags=""; description="Indent right by tab size"; action = function()
                                  Indent(true, true)
                                end;
                              }
                               
                              NoMacro {
                                area="Editor"; key=""; flags=""; description="Indent left by tab size"; action = function()
                                  Indent(true, false)
                                end;
                              }

                              Хозяйке на заметку: извлечение встроенной BASE64-кодированной картинки во встроенном редакторе Far

                              Может кому и пригодиться... Надоело пользоваться online-извлекаторами с тоннами рекламы, сделал свой. Уютный и ламповый! :)

                              Пользоваться просто. Допустим есть нечто в виде:

                              ExpandedWrap disabled
                                <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=">


                              Выделяем все, что между двойными кавычками и жмём Ctrl+Alt+I, в открывшемся диалоге вводим имя сохраняемого файла без расширения. Бинго!

                              Макро ложить вот сюда: %FARHOME%\Profile\Macros\scripts\DecodeImage (ну или где у вас там хранится, может в профилях пользователя венды)

                              Скрытый текст
                              DecodeBase64Image.lua

                              ExpandedWrap disabled
                                --[[
                                    DecodeBase64Image для Far Manager
                                    Версия: 1.0
                                    Автор: Majestio
                                    Copyright © 2025 Majestio
                                 
                                    Данная программа распространяется под лицензией MIT.
                                 
                                    Разрешается использование, копирование, изменение, слияние, публикация,
                                    распространение, сублицензирование и/или продажа копий программы
                                    без каких-либо ограничений при соблюдении следующих условий:
                                 
                                    1. Вышеуказанное уведомление об авторских правах и данное условие
                                       разрешения должны быть включены во все копии или существенные части
                                       программы.
                                 
                                    2. ПРОГРАММА ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ,
                                       явных или подразумеваемых, включая (но не ограничиваясь) гарантии
                                       товарного состояния, пригодности для конкретной цели и отсутствия
                                       нарушений прав третьих лиц. Ни при каких обстоятельствах автор
                                       не несёт ответственности за любые претензии, убытки или иные
                                       обязательства, возникшие в связи с использованием программы.
                                 
                                    Назначение:
                                      - декодирует внедрённую в текст картинку Base64 и сохраняет её в файл
                                 
                                    Пример использования: выделяем всё, что находится между двойными кавычками:
                                     "data:image/png;base64,iVBORw0KGgoAAAANSUh...абырвалг="
                                --]]
                                 
                                local checkImageFormat = function(format)
                                  local validFormats = {
                                    ["image/png"] = true,
                                    ["image/jpeg"] = true,
                                    ["image/jpg"] = true,
                                    ["image/gif"] = true,
                                    ["image/bmp"] = true,
                                    ["image/webp"] = true,
                                    ["image/svg+xml"] = true
                                  }
                                  return validFormats[format]
                                end
                                 
                                -------------------------------------------------------------------------------------------------------------------------------------
                                 
                                local isValidBase64 = function(str)
                                    local base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
                                    local padding_char = "="
                                    -- Проверка длины строки
                                    if #str % 4 ~= 0 then
                                        return false
                                    end
                                    -- Проверка символов строки
                                    local padding_count = 0
                                    for i = 1, #str do
                                        local char = str:sub(i, i)
                                        if char == padding_char then
                                            padding_count = padding_count + 1
                                        elseif not base64_chars:find(char, 1, true) then
                                            return false
                                        end
                                    end
                                    -- Проверка символов заполнения
                                    if padding_count > 2 then
                                        return false
                                    elseif padding_count > 0 then
                                        local last_char = str:sub(-1)
                                        if last_char ~= padding_char or str:sub(-2, -2) == padding_char then
                                            return false
                                        end
                                    end
                                    return true
                                end
                                 
                                -------------------------------------------------------------------------------------------------------------------------------------
                                 
                                local base64_decode = function(input)
                                    local output = ""
                                 
                                    local base64_reverse_chars = {
                                        ["A"]=0,["B"]=1,["C"]=2,["D"]=3,["E"]=4,["F"]=5,["G"]=6,["H"]=7,["I"]=8,["J"]=9,
                                        ["K"]=10,["L"]=11,["M"]=12,["N"]=13,["O"]=14,["P"]=15,["Q"]=16,["R"]=17,["S"]=18,["T"]=19,
                                        ["U"]=20,["V"]=21,["W"]=22,["X"]=23,["Y"]=24,["Z"]=25,["a"]=26,["b"]=27,["c"]=28,["d"]=29,
                                        ["e"]=30,["f"]=31,["g"]=32,["h"]=33,["i"]=34,["j"]=35,["k"]=36,["l"]=37,["m"]=38,["n"]=39,
                                        ["o"]=40,["p"]=41,["q"]=42,["r"]=43,["s"]=44,["t"]=45,["u"]=46,["v"]=47,["w"]=48,["x"]=49,
                                        ["y"]=50,["z"]=51,["0"]=52,["1"]=53,["2"]=54,["3"]=55,["4"]=56,["5"]=57,["6"]=58,["7"]=59,
                                        ["8"]=60,["9"]=61,["+"]=62,["/"]=63
                                    }
                                 
                                    -- Убираем все = с конца
                                    input = input:gsub("=*$", "")
                                 
                                    local input_length = #input
                                 
                                    for i = 1, input_length, 4 do
                                        local c1 = input:sub(i,   i)
                                        local c2 = input:sub(i+1, i+1)
                                        local c3 = input:sub(i+2, i+2)
                                        local c4 = input:sub(i+3, i+3)
                                 
                                        local b1 = base64_reverse_chars[c1] or 0
                                        local b2 = base64_reverse_chars[c2] or 0
                                        local b3 = base64_reverse_chars[c3] or 0
                                        local b4 = base64_reverse_chars[c4] or 0
                                 
                                        local byte1 = bit.bor(bit.lshift(b1, 2), bit.rshift(b2, 4))
                                        local byte2 = bit.bor(bit.lshift(bit.band(b2, 0x0F), 4), bit.rshift(b3, 2))
                                        local byte3 = bit.bor(bit.lshift(bit.band(b3, 0x03), 6), b4)
                                 
                                        output = output .. string.char(byte1)
                                 
                                        if c3 ~= "" then output = output .. string.char(byte2) end
                                        if c4 ~= "" then output = output .. string.char(byte3) end
                                    end
                                 
                                    return output
                                end
                                 
                                -------------------------------------------------------------------------------------------------------------------------------------
                                 
                                local DecodeBase64Image = function ()
                                  local ei = editor.GetInfo(nil)
                                  if ei.BlockType == 0 then
                                    far.Message("Блок не выделен и декодировать нечего!", "Ошибка", nil, "w")
                                    return
                                  end
                                  local selectedText = Editor.SelValue
                                  -- Проверка формата изображения
                                  local format = selectedText:match("^data:([+%a/]+);base64,")
                                  if not format or not checkImageFormat(format) then
                                     far.Message("Выделенный блок не содержит информации об изображении", "Ошибка", nil, "w")
                                     return
                                  end
                                  -- Проверка валидности кодированной информации
                                  local encodedImage = selectedText:match(";base64,(.*)")
                                  if not encodedImage or not  isValidBase64(encodedImage) then
                                     far.Message("Выделенный блок содержит некорректную информацию об изображении", "Ошибка", nil, "w")
                                     return
                                  end
                                  -- Запрос имени файла
                                  local filePath = far.InputBox(nil, "Сохранение изображения", "Введите имя файла:", nil, nil, 128, nil, 0)
                                  if not filePath or filePath == "" then
                                    return
                                  end
                                  -- Декодирование и сохранение изображения
                                  local decodedImage = base64_decode(encodedImage)
                                  local fileExtension = format:match("image/(%a+)")
                                  local fullPath = filePath .. "." .. fileExtension
                                  if win.GetFileInfo(fullPath) then
                                    local overwrite = far.Message("Файл уже существует. Перезаписать?", "Вопрос", ";YesNo", "w")
                                    if overwrite ~= 1 then
                                       return
                                    end
                                  end
                                  local file = io.open(fullPath, "wb")
                                  if file then
                                    file:write(decodedImage)
                                    file:close()
                                    far.Message("Изображение сохранено успешно!", "Успех")
                                  else
                                    far.Message("Не удалось сохранить изображение", "Ошибка", nil, "w")
                                  end
                                end
                                 
                                -------------------------------------------------------------------------------------------------------------------------------------
                                 
                                Macro {
                                  area="Editor"; key="CtrlAltI"; flags=""; description="Save Image from Base64 line"; action = function()
                                  DecodeBase64Image()
                                  end;
                                }

                              ЗЫ: Валидацию самого сохраняемого изображения я не делал. Выделяйте блок аккуратно и правильно ;)
                                Цитата Majestio @
                                Выделяйте блок аккуратно и правильно
                                Было бы логично, если бы он сам выделял нужное просто по факту нахождения курсора где-то внутри нужного текста.
                                Прикреплённый файлПрикреплённый файлScreenshot_from_2025_11_30_11_26_52.png (57,24 Кбайт, скачиваний: 10)
                                  Цитата Dushevny @
                                  Было бы логично, если бы он сам выделял нужное просто по факту нахождения курсора где-то внутри нужного текста.

                                  Возможно, но мне лениво. Особенно если это касается парсинга многострочного src...

                                  user posted image
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:
                                  Страницы: (3) 1 [2] 3  все


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0685 ]   [ 22 queries used ]   [ Generated: 17.12.25, 15:12 GMT ]