AZJIO

text-correction (PureBasic) (not ready)

Jan 9th, 2021 (edited)
1,133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; AZJIO преобразование текста набранного в неправильной раскладке клавиатуры
  2. ; создайте горячие клавиши и команды "text-correction -r" (исправление раскладки) и "text-correction -m" (меню действий)
  3.  
  4. ; [set]
  5. ; strsel=xdotool key ctrl+shift+0xff51
  6. ; strpaste=xdotool key ctrl+v
  7. ; strcopy=xdotool key ctrl+c
  8. ; Select=1
  9. ; paste=1
  10. ; lang1=`qwertyuiop[]asdfghjkl;'zxcvbnm,./~QWERTYUIOP{}ASDFGHJKL:"|ZXCVBNM<>?@#$^&
  11. ; lang2=ёйцукенгшщзхъфывапролджэячсмитьбю.ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭ/ЯЧСМИТЬБЮ,"№;:?
  12. ; DetectLang1=qwertyuiopasdfghjklzxcvbnm@#$^&
  13. ; DetectLang2=ёйцукенгшщзхъфывапролджэячсмитьбю№
  14. ; TranslitLang1=SHC shc YO yo ZH zh Y' y' KH kh CH ch TC tc SH sh E' e' YU yu YA ya A a B b V v G g D d E e Z z I i K k L l M m N n O o P p R r S s T t U u F f `` ` Y y '' '
  15. ; TranslitLang2=ЩщЁёЖжЙйХхЧчЦцШшЭэЮюЯяАаБбВвГгДдЕеЗзИиКкЛлМмНнОоПпРрСсТтУуФфЬьЫыЪъ
  16. ; CRLF=~
  17.  
  18. EnableExplicit
  19.  
  20. ; ImportC "-"
  21. ;   kbhit()
  22. ; EndImport
  23.  
  24. Declare.s ReadOutput(prog$="xsel", key$="")
  25. Declare SaveFile_Buff(File.s, *Buff, Size)
  26. Declare StrToArrLetter(Array Arr.s{1}(1), String$)
  27. Declare StrToArrLetter2(Array Arr.s(1), String$)
  28. Declare Replace()
  29. Declare EventUser()
  30. Declare ForceDirectories(Dir.s)
  31. Declare Split(String.s, Array StringArray.s(1), Separator.s = " ")
  32. Declare GetLangStr(Str$, LengthSel)
  33. Declare TestNext(i, code, num)
  34.  
  35. Procedure SaveFile_Buff(File.s, *Buff, Size)
  36.     Protected Result = #False
  37.     Protected ID = CreateFile(#PB_Any, File)
  38.     If ID
  39.         If WriteData(ID, *Buff, Size) = Size
  40.             Result = #True
  41.         EndIf
  42.         CloseFile(ID)
  43.     EndIf
  44.     ProcedureReturn Result
  45. EndProcedure
  46.  
  47. Global PathReplace$ = GetHomeDirectory() + ".config/text-correction/replace.ini"
  48. Global PathHelp$ = "/usr/share/help/ru/text-correction/index.html"
  49. ; Global Help = 0
  50. ; If FileSize(PathHelp$) > 0
  51. ;   Help = 1
  52. ; EndIf
  53. ; Global NotParam = 0 ; удалить флаг
  54.  
  55. ; Прога не портабельная, так как требует регистрации горячих клавиш, поэтому отказываемся от ini рядом с исполняемым
  56. Global ini$ = GetHomeDirectory() + ".config/text-correction/text-correction.ini"
  57. If FileSize(ini$) < 8 And ForceDirectories(GetPathPart(ini$))
  58.     SaveFile_Buff(ini$, ?ini, ?iniend - ?ini)
  59. EndIf
  60.  
  61. ; флаги для вкл/откл нестабильного функционала эмуляции горячих клавиш
  62. Global AutoSelect = 0
  63. Global AutoPaste = 0
  64. Global RusCor = 1
  65. ; Global ClipBoard = 0
  66. ; Global ClipNoSelect = 0
  67. Global strsel$="xdotool key ctrl+shift+0xff51"
  68. Global strsel2$="xdotool key shift+0xff50"
  69. Global strpaste$="xdotool key ctrl+v"
  70. Global strcopy$="xdotool key ctrl+c"
  71. Global En$ = "`qwertyuiop[]asdfghjkl;'zxcvbnm,./~QWERTYUIOP{}ASDFGHJKL:" + Chr(34) + "|ZXCVBNM<>?@#$^&"
  72. Global Ru$ = "ёйцукенгшщзхъфывапролджэячсмитьбю.ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭ/ЯЧСМИТЬБЮ," + Chr(34) + "№;:?"
  73. Global EnT$ = "qwertyuiopasdfghjklzxcvbnm@#$^&"
  74. Global RuT$ = "ёйцукенгшщзхъфывапролджэячсмитьбю№"
  75. Global Translit1$="SHC shc YO yo ZH zh Y' y' KH kh CH ch TC tc SH sh E' e' YU yu YA ya A a B b V v G g D d E e Z z I i K k L l M m N n O o P p R r S s T t U u F f `` ` Y y '' '"
  76. Global Translit2$="ЩщЁёЖжЙйХхЧчЦцШшЭэЮюЯяАаБбВвГгДдЕеЗзИиКкЛлМмНнОоПпРрСсТтУуФфЬьЫыЪъ"
  77. ; у выше варианта буквы "qwhjxc" игнорируются, а у ниже варианта из RU в EN повторное не восстанавливает оригинал и для него над о 65 заменить на 77 в 17-ой строке
  78. ; Global Translit1$="SHC shc YO yo ZH zh Y' y' KH kh CH ch TC tc SH sh E' e' YU yu YA ya A a B b V v G g D d E e Z z I i K k L l M m N n O o P p R r S s T t U u F f `` ` Y y '' ' Q q W w H h J j X x C c"
  79. ; Global Translit2$="ЩщЁёЖжЙйХхЧчЦцШшЭэЮюЯяАаБбВвГгДдЕеЗзИиКкЛлМмНнОоПпРрСсТтУуФфЬьЫыЪъКкВвХхЖжХхСс"
  80. Global CRLF$="~"
  81.  
  82.  
  83. ; читаем настройки
  84. If FileSize(ini$) > 3 And OpenPreferences(ini$) And PreferenceGroup("set")
  85.     AutoSelect = ReadPreferenceInteger("select", AutoSelect)
  86.     AutoPaste = ReadPreferenceInteger("paste", AutoPaste)
  87. ;   ClipBoard = ReadPreferenceInteger("clipboard", ClipBoard)
  88. ;   ClipNoSelect = ReadPreferenceInteger("clipnoselect", ClipNoSelect)
  89.     RusCor = ReadPreferenceInteger("rus", RusCor) ; коррекция для русского языка в режиме "инвертирование"
  90.    
  91.     strsel$ = ReadPreferenceString("strsel", strsel$)
  92.     strsel2$ = ReadPreferenceString("strsel2", strsel2$)
  93.     strpaste$ = ReadPreferenceString("strpaste", strpaste$)
  94.     strcopy$ = ReadPreferenceString("strcopy", strcopy$)
  95.     En$ = ReadPreferenceString("lang1", En$)
  96.     Ru$ = ReadPreferenceString("lang2", Ru$)
  97.     EnT$ = ReadPreferenceString("DetectLang1", EnT$)
  98.     RuT$ = ReadPreferenceString("DetectLang2", RuT$)
  99.     Translit1$ = ReadPreferenceString("TranslitLang1", Translit1$)
  100.     Translit2$ = ReadPreferenceString("TranslitLang2", Translit2$)
  101.     CRLF$ = ReadPreferenceString("CRLF", CRLF$)
  102.     ClosePreferences()
  103. EndIf
  104.  
  105. ;   Поддержка ком-строки
  106. ; If Not CountProgramParameters()
  107. ;   NotParam = 1
  108. ; EndIf
  109.  
  110. ; Теперь это проверяется при эмуляции клавиш
  111. ; If FileSize("/usr/bin/xsel") < 1
  112. ; If ReadOutput("xsel", "--version") = ""
  113. ;   MessageRequester("", "Пакет xsel не установлен.")
  114. ; EndIf
  115.  
  116. ; Теперь это проверяется при эмуляции клавиш
  117. ; If FileSize("/usr/bin/xdotool") < 1
  118. ; If (AutoPaste Or AutoSelect) And ReadOutput("xdotool", "version") = ""
  119. ;   MessageRequester("", "Пакет xdotool не установлен. Вы можете установить флаги AutoPaste=0 и AutoSelect=0 и работать без xdotool.")
  120. ; EndIf
  121.  
  122.  
  123.  
  124. ; MessageRequester("ответ", "запуск выполнен")
  125.  
  126. Global tmp
  127. Global Lang, LengthSel
  128. Global Dim aSel.s{1}(0)
  129. Global Dim aTranslit1.s(1)
  130. Global Dim aTranslit2.s(1)
  131. Global Selected_Text$, New_Text$
  132.  
  133.  
  134. Define i
  135.  
  136. Procedure StrToArrLetter2(Array Arr.s(1), String$)
  137.     Protected LenStr, i
  138.     LenStr = Len(String$)
  139.     If LenStr
  140.         ReDim Arr(LenStr - 1)
  141.         For i=0 To LenStr-1
  142.             Arr(i) = Mid(String$, i+1, 1)
  143.         Next
  144.     EndIf
  145. EndProcedure
  146.  
  147.  
  148. Procedure.s ReadOutput(prog$="xsel", key$="")
  149.     Protected tmp, res$
  150.     tmp = RunProgram(prog$, key$, "", #PB_Program_Open | #PB_Program_Read)
  151.     res$ = ""
  152.     If tmp
  153.         While ProgramRunning(tmp)
  154.             If AvailableProgramOutput(tmp)
  155.                 res$ + ReadProgramString(tmp)
  156.             EndIf
  157.         Wend
  158.         CloseProgram(tmp)
  159.     EndIf
  160.     ProcedureReturn res$
  161. EndProcedure
  162.  
  163. Procedure Execute(comstr$)
  164.     Protected Pos, Pos2, Command$
  165.     comstr$ = LTrim(comstr$)
  166.     If comstr$ = ""
  167.         ProcedureReturn
  168.     EndIf
  169.     Pos = FindString(comstr$ , " ")
  170.     If Pos
  171.         Command$ = Mid(comstr$, 1, Pos-1)
  172.         If Not RunProgram(Command$, Mid(comstr$, Pos+1), "", #PB_Program_Hide | #PB_Program_Wait) ; выделение работает
  173.             MessageRequester("Ошибка", "Не удалось выполнить команду " + Command$ + ". Проверте что эта программа установлена.")
  174. ;       MessageRequester("|" +Mid(comstr$, 1, Pos-1) + "|", "|" +Mid(comstr$, Pos+1) + "|")
  175.         EndIf
  176.     EndIf
  177. EndProcedure
  178.  
  179. Procedure _Re(mode)
  180.     Protected Old_bufer$, i, n, Layout, CountFor, Pos
  181. ;   Old_bufer$ = GetClipboardText()
  182.     ClearClipboard()
  183. ;   Execute("xsel -c") ; очистка всех буферов
  184.     Delay(90)
  185.     Execute(strcopy$)
  186.     Delay(30)
  187.     Selected_Text$ = GetClipboardText()
  188.     If AutoSelect And Selected_Text$=""
  189.         Delay(10)
  190.         If  CountProgramParameters() = 2 And ProgramParameter(1)="-s"
  191. ;           Execute("xdotool keyup ctrl") ; shift+home - выделить строку"
  192.             Execute(strsel2$) ; shift+home - выделить строку
  193.         Else
  194.             Execute(strsel$) ; ctrl+shift+Left
  195.         EndIf
  196.         Delay(300)
  197.         Selected_Text$ = ReadOutput()
  198.     EndIf
  199.    
  200.     If Selected_Text$ = ""
  201.         MessageRequester("Ошибка", "Нет выделенного текста")
  202.         End
  203.     EndIf
  204.  
  205.     LengthSel =Len(Selected_Text$)
  206.    
  207. ;   Язык определяем только для режимов 0 и 1 (ракскладка)
  208.     If mode < 2 Or mode = 6
  209.         GetLangStr(Selected_Text$, LengthSel)
  210.        
  211.         If Not Lang
  212.             MessageRequester("Ошибка", "Не определён язык")
  213.             End
  214.         EndIf
  215.     EndIf
  216.    
  217.     StrToArrLetter(aSel(), Selected_Text$) ; написать правильную безопасную функцию, в Linux (коррекция -1) работает иначе чем в Windows
  218.     New_Text$ = ""
  219.    
  220.     Select mode
  221.            
  222.         Case 0
  223.             ; если русский, то меняем на англ.
  224.             If Lang = 419
  225.                 For i = 0 To ArraySize(aSel()) ; -1 коррекция для Linux
  226.                     n = FindString(Ru$, aSel(i), 1, #PB_String_CaseSensitive)
  227.                     If n = 0
  228.                         New_Text$ + aSel(i)
  229.                     Else
  230.                         New_Text$ + Mid(En$, n, 1)
  231.                     EndIf
  232.                 Next
  233.                 ;               Layout = LoadKeyboardLayout_("00000409", #KLF_ACTIVATE)
  234.                 ;               SendMessage_(GetForegroundWindow_(), #WM_INPUTLANGCHANGEREQUEST, 1, Layout)
  235.                 ; если английский, то меняем на русс.
  236.             ElseIf Lang = 409
  237.                 For i = 0 To ArraySize(aSel()) ; -1 коррекция для Linux
  238.                     n = FindString(En$, aSel(i), 1, #PB_String_CaseSensitive)
  239.                     If n = 0
  240.                         New_Text$ + aSel(i)
  241.                         ;                       MessageRequester("выделенное", "|" + aSel(i) + "|")
  242.                     Else
  243.                         New_Text$ + Mid(Ru$, n, 1)
  244.                     EndIf
  245.                 Next
  246.                 ;               Layout = LoadKeyboardLayout_("00000419", #KLF_ACTIVATE)
  247.                 ;               SendMessage_(GetForegroundWindow_(), #WM_INPUTLANGCHANGEREQUEST, 1, Layout)
  248.             EndIf
  249.  
  250.         Case 1 ; инвертирование раскладки
  251.  
  252.  
  253.             If Lang
  254.                 For i = 0 To ArraySize(aSel()) ; -1 коррекция для Linux
  255.                     ;===========================================================
  256. ;                   если после запятой идёт слитно англ буква, то запятую следует преобразовать в "б", так как после запятой должен быть пробел
  257.                     ; особое распознавание в смешанном тексте для ;:? по левому символу (для русского языка), а также ,.<> для бюБЮ (бюдет юбка)
  258.                     If RusCor
  259.                         Select aSel(i)
  260.                             Case ","
  261.                                 If TestNext(i, 32, 2)
  262.                                     Continue
  263.                                 EndIf
  264.                             Case "."
  265.                                 If TestNext(i, 33, 2)
  266.                                     Continue
  267.                                 EndIf
  268.                             Case "<"
  269.                                 If TestNext(i, 67, 1)
  270.                                     Continue
  271.                                 EndIf
  272.                             Case ">"
  273.                                 If TestNext(i, 68, 1)
  274.                                     Continue
  275.                                 EndIf
  276.                         EndSelect
  277.                        
  278.                         If FindString(";:?", aSel(i))
  279.                             tmp = 1
  280.                             Pos = 0
  281.                             While i - tmp > 0 And Pos=0 And tmp < 3 ; ищем справа 2 символа, чтобы определить язык на участке
  282.                                 Pos = FindString(EnT$, aSel(i - tmp))
  283.                                 If Pos
  284.                                     Select aSel(i)
  285.                                         Case ";"
  286.                                             New_Text$ + Mid(Ru$, 23, 1)
  287.                                         Case ":"
  288.                                             New_Text$ + Mid(Ru$, 57, 1)
  289.                                         Case "?"
  290.                                             New_Text$ + Mid(Ru$, 69, 1)
  291.                                     EndSelect
  292.                                     Break
  293.                                 Else
  294.                                     Pos = FindString(RuT$, aSel(i - tmp))
  295.                                     If Pos
  296.                                         Select aSel(i)
  297.                                             Case ";"
  298.                                                 New_Text$ + Mid(En$, 72, 1)
  299.                                             Case ":"
  300.                                                 New_Text$ + Mid(En$, 73, 1)
  301.                                             Case "?"
  302.                                                 New_Text$ + Mid(En$, 74, 1)
  303.                                         EndSelect
  304.                                         Break
  305.                                     EndIf
  306.                                 EndIf
  307.                                 tmp + 1
  308.                             Wend
  309.                             If Pos
  310.                                 Continue
  311.                             EndIf
  312.                            
  313.                             ;`knsq
  314.                             tmp = 1
  315.                             Pos = 0
  316. ;                           Debug Str(i + tmp)
  317. ;                           Debug Str(LengthSel-1)
  318.                             While i + tmp < LengthSel-1 And Pos=0 And tmp < 3 ; ищем слева 2 символа, чтобы определить язык на участке
  319.                                 Pos = FindString(EnT$, aSel(i + tmp))
  320.                                 Debug aSel(i + tmp)
  321.                                 If Pos
  322.                                     Select aSel(i)
  323.                                         Case ";"
  324.                                             New_Text$ + Mid(Ru$, 23, 1)
  325.                                         Case ":"
  326.                                             New_Text$ + Mid(Ru$, 57, 1)
  327.                                         Case "?"
  328.                                             New_Text$ + Mid(Ru$, 69, 1)
  329.                                     EndSelect
  330.                                     Break
  331.                                 Else
  332.                                     Pos = FindString(RuT$, aSel(i + tmp))
  333.                                     If Pos
  334.                                         Select aSel(i)
  335.                                             Case ";"
  336.                                                 New_Text$ + Mid(En$, 72, 1)
  337.                                             Case ":"
  338.                                                 New_Text$ + Mid(En$, 73, 1)
  339.                                             Case "?"
  340.                                                 New_Text$ + Mid(En$, 74, 1)
  341.                                         EndSelect
  342.                                         Break
  343.                                     EndIf
  344.                                 EndIf
  345.                                 tmp + 1
  346.                             Wend
  347.  
  348.                             If Not Pos
  349.                                 New_Text$ + aSel(i)
  350.                             EndIf
  351.                             Continue
  352.                         EndIf
  353.                     EndIf
  354.                     ;===========================================================
  355.                     n = FindString(Ru$, aSel(i), 1, #PB_String_CaseSensitive)
  356.                     If n
  357.                         New_Text$ + Mid(En$, n, 1)
  358.                     Else
  359.                         n = FindString(En$, aSel(i), 1, #PB_String_CaseSensitive)
  360.                         If n
  361.                             New_Text$ + Mid(Ru$, n, 1)
  362.                         Else
  363.                             New_Text$ + aSel(i)
  364.                         EndIf
  365.                     EndIf
  366.                 Next
  367.             EndIf
  368.            
  369.         Case 2 ; Замена
  370.             Replace()
  371.                ; 1 открыть файл
  372.                ; 2 найти слово начинающееся на перенос заканчивающееся на =
  373.                ; 3 найти конец строки
  374.                ; 4 отправить в буфер
  375.            
  376.         Case 3 ; Красная строка
  377.             New_Text$ = UCase(Left(Selected_Text$, 1)) + LCase(Mid(Selected_Text$, 2))
  378.            
  379.         Case 4 ; Нижний регистр
  380.             New_Text$ = LCase(Selected_Text$)
  381.            
  382.         Case 5 ; Верхний регистр
  383.             New_Text$ = UCase(Selected_Text$)
  384.  
  385.         Case 6 ; Транслитерация
  386.             New_Text$ = Selected_Text$
  387.  
  388.             If FindString(Translit1$ , " ")
  389.                 Split(Translit1$, aTranslit1())
  390.             Else
  391.                 StrToArrLetter2(aTranslit1(), Translit1$)
  392.             EndIf
  393.             If FindString(Translit2$ , " ")
  394.                 Split(Translit2$, aTranslit2())
  395.             Else
  396.                 StrToArrLetter2(aTranslit2(), Translit2$)
  397.             EndIf
  398.            
  399.             If ArraySize(aTranslit1()) > ArraySize(aTranslit2())
  400.                 CountFor = ArraySize(aTranslit2())
  401.             Else
  402.                 CountFor = ArraySize(aTranslit1())
  403.             EndIf
  404.  
  405.             If Lang = 409
  406.                 For i = 0 To CountFor
  407.                     New_Text$ = ReplaceString(New_Text$, aTranslit1(i), aTranslit2(i), #PB_String_CaseSensitive)
  408.                 Next
  409.             ElseIf Lang = 419
  410.                 For i = 0 To CountFor
  411.                     New_Text$ = ReplaceString(New_Text$, aTranslit2(i), aTranslit1(i), #PB_String_CaseSensitive)
  412.                 Next
  413.             EndIf
  414.            
  415.         Case 10 ; Диалог выбора действий
  416.                ;            MessageRequester("выделенное", "||")
  417.                ;            If OpenWindow(0, 0, 0, 300, 70, "Меню", #PB_Window_Tool | #PB_Window_ScreenCentered)
  418.                ;            заголовок теперь показывает начало выделенного текста, даёт пользователю контроль
  419.             AutoSelect=0
  420.             If OpenWindow(0, 0, 0, 180, 250, Left(Selected_Text$, 20) + " ...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  421.                 ListViewGadget(0, 0 , 0 , 180, 250)
  422.                 AddGadgetItem(0 , -1 , "Раскладка" + #TAB$ + "-r")
  423.                 AddGadgetItem(0 , -1 , "Раскладка инверт" + #TAB$ + "-i")
  424.                 AddGadgetItem(0 , -1 , "Аббревиатура" + #TAB$ + "-a")
  425.                 AddGadgetItem(0 , -1 , "Красная строка" + #TAB$ + "-k")
  426.                 AddGadgetItem(0 , -1 , "Регистр вниз" + #TAB$ + "-n")
  427.                 AddGadgetItem(0 , -1 , "Регистр ВВЕРХ" + #TAB$ + "-v")
  428.                 AddGadgetItem(0 , -1 , "Транслитерация" + #TAB$ + "-t")
  429.                 AddGadgetItem(0 , -1 , #TAB$ + "replace.ini")
  430.                 AddGadgetItem(0 , -1 , #TAB$ + "text-correction.ini")
  431. ;               If FileSize(PathHelp$) > 0
  432.                     AddGadgetItem(0 , -1 , #TAB$ + "Справка")
  433. ;               EndIf
  434.                 SetGadgetItemState(0, 0, 1)
  435.                 AddKeyboardShortcut(0, #PB_Shortcut_Return , 1)
  436.                 AddKeyboardShortcut(0, #PB_Shortcut_Escape, 2)
  437.                 AddKeyboardShortcut(0, #PB_Shortcut_Down, 3)
  438.                 AddKeyboardShortcut(0, #PB_Shortcut_Up, 4)
  439.                
  440.                 Repeat
  441.                     Select WaitWindowEvent()
  442.                         Case #PB_Event_Menu
  443.                             Select EventMenu()
  444.                                 Case 1
  445.                                     EventUser()
  446.                                 Case 2
  447.                                     CloseWindow(0)
  448.                                     End
  449.                                 Case 3 ; стрелка вниз
  450.                                     tmp = GetGadgetState(0)
  451.                                     If tmp <> -1
  452.                                         tmp + 1
  453.                                         If tmp > 9
  454.                                             tmp = 0
  455.                                         EndIf
  456.                                         SetGadgetItemState(0, tmp, #PB_ListIcon_Selected)
  457.                                     EndIf
  458.                                 Case 4 ; стрелка вверх
  459.                                     tmp = GetGadgetState(0)
  460.                                     If tmp <> -1
  461.                                         tmp - 1
  462.                                         If tmp < 0
  463.                                             tmp = 9
  464.                                         EndIf
  465.                                         SetGadgetItemState(0, tmp, #PB_ListIcon_Selected)
  466.                                     EndIf
  467.                             EndSelect
  468.                         Case #PB_Event_Gadget
  469.                             Select EventGadget()
  470.                                 Case 0
  471.                                     Select EventType()
  472.                                         Case #PB_EventType_LeftDoubleClick
  473.                                             EventUser()
  474.                                     EndSelect
  475.                             EndSelect
  476.                         Case #PB_Event_CloseWindow, #PB_Event_DeactivateWindow
  477.                             CloseWindow(0)
  478.                             End
  479.                     EndSelect
  480.                 ForEver
  481.             EndIf
  482.     EndSelect
  483.    
  484.     ;   из-за нестабильности эмуляции горячих клавиш используются флаги запрета фцнкционала
  485.     ;   Вставляем текст, если активирован флаг АвтоВставить
  486.     If (New_Text$ <> Selected_Text$)
  487.         SetClipboardText(New_Text$) ; в функционале неиспользовано восстановление буфера обмена, так как это замусоривает Parsellito
  488.         If AutoPaste
  489.             Delay(40)
  490.             Execute(strpaste$)
  491. ;           Delay(2000)
  492. ;           SetClipboardText(Old_bufer$) ; восстанавливаем буфер обмена
  493.         EndIf
  494.        
  495.     ElseIf AutoSelect ; если был активирован функционал АвтоВыделение текста, то сбрасываем выделение горячей клавишей "стрелка вправо"
  496.                       ;         RunProgram("xdotool", "key right", "")
  497.         Delay(90)
  498.         RunProgram("xdotool", "key 0xff53", "", #PB_Program_Hide | #PB_Program_Wait)
  499. ;       RunProgram("xdotool", "--clearmodifiers", "")
  500.     EndIf
  501.     ;   Delay(90)
  502.    
  503. EndProcedure
  504.  
  505. Procedure EventUser()
  506.     tmp = GetGadgetState(0)
  507.     CloseWindow(0)
  508.     Delay(90)
  509.     Select tmp
  510.         Case 0 To 6
  511.             _Re(tmp)
  512. ;       Case 1
  513. ;           _Re(1)
  514. ;       Case 2
  515. ;           _Re(2)
  516. ;       Case 3
  517. ;           _Re(3)
  518. ;       Case 4
  519. ;           _Re(4)
  520. ;       Case 5
  521. ;           _Re(5)
  522. ;       Case 6
  523. ;           _Re(6)
  524.         Case 7
  525. ;           Так как ini-файл создан, то не требуется принудительной генерации папок пути
  526.             If FileSize(PathReplace$) < 8
  527.                 SaveFile_Buff(PathReplace$, ?replace, ?replaceend - ?replace)
  528.             EndIf
  529.             RunProgram("xdg-open", PathReplace$, GetPathPart(PathReplace$))
  530.         Case 8
  531.             RunProgram("xdg-open", ini$, GetPathPart(ini$))
  532.         Case 9
  533.             If FileSize(PathHelp$) > 0
  534.                 RunProgram("xdg-open", PathHelp$, GetPathPart(PathHelp$))
  535. ;               RunProgram(PathHelp$)
  536.                 ; RunProgram("firefox", PathHelp$, GetPathPart(PathHelp$)) ; что если firefox не браузер по умолчанию?
  537.                 ; тут наверно преобразование HTML в формат man, чтобы использовать и без флага --html=firefox
  538.                 ; RunProgram("man", "--html=firefox " + PathHelp$, GetPathPart(PathHelp$))
  539.  
  540.             EndIf
  541.     EndSelect
  542.     End
  543. EndProcedure
  544.  
  545. Select ProgramParameter()
  546.     Case "-r"
  547.         _Re(0)
  548.     Case "-i"
  549.         _Re(1)
  550.     Case "-a"
  551.         _Re(2)
  552.     Case "-k"
  553.         _Re(3)
  554.     Case "-n"
  555.         _Re(4)
  556.     Case "-v"
  557.         _Re(5)
  558.     Case "-t"
  559.         _Re(6)
  560.     Case "-?", "-h"
  561.         If FileSize(PathHelp$) > 0
  562.             RunProgram("xdg-open", PathHelp$, GetPathPart(PathHelp$))
  563.         EndIf
  564.     Case "-v"
  565.         MessageRequester("Версия", "0.5")
  566.     Case "-m"
  567.         _Re(10)
  568.     Default
  569.         _Re(10)
  570. EndSelect
  571.  
  572. Procedure Replace()
  573.     Protected Pos, Pos2, TextReplace$
  574.     If ReadFile(0, PathReplace$)
  575.         TextReplace$ = ReadString(0, #PB_UTF8 | #PB_File_IgnoreEOL)
  576.         CloseFile(0)
  577.         Pos = FindString(TextReplace$, #CRLF$ + Selected_Text$ + "=", 1, #PB_String_NoCase)
  578.         If Pos
  579.             Pos + 3 + Len(Selected_Text$)
  580.             Pos2 = FindString(TextReplace$, #CRLF$, Pos)
  581.             If Pos2
  582.                 ;               MessageRequester("", "|" + Mid(TextReplace$, Pos, Pos2 - Pos) + "|")
  583.                 New_Text$ = ReplaceString(Mid(TextReplace$, Pos, Pos2 - Pos) , CRLF$ , #LF$, #PB_String_CaseSensitive)
  584.             EndIf
  585.         EndIf
  586.     Else
  587.         SaveFile_Buff(PathReplace$, ?replace, ?replaceend - ?replace)
  588.     EndIf
  589. EndProcedure
  590.  
  591.  
  592. ; ищем справа-налево последний валидный символ в тексте, по которому можно определить язык
  593. Procedure GetLangStr(Str$, LengthSel)
  594.     Protected i, bykva$
  595.     For i = LengthSel To 1 Step -1
  596.         bykva$ = Mid(Str$, i, 1)
  597.         If FindString(EnT$, LCase(bykva$), 1, #PB_String_NoCase)
  598.             Lang = 409
  599.             Break
  600.         EndIf
  601.         If FindString(RuT$, LCase(bykva$), 1, #PB_String_NoCase)
  602.             Lang = 419
  603.             Break
  604.         EndIf
  605.     Next
  606. EndProcedure
  607.  
  608. Procedure TestNext(i, code, num)
  609.     Protected n
  610.     For n = 1 To num
  611.         If i < LengthSel-n And FindString(Left(EnT$, 26), LCase(aSel(i + n))) ; проверяем чтобы не превысить размер массива и поиск символа
  612.             New_Text$ + Mid(Ru$, code, 1)
  613.             ProcedureReturn 1
  614.         EndIf
  615.     Next
  616.     ProcedureReturn 0
  617. EndProcedure
  618.  
  619.  
  620. ;==================================================================
  621. ;
  622. ; Author:    ts-soft    
  623. ; Date:       March 5th, 2010
  624. ; Explain:
  625. ;     modified version from IBSoftware (CodeArchiv)
  626. ;     on vista and above check the Request for "User mode" or "Administrator mode" in compileroptions
  627. ;    (no virtualisation!)
  628. ;==================================================================
  629. Procedure ForceDirectories(Dir.s)
  630.     Static tmpDir.s, Init, delim$
  631.     Protected result
  632.     CompilerSelect #PB_Compiler_OS
  633.         CompilerCase #PB_OS_Windows
  634.             delim$ = "\"
  635.         CompilerCase #PB_OS_Linux
  636.             delim$ = "/"
  637.     CompilerEndSelect
  638.    
  639.     If Len(Dir) = 0
  640.         ProcedureReturn #False
  641.     Else
  642.         If Not Init
  643.             tmpDir = Dir
  644.             Init   = #True
  645.         EndIf
  646.         If (Right(Dir, 1) = delim$)
  647.             Dir = Left(Dir, Len(Dir) - 1)
  648.         EndIf
  649.         If (Len(Dir) < 3) Or FileSize(Dir) = -2 Or GetPathPart(Dir) = Dir
  650.             If FileSize(tmpDir) = -2
  651.                 result = #True
  652.             EndIf
  653.             tmpDir = ""
  654.             Init = #False
  655.             ProcedureReturn result
  656.         EndIf
  657.         ForceDirectories(GetPathPart(Dir))
  658.         ProcedureReturn CreateDirectory(Dir)
  659.     EndIf
  660. EndProcedure
  661.  
  662.  
  663. ; wilbert
  664. ; https://www.purebasic.fr/english/viewtopic.php?p=486382#p486382
  665. Procedure Split(String.s, Array StringArray.s(1), Separator.s = " ")
  666.    
  667.     Protected S.String, *S.Integer = @S
  668.     Protected.i asize, i, p, slen
  669.     asize = CountString(String, Separator)
  670.     slen = Len(Separator)
  671.     ReDim StringArray(asize)
  672.    
  673.     *S\i = @String
  674.     While i < asize
  675.         p = FindString(S\s, Separator)
  676.         StringArray(i) = PeekS(*S\i, p - 1)
  677.         *S\i + (p + slen - 1) << #PB_Compiler_Unicode
  678.         i + 1
  679.     Wend
  680.     StringArray(i) = S\s
  681.     *S\i = 0
  682.    
  683. EndProcedure
  684.  
  685.  
  686. Procedure StrToArrLetter(Array Arr.s{1}(1), String$)
  687.     Protected LenStr, i
  688.     LenStr = Len(String$)
  689.     If LenStr
  690.         ReDim Arr(LenStr - 1)
  691.         PokeS(Arr(), String$, -1, #PB_String_NoZero)
  692.     EndIf
  693.     ProcedureReturn
  694. EndProcedure
  695.  
  696. DataSection
  697.     ini:
  698.     IncludeBinary "sample.ini"
  699.     iniend:
  700.     replace:
  701.     IncludeBinary "sample-replace.ini"
  702.     replaceend:
  703. EndDataSection
Add Comment
Please, Sign In to add comment