1. Perl / Говнокод #12382

    −103

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    # save all blocks to %blocks. Replace first block with <block blockname />
    	sub _parse_block {
    		my $tag = $_[1];
    		
    		last unless $_[0]=~s#($tag->[0]block +([^ /]*?) *$tag->[1])((.*?)$tag->[0]/?block$tag->[1])#
    				my($opentag,$source,$bname,$bcode, $retval) = ($1,$3, $2, $4, '');
    				if( $bcode =~m|$tag->[0]block +[^ /]*? *$tag->[1]|){
    					_parse_block($source, $tag);
    					$retval =  $opentag.$source;
    				}else{
    					$retval = "$tag->[0]block $bname /$tag->[1]" unless exists $blocks{$bname};
    					
    					$bcode=~s%$tag->[0](:? |/)*parent(:? |/)*$tag->[1]%$blocks{$bname}%g;
    					
    					$blocks{$bname} = $bcode; 
    				}
    				$retval;
    		#seg;
    	}
    	
    	foreach my $tag( @{$self->{tag_symbols}} ){
    		_parse_block($code,$tag) while(1);
    	}
    
    	
    	
    	#if <blockmode> turned on, delete all data that not in blocks until </blockmode> or end of code
    	
    	foreach my $tag( @{$self->{tag_symbols}} ){
    		$code=~s%$tag->[0] *blocks?(?:mode?)? *$tag->[1](.*?)(?:(?:$tag->[0] *\/ *blocks?(?:mode?)? *$tag->[1])|(';#end of code))%
    			$_ = $1; my $end_of_code = $2;
    			my $retval;
    			$retval .= $1 while( m/($tag->[0]block +[^ ]*? *\/.*?$tag->[1])/g ); 
    			
    			$retval.$end_of_code;
    		%esg;
    		#
    	}
    	
    	
    	# replace <block blockname /> with a code block
    	foreach my $tag( @{$self->{tag_symbols}} ){
    		while($code=~s|$tag->[0]block +([A-zА-я0-9_-]*?) */.*?$tag->[1]|$blocks{$1}|eg){};
    	};

    Кусок шаблонизатора. Парсинг вложенных тегов регулярками.

    Запостил: nyaknyan, 02 Января 2013

    Комментарии (32) RSS

    • Я бы - только за это: $1,$3, $2, $4, ''
      А вы бы за что?
      Ответить
      • да тут за что не возьмись....

        то же /[A-zА-я]/ чего стоит...

        с такими регулярками, можно было бы уже и сабрутин на-eval()-ить и закэшировать.

        ЗЫ интересно какой редактор вот те `#seg;` и `%esg;` правильно вообще захайлайтит? надо будет в емаксе этот код открыть.
        Ответить
        • Эти регулярки и прогоняются один раз, результат их работы именно евалится в сабрутин и кешируется.
          Хайлайтится с кастомными разделителями нормально нотпадом++, только код в замене не хайлайтится как код.

          Вообще это мой старый код, он говно, стоило бы сделать на стеках, а не этой рекурсивной регуляркохуйне, но переписывать лень, оно просто работает.
          Ответить
        • > ЗЫ интересно какой редактор вот те `#seg;` и `%esg;` правильно вообще захайлайтит?

          kate (katepart) к примеру. Пруфпик: http://rghost.ru/42744334/image.png
          Ответить
          • да. отстаю от времени. даже vim это съедает.
            Ответить
            • > даже vim
              Вы так говорите, будто vim находится примерно на том же уровне, что блокнот.
              Ответить
              • нет. но по реализации подсветки синтаксиса он наверное самый слабый. он не умеет анализировать код инкрементально. не держит состояние подсветки на весь файл (только по умолчанию что ли 300 строк вверх/вниз). и вложеность условной подсветки ограничена двумя уровнями. в большинстве случаев работает - но на сложном перле (много нестандартных кавычек) или миксе хтмл/цсс/жабаскрипт подсветка очень часто ломается. по крайней мере по сравнению с емаксом, вим однозначно отстает.
                Ответить
          • Иди оффтопь в другое место, здесь для другого тред.
            Ответить
            • Другого, заходи!
              Ответить
              • Для Другого тред же.

                Другого знаешь? Говноблогер такой
                Ответить
              • Зашёл. Звали?
                Ответить
              • Так приятно, для меня целый тред выделили.
                Ответить
                • https://www.heroeswm.ru/forum_messages.php?tid=1582731
                  Ответить
                  • Kakou gpyrou )))
                    Ответить
                  • показать все, что скрытоvanished
                    Ответить
                    • >> #include <conio.h>

                      Угадайте компилятор с одной попытки.
                      Ответить
                      • показать все, что скрытоvanished
                        Ответить
                      • показать все, что скрытоvanished
                        Ответить
                        • DOS — это не компилятор, а система.

                          А компилятор, скорее всего, «Turbo C/C++» или «Borland C/C++».
                          Ответить
                          • Вроде помница в вижуал тоже был conio.
                            Ответить
                            • Точно, был.

                              /* Function prototypes */
                              
                              _CRTIMP char * __cdecl _cgets(char *);
                              _CRTIMP int __cdecl _cprintf(const char *, ...);
                              _CRTIMP int __cdecl _cputs(const char *);
                              _CRTIMP int __cdecl _cscanf(const char *, ...);
                              _CRTIMP int __cdecl _getch(void);
                              _CRTIMP int __cdecl _getche(void);
                              #ifdef  _M_IX86
                              int __cdecl _inp(unsigned short);
                              unsigned short __cdecl _inpw(unsigned short);
                              unsigned long __cdecl _inpd(unsigned short);
                              #endif  /* _M_IX86 */
                              _CRTIMP int __cdecl _kbhit(void);
                              #ifdef  _M_IX86
                              int __cdecl _outp(unsigned short, int);
                              unsigned short __cdecl _outpw(unsigned short, unsigned short);
                              unsigned long __cdecl _outpd(unsigned short, unsigned long);
                              #endif  /* _M_IX86 */
                              _CRTIMP int __cdecl _putch(int);
                              _CRTIMP int __cdecl _ungetch(int);
                              
                              
                              #if     !__STDC__
                              
                              /* Non-ANSI names for compatibility */
                              
                              _CRTIMP char * __cdecl cgets(char *);
                              _CRTIMP int __cdecl cprintf(const char *, ...);
                              _CRTIMP int __cdecl cputs(const char *);
                              _CRTIMP int __cdecl cscanf(const char *, ...);
                              #ifdef  _M_IX86
                              int __cdecl inp(unsigned short);
                              unsigned short __cdecl inpw(unsigned short);
                              #endif  /* _M_IX86 */
                              _CRTIMP int __cdecl getch(void);
                              _CRTIMP int __cdecl getche(void);
                              _CRTIMP int __cdecl kbhit(void);
                              #ifdef  _M_IX86
                              int __cdecl outp(unsigned short, int);
                              unsigned short __cdecl outpw(unsigned short, unsigned short);
                              #endif  /* _M_IX86 */
                              _CRTIMP int __cdecl putch(int);
                              _CRTIMP int __cdecl ungetch(int);
                              
                              #endif  /* __STDC__ */
                              Ответить
                              • Зачем по два повторяющихся ifdef'a подряд? Нельзя было всё под одним написать?
                                Ответить
                                • Можно было. Тем более, что inp* и outp* — это соответственно ввод из порта и вывод в порт, т. е. операции из одной группы.
                                  Ответить
                                • Вообще не понимаю, по какому принципу их отсортировали. Вроде не по алфавиту.

                                  В каком порядке следуют прототипы, всем насрать, они же друг на друга не ссылаются и к физическому порядку в библиотеке тоже не привязаны.
                                  Ответить
                          • показать все, что скрытоvanished
                            Ответить
                      • Это который в паскале был crt?
                        лол)
                        Ответить
                        • Ага. Вроде ещё в «ncurses» есть похожие функции.
                          Ответить
                          • Да, только ncurses под эмуляторы терминала
                            под dos нужен был специфичный API, но был и ansi.sys (для понимагния ESC кодов терминалав)

                            Винда свременная умеет только ConsoleAPI, но есть уже проект и
                            виндотерминала тоже


                            В conio/crt был gotoxy

                            ахахах, бивис
                            ты слышал?
                            Он сказал "иди ху"
                            Ответить
    • Пекацефал писю пососал
      Ответить

    Добавить комментарий