parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

всю систему надо менять (c)

andylars 12.06.2017 18:51 / 14.06.2017 00:01

рац.предложение прозвучало около года назад
https://www.parser.ru/forum/?id=83347

из сути которого следует идея лаконично причесать "зоопарк" taint-измов и одновременно расширить гибкость, которая должна помочь решить вашу проблему (но это не точно :)

Предложение: заменить всё одним методом (оператором)
^paint[string][options]

# для обратной совместимости ^taint не трогаем
# формулировку типа "краски" tainted для неопределенно грязных меняем на dirty 
# чтобы не порождать исторически сложившейся путаницы

где,
string:  строка (или код, т.к. механизм работает только со строками
         то синтаксически "хромой" наследный ^untaint{} не имеет смысла)

options: хеш опций
  $.to[color]           в какой цвет красить, по-умолчанию dirty (неопределенно грязный)

  $.what[               красить не всю строку, а только определенные цвета в строке
     $._default(true/false)    правило для всех встреченных цветов, 
                               и не указанных в наборе ниже, по-умолчанию _default(true) значит
                               красить все цвета строки в $.to (стандартное поведение taint-ов)

     $.color(true/false)   true - красить указанный цвет в $.to или наоборот исключить (false)
  ]

  $.apply(true/false)   мгновенное или отложенное применение (по-умолчанию false)
  $.regex[]             применить только к подстрокам по регэкспу

# Пример1

^paint[$var]            пачкает в dirty (неопределенно грязный) всю строку, 
                             поведение полностью аналогично ^taint[$var]

^paint[$var][           куски dirty-покраски преобразовать в as-is, аналог ^untaint{$var}
   $.to[as-is]
   $.what[
      $._default(false)
      $.dirty(true)
   ]
]


^paint[$var][              демонстрация гибкости
    $.to[as-is]            покрасить строку в as-is
    $.what[                  
       $._default(false)     иcключить применение для всех встреченных в строке цветов
       $.uri(true)           но применить для куска строки, которая покрашена в uri-цвет
    ]
    $.apply(true)            и применить преобразование сразу
]



# Дополнение:

можно, также, ввести одну пользовательскую логическую краску (например usr)
которая ничего не делает, но пригодится для какой-то логической операции в 
покраске, вот ту же "точку/разделитель" промаркировать и применять правило
только к ней. Удобно на случай, когда мы не знаем какие символы будут окрашены
в usr, и поэтому не можем применить regex, но зато можем применить правило для 
логического цвета.


# Пример2 (для логической краски)

# покрасим символ-разделитель в логический цвет
$a[^paint[&][$.to[usr]]]
$e[^paint[=][$.to[usr]]]


$some_uri[var1${e}value1${a}var2=value2&var2=value3]   ->  var1=value1&var2=value2&var2=value3

^paint[$some_uri][     покрасить $some_uri
   $.to[uri]             в uri-раскраску
   $.what[
      $.usr(false)       но исключить это для кусков строки цвета usr
   ]
]

# результат работы: сепараторы, покрашенные в usr не будут окрашены в uri-цвет:
var1=value1&var2%3Dvalue2%26var2%3Dvalue3