=()= / Говнокод #12382 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 nyaknyan, (Updated )

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

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

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

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

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

        Вообще это мой старый код, он говно, стоило бы сделать на стеках, а не этой рекурсивной регуляркохуйне, но переписывать лень, оно просто работает.
        Ответить
          • > даже vim
            Вы так говорите, будто vim находится примерно на том же уровне, что блокнот.
            Ответить
            • нет. но по реализации подсветки синтаксиса он наверное самый слабый. он не умеет анализировать код инкрементально. не держит состояние подсветки на весь файл (только по умолчанию что ли 300 строк вверх/вниз). и вложеность условной подсветки ограничена двумя уровнями. в большинстве случаев работает - но на сложном перле (много нестандартных кавычек) или миксе хтмл/цсс/жабаскрипт подсветка очень часто ломается. по крайней мере по сравнению с емаксом, вим однозначно отстает.
              Ответить
        • Иди оффтопь в другое место, здесь для другого тред.
          Ответить
            • Для Другого тред же.

              Другого знаешь? Говноблогер такой
              Ответить
                    • >yakwo
                      ненавижу, когда букву щэ записывают через дуппель вэ
                      Ответить
                      • DOS — это не компилятор, а система.

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

                            /* 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* — это соответственно ввод из порта и вывод в порт, т. е. операции из одной группы.
                                Ответить
                              • Вообще не понимаю, по какому принципу их отсортировали. Вроде не по алфавиту.

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

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


                          В conio/crt был gotoxy

                          ахахах, бивис
                          ты слышал?
                          Он сказал "иди ху"
                          Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8