Blame


1 3baf066a 2024-07-28 continue #!/usr/bin/env retro
2 3baf066a 2024-07-28 continue
3 3baf066a 2024-07-28 continue ~~~
4 3baf066a 2024-07-28 continue '\r\n s:format 'CRLF s:const
5 3a493068 2024-08-01 continue :vgi:user-input '10_🔁_Text: CRLF s:append s:put #0 unix:exit ;
6 3a493068 2024-08-01 continue :vgi:not-found '51_Not_found CRLF s:append s:put #0 unix:exit ;
7 3a493068 2024-08-01 continue :vgi:bad-request '59_Bad_request CRLF s:append s:put #0 unix:exit ;
8 3a493068 2024-08-01 continue :vgi:tmp-failure '40_Unexpected_error CRLF s:append s:put #0 unix:exit ;
9 3baf066a 2024-07-28 continue ~~~
10 3baf066a 2024-07-28 continue
11 3baf066a 2024-07-28 continue Разбираем запрашиваемый URL из стандратного потока ввода:
12 3baf066a 2024-07-28 continue * всё, что до /gtransl/ слева отбрасываем вместе с этим компонентом пути;
13 3baf066a 2024-07-28 continue * следующий компонент пути - исходный язык (константа SL);
14 3baf066a 2024-07-28 continue * следующий компонент пути - целевой язык перевода (константа TL);
15 3baf066a 2024-07-28 continue * если входной URL закончен, то нужно выдать пользователю запрос на ввод переводимой строки;
16 3baf066a 2024-07-28 continue * последним извлекаем query строку с текстом, который требуется перевести (константа QUERY).
17 3baf066a 2024-07-28 continue ~~~
18 3baf066a 2024-07-28 continue :cut-required-path (s-s)
19 3a493068 2024-08-01 continue dup '/gtransl/ s:index/string dup n:negative? [ vgi:not-found ] if
20 3baf066a 2024-07-28 continue over s:length swap - '/gtransl/ s:length - #1 - s:right
21 3baf066a 2024-07-28 continue ;
22 3baf066a 2024-07-28 continue :drop-fist-char (s-s) dup s:length #1 - s:right ;
23 3baf066a 2024-07-28 continue :extract-path-part (ss-s)
24 3a493068 2024-08-01 continue swap dup $/ s:index/char n:negative? [ vgi:not-found ] if
25 3baf066a 2024-07-28 continue $/ s:split/char rot s:const
26 3baf066a 2024-07-28 continue drop-fist-char
27 3baf066a 2024-07-28 continue ;
28 3a493068 2024-08-01 continue :user-input? dup s:length n:zero? [ vgi:user-input ] if ;
29 3a493068 2024-08-01 continue :required-query (s-s) dup #0 s:fetch $? -eq? [ vgi:not-found ] if ;
30 3baf066a 2024-07-28 continue :extract-query (s-) required-query drop-fist-char 'QUERY s:const ;
31 3baf066a 2024-07-28 continue s:get
32 3baf066a 2024-07-28 continue cut-required-path 'SL extract-path-part 'TL extract-path-part
33 3baf066a 2024-07-28 continue user-input?
34 3baf066a 2024-07-28 continue extract-query
35 3baf066a 2024-07-28 continue ~~~
36 3baf066a 2024-07-28 continue
37 3baf066a 2024-07-28 continue Проверяем валидность содержимого строк,
38 3baf066a 2024-07-28 continue что бы исключить возможность исполнения произвольной команды.
39 3baf066a 2024-07-28 continue (Command Injection)
40 3baf066a 2024-07-28 continue ~~~
41 3a493068 2024-08-01 continue :check-lang (s-) [ $a $z n:between? [ vgi:not-found ] -if ] s:for-each ;
42 3baf066a 2024-07-28 continue SL check-lang
43 3baf066a 2024-07-28 continue TL check-lang
44 3baf066a 2024-07-28 continue
45 3baf066a 2024-07-28 continue :check-query (s-)
46 3baf066a 2024-07-28 continue [
47 3baf066a 2024-07-28 continue dup $a $z n:between? [ drop ] if;
48 3baf066a 2024-07-28 continue dup $A $Z n:between? [ drop ] if;
49 3baf066a 2024-07-28 continue dup $0 $9 n:between? [ drop ] if;
50 3baf066a 2024-07-28 continue dup $% eq? [ drop ] if;
51 3baf066a 2024-07-28 continue dup $/ eq? [ drop ] if;
52 3baf066a 2024-07-28 continue dup $_ eq? [ drop ] if;
53 3baf066a 2024-07-28 continue dup $. eq? [ drop ] if;
54 3baf066a 2024-07-28 continue dup $- eq? [ drop ] if;
55 3baf066a 2024-07-28 continue $~ eq? [ ] if;
56 3a493068 2024-08-01 continue vgi:bad-request
57 3baf066a 2024-07-28 continue ] s:for-each
58 3baf066a 2024-07-28 continue ;
59 3baf066a 2024-07-28 continue QUERY check-query
60 3baf066a 2024-07-28 continue ~~~
61 3baf066a 2024-07-28 continue
62 3baf066a 2024-07-28 continue Результат выполнения команды curl будем хранить в буфере из 16-ти килоячеек
63 3baf066a 2024-07-28 continue (+ ячейка для ASCII:NULL)
64 3baf066a 2024-07-28 continue ~~~
65 3a493068 2024-08-01 continue :html:BUFFER_SIZE #16384 ;
66 3a493068 2024-08-01 continue 'html:Buffer d:create html:BUFFER_SIZE #1 + allot
67 3baf066a 2024-07-28 continue ~~~
68 3baf066a 2024-07-28 continue
69 3a493068 2024-08-01 continue Для выполнения HTTPS-запроса используем curl или (для тестов) cat из существующего файла с HTML-ответом.
70 3baf066a 2024-07-28 continue Чтение результата выполнения команды curl по переданному описателю пайпа происходит до чтения
71 3baf066a 2024-07-28 continue 0 символа (не байта). Считаем, что в этом случае пайп закрыт другой стороной.
72 3baf066a 2024-07-28 continue ~~~
73 3a493068 2024-08-01 continue :html:read-buffer (h-h)
74 3a493068 2024-08-01 continue html:Buffer buffer:set html:BUFFER_SIZE [ dup file:read/c 0; buffer:add ] times
75 3baf066a 2024-07-28 continue ;
76 3a493068 2024-08-01 continue :html:pipe-command-curl (-s)
77 3a493068 2024-08-01 continue QUERY TL SL 'curl_-m_5_-s_--url-query_sl=%s_--url-query_tl=%s_"https://translate.google.com/m?q=%s" s:format
78 3a493068 2024-08-01 continue ;
79 3a493068 2024-08-01 continue :html:pipe-command (-s)
80 3a493068 2024-08-01 continue 'GTRANSLRESPFILE s:empty [ unix:getenv ] sip dup s:length n:zero?
81 3a493068 2024-08-01 continue [ drop html:pipe-command-curl ] [ 'cat_%s s:format ] choose
82 3a493068 2024-08-01 continue ;
83 3a493068 2024-08-01 continue :html:do-request
84 3a493068 2024-08-01 continue html:pipe-command file:R unix:popen html:read-buffer unix:pclose
85 3a493068 2024-08-01 continue ;
86 3baf066a 2024-07-28 continue ~~~
87 3baf066a 2024-07-28 continue
88 3baf066a 2024-07-28 continue Рабоче-крестьянский парсинг HTML:
89 3baf066a 2024-07-28 continue извлекаем текст из тэга <div class="result-container">ИЗВЛЕКИ ЭТОТ ТЕКСТ</div>
90 3baf066a 2024-07-28 continue ^(1) ^(2) ^(3)
91 3baf066a 2024-07-28 continue * (1) находим подстроку "result-container"
92 3baf066a 2024-07-28 continue * (2) вслед за ней находит символ > (могут быть пробельные символы или другие атрибуты элемента)
93 3baf066a 2024-07-28 continue * (3) и извлекаем все, до следующего символа открывающего тэга (<)
94 3baf066a 2024-07-28 continue
95 3baf066a 2024-07-28 continue Затем в результате заменяем наиболее часто-используемые escape-последовательности HTML на символы.
96 3baf066a 2024-07-28 continue ~~~
97 3a493068 2024-08-01 continue :html:get-result-container (-s)
98 3a493068 2024-08-01 continue html:do-request
99 3a493068 2024-08-01 continue
100 3a493068 2024-08-01 continue html:Buffer '"result-container" s:index/string dup n:negative? [ vgi:tmp-failure ] if
101 3a493068 2024-08-01 continue html:Buffer s:length swap - html:Buffer swap s:right
102 3a493068 2024-08-01 continue
103 3a493068 2024-08-01 continue dup $> s:index/char dup n:negative? [ vgi:tmp-failure ] if
104 3a493068 2024-08-01 continue swap dup s:length rot - s:right
105 3a493068 2024-08-01 continue
106 3baf066a 2024-07-28 continue dup $< s:index/char #1 - #1 swap s:substr
107 3baf066a 2024-07-28 continue
108 3baf066a 2024-07-28 continue '&amp; '& s:replace-all '&#38; '& s:replace-all '&#x26; '& s:replace-all
109 3baf066a 2024-07-28 continue '&lt; '< s:replace-all '&#60; '< s:replace-all '&#x3C; '< s:replace-all '&#x3c; '< s:replace-all
110 3baf066a 2024-07-28 continue '&gt; '> s:replace-all '&#62; '> s:replace-all '&#x3E; '> s:replace-all '&#x3e; '> s:replace-all
111 3baf066a 2024-07-28 continue '&quot; '" s:replace-all '&#34; '" s:replace-all '&#x22; '" s:replace-all
112 3baf066a 2024-07-28 continue '&apos; '' s:replace-all '&#39; '' s:replace-all '&#x27; '' s:replace-all
113 3baf066a 2024-07-28 continue ;
114 3baf066a 2024-07-28 continue ~~~
115 3baf066a 2024-07-28 continue
116 3baf066a 2024-07-28 continue Отдаём результат в формате "text/gemini" в стандартный поток вывода
117 3baf066a 2024-07-28 continue ~~~
118 3a493068 2024-08-01 continue html:get-result-container
119 3baf066a 2024-07-28 continue '20_text/gemini CRLF s:append s:put
120 3baf066a 2024-07-28 continue '#_🔁_GTransl CRLF s:append s:put
121 3baf066a 2024-07-28 continue CRLF s:put
122 3baf066a 2024-07-28 continue CRLF SL 'From:_%s%s s:format s:put
123 3baf066a 2024-07-28 continue CRLF TL 'To:___%s%s s:format s:put
124 3baf066a 2024-07-28 continue CRLF s:put
125 3baf066a 2024-07-28 continue '``` CRLF s:append s:put
126 3baf066a 2024-07-28 continue (s-) CRLF s:append s:put
127 3baf066a 2024-07-28 continue '``` CRLF s:append s:put
128 3baf066a 2024-07-28 continue ~~~