Модификаторы патэрна


Содержание

Модификаторы

Модификаторы имеют большую роль в общем своде правил MCSS, но так же применимы и к другим методологиям, из за чего вынесены в отдельный независимый модуль документации.

Основное предназначение модификатора — дополнять базовые стили и функционал сущности, расширяя или частично переопределяя его особенности.

Модификатор не должен переопределять большую часть базового набора функционала сущности, при возникновении такой ситуации стоит пересмотреть присвоенную роль сущности и принять решение упростить или вынести в самостоятельную единицу (модуль, блок).

Определение модификатора

Представление модификатора обязательно должно определять связь с модифицируемым элементом. Модификатор, без модифицируемого элемента не может существовать в принципе. Связь можно осуществить как вложенностью на файловой системе, так и определением связного ключевого слова:

Что бы наглядно отделить модификатор от других элементов, используется особое правило именования, определяющее специальный разделитель, используемый только в названиях модификаторов — “__“ (двойное подчеркивание).

Подробней почитать о правилах именования и о ключевом слове можно в отдельном модуле отдельном модуле.

В CSS/HTML

Именование

В первой версии синтаксиса MCSS использовалась такая запись модификатора:

С отбросом поддержки IE6 появилась возможность описывать модификатор в более читабельном виде, относительно HTML.

Наглядные пример удобства второго подхода:

Чем больше модификаторов, тем больше пользы от нового типа записи:

Стоит заметить, что во втором варианте незначительно увеличивается каскадность селекторов. Такое уменьшение производительности минимально и в случае редкого использования фактически не повлияет на общую скорость загрузки, к тому же, по обратную сторону фронтенда итоговый документ становится легче.

Расположение

Говоря о расположении в HTML, главное правило — определять модификатор максимально выше в сущности. Чем выше определен модификатор, тем больше контроля над сущностью и модификацией отдельных ее элементов, как существующих, так и новых в будущем.

Плохой пример использования модификатора:

Хороший пример использования модификатора:

В CSS, модификаторы стоит прописывать после основной группы модифицируемых элементов, чтобы не создавать путаницу, которая обязательно возникнет при появлении нескольких модификаций.

Общие правило расположение стилей описано в отдельном модуле.

Модификатор

Модификаторы изменяют численные показатели. Это могут быть, например, показатели здоровья, регенерации маны , урона оружия, скорость атаки и сотворения чар, скорость передвижения, атрибуты и многие другие. Модификаторы могут происходить от дерева пассивных умений, от снаряжения, аур, проклятий и других источников.

Содержание

Уровни применения и взаимодействие модификаторов [ править | править код ]

Все модификаторы делятся по сферам воздействия на локальные и глобальные.

Порядок применения модификаторов следующий:

  1. Плоские локальные модификаторы
  2. Процентные локальные модификаторы
  3. Глобальные модификаторы и модификаторы умения
  4. Конвертирование урона
  5. Умножающие глобальные модификаторы и модификаторы умений
  6. Процентные глобальные модификаторы и модификаторы умений

Локальные, глобальные и модификаторы умений [ править | править код ]

Локальные модификаторы находятся непосредственно на предмете. Они работают только если сам предмет используется; например, локальный модификатор на оружии в одной руке, не работает при атаке оружием в другой руке. Обратите внимание, что модификаторы могут быть локальными на одних типах предметов и глобальными на других. Локальные модификаторы:

Аксессуары (амулеты, кольца, пояса):

Броня (щиты, шлемы, доспехи, обувь, и перчатки):

  • Дополнительная защита, или ее увеличение
  • Шанс блока щитом
  • Уровни камней в предмете
  • Дополнительная меткость
  • Скорость атаки
  • Требования к атрибутам
  • Шанс на критический удар
  • Урон (все типы)
  • Уровни камней в предмете

Все остальные модификаторы — глобальные и воздействуют на всего персонажа, но с учетом применяемости. Например, свойство увеличение защиты щитов будет влиять только на ту часть защиты, которая пришла от щита. Тем не мене, это глобальны модификатор, несмотря на то, что влияет лишь на один предмет.

Точно также модификаторы умений считаются глобальными при вычислении эффекта умения, хотя и воздействуют только на это умение. Когда с камнем умения связаны камни поддержки, все модификаторы от всех камней поддержки применяются ко всем аспектам связанного умения. Например, модификатор увеличение урона от огня , от качества камня Урон огнем Урон огнем Огонь, Физический, Поддержка
Изображение: F
Множитель маны: 120% Требуется Уровень 8 Усиливает любое умение, наносящее удары по врагам. За 1% Качества:
Усиленные умения наносят увеличенный на 0.5% урон от огня Усиленные умения наносят (25-44)% от физического урона в виде дополнительного урона от огня Это камень поддержки. Он дает преимущества не герою, а камню умения в связанных гнездах. Вставьте камень поддержки в гнездо, соединенное с гнездом усиливаемого камня активного умения. Щелкните ПКМ, чтобы вынуть камень из гнезда. , скажется на любом уроне от огня, нанесенном связанным умение, даже если этот уроне не добавлен непосредственно камнем Урон огнем Урон огнем Огонь, Физический, Поддержка
Изображение: F
Множитель маны: 120% Требуется Уровень 8 Усиливает любое умение, наносящее удары по врагам. За 1% Качества:
Усиленные умения наносят увеличенный на 0.5% урон от огня Усиленные умения наносят (25-44)% от физического урона в виде дополнительного урона от огня Это камень поддержки. Он дает преимущества не герою, а камню умения в связанных гнездах. Вставьте камень поддержки в гнездо, соединенное с гнездом усиливаемого камня активного умения. Щелкните ПКМ, чтобы вынуть камень из гнезда.

Плоские, процентные и умножающие модификаторы [ править | править код ]

Плоские модификаторы, как правило (но не всегда), используют слова дополнительный или добавляет . Они складываются с прочими плоскими модификаторами того же уровня применения (см. выше). Если они применяются к показателям, указанным простыми числами, то они тоже представлены простыми числами и не имеют знака «%» (например Добавляет 1-2 физического урона ). Если же они применяются к показателям, указанным в процентах, то они также указываются в процентах (например дополнительный % шанс блока ) и складываются (не перемножаются) с остальными и базовой величиной. Например дополнительный 10% шанс блока примененный к базе «30% шанса блока», даст «40% шанса блока», а не 33%. Обратите внимание, что все модификаторы сопротивлений — плоские, даже если используют слова повышениепонижение .

Процентные модификаторы имеют знак «%» и в описании имеют слова увеличениеповышениеускорение или снижениеуменьшениезамедление и т.п. Они складываются с остальными процентными модификаторами того же уровня применения (см. выше). Например, два глобальных модификатора 100% увеличение дадут в общем +200% увеличения (3х).

Умножающие модификаторы указываются в процентах, и в описании имеют слова Больше и Меньше . Они перемножаются с другими умножающими модификаторами того же уровня применения (см. выше). Например, два глобальных модификатора На 100% больше (2х каждый) дадут в общем +300% Больше (4х).

Качество [ править | править код ]

Качество применяется, как локальный модификатор увеличения физического урона на оружии, локальный модификатор увеличения защиты на броне, и как локальный модификатор увеличения количества предметов на картах.

Флаконы [ править | править код ]

Флаконы имеют нестандартную структуру модификаторов. Модификаторы Объем восстановления , Скорость восстановления , Темп восстановления и качество применяются каждый в отдельный шаг. Здесь по прежнему присутствую понятия глобальных и локальных модификаторов.

Применяемость модификаторов [ править | править код ]

Для каждого модификатора существует определенный тип, или набор типов показателей, к которым он применяется. Некоторые типы модификаторов являются подтипами для других. Модификаторы супертипа воздействуют на показатели, на которые воздействуют модификаторы его подтипов, но не обязательно наоборот. Многие типы модификаторов совпадают с тегами умений; однако, в их соотношении нет жесткой связи. Например магмовый удар Магмовый удар Атака, Снаряд, Область, Ближний бой, Удар, Огонь
Расход маны: 6
Время применения: 1.00 сек.
Эффективность добавленного урона: (120%-130%)
Скорость снаряда: 750 Герой атакует врага, нанося физический урон и урон от огня, создавая при этом магмовые шары, урон от которых распределяется между всеми врагами, которых они заденут. Шары взрываются, нанося урон от атак по области в месте приземления. За 1% Качества:
1% увеличение урона от огня Наносит (120-130)% от базового урона
60% физического урона становится уроном от огня
Выпускает дополнительных снарядов: 2
На 50% меньше урона снарядами
Постепенный урон от снарядов наносит на 50% меньше урона
+(2-6) к дальности ближнего боя
Добавляет от (2-75) до (3-113) урона от огня от атак Для получения умения выберите предмет и поместите камень в гнездо соответствующего цвета. Щелкните ПКМ, чтобы вынуть камень из гнезда. имеет тег «ближний бой», но снаряды от него не наносят «урон ближнего боя», а взрывная стрела Взрывная стрела Атака, Снаряд, Область, Длится, Огонь, Лук
Расход маны: (18-27)
Время применения: 1.00 сек.
Шанс критического удара: 6.00%
Скорость снаряда: 3260 Требуется Уровень 28 Герой отправляет стрелу, которая вскоре взрывается. Попадание во врага дополнительными стрелами отсрочивает взрыв. Когда фитили догорят или враг умрет, стрелы взорвутся и нанесут урон от огня по области, ранив оказавшихся рядом противников. Чем больше стрел взорвалось одновременно, тем больше радиус взрыва. За 1% Качества:
1% шанс поджечь врагов Базовая длительность: 1 секунд
Взрыв наносит от (44-586) до (66-879) базового урона от огня за взрывную стрелу
+2 к радиусу взрыва за взрывную стрелу Для получения умения выберите предмет и поместите камень в гнездо соответствующего цвета. Щелкните ПКМ, чтобы вынуть камень из гнезда. имеет тег «атака», но взрыв заряда не наносит урон «атакой».

Некоторые слова и обороты имеющие специально значение:

  • Если указан один тип модификатора, или присутствует союз и , то модификатор применяется ко всем показателям имеющим один из приведенных типов. Например, модификатор броня и энергетический щит применяется к броне от любого источника, так же как и к энергетическому щиту.
  • Если указаны несколько типов модификаторов, и союз и отсутствует тогда модификатор применяется к показателям имеющим все перечисленные типы. Например, модификатор урон от стихий булавами не применяется к не-стихийному урону булавами, или стихийному урону другим оружием, или эффектам стихий отличных от прямого урона булавами.
  • Если имеются слова условия, такие как при/с/если и т.п., связанные с каким-то типом предметов, то модификатор применяется глобально, не зависимо от того, имеет ли отношение данный показатель непосредственно к указанному предмету. Таким образом, модификатор с посохом в руках , применяется также и к заклинаниям или защите, даже если эти заклинания не сотворены посохом, и защиту дает нечто иное.
  • Если в модификаторе указан тип предмета в творительном падеже (Кем? Чем? — когтями, чарами, топорами и т.п.), то этот модификатор применяется, только если был использован непосредственно этот предмет. Так, модификатор, в котором есть слово когтями , применяется только к атакам, произведенным именно когтями.

Конвертированные показатели имеют два типа, и тип источника и тип результата, но один модификатор может воздействовать на этот показатель только один раз.

Типы модификаторов [ править | править код ]

Представлен не полный список

Типы показателей [ править | править код ]

Для всех модификаторов.

  • Область
  • Атрибуты
    • Ловкость
    • Интеллект
    • Сила
  • Шанс блока
  • Шанс увернуться
  • Урон
  • Защита
    • Броня
    • Уклонение
    • Энергетический щит
  • Длительность
  • Здоровье
  • Мана
  • Скорость передвижения
  • Скорость

Типы модификаторов урона [ править | править код ]

Любой урон имеет только один вид модификатора, если он не конвертирован или не добавлен из уроном другого типа модификатора, тогда он сохраняет также тип(ы) урона источника в дополнение к новому типу. Обратите внимание, что эффекты на цели, такие как сопротивление и отражение, применяются с учетом только последнего типа урона.

Типы источников [ править | править код ]

Мины, ловушки и тотемы используют умения, как если бы их применял игрок. Другими словами, любой источник урона имеет лишь один тип источника, и не перенимает тип источника создателя. Так например, если мина создает ловушку, то ловушка не получает эффекта от модификатора мины, хоть и была ей создана.


  • (Игрок): Если не указано конкретно, то модификатор воздействует на самого игрока и используемые им умения.
  • Мина
  • Прислужник
    • Подтипы прислужников
  • Тотем
  • Ловушка

Тип использования [ править | править код ]

Все эффекты имеют только один тип использования. Для большинства эффектов это Атака или Чары. Постепенный урон является отдельным типом. Некоторые эффекты не относятся к этим трем: в основном те, которые происходят при взрыве: Медвежий капкан Медвежий капкан Ловушка, Чары, Длится, Физический
Расход маны: (6-23)
Максимум зарядов: 3
Перезарядка: 4.00 сек.
Время применения: 1.00 сек.
Шанс критического удара: 6.00%
Эффективность добавленного урона: 200% Требуется Уровень 4 Герой бросает в указанное место ловушку, которая в течение некоторого времени будет наносить урон и обездвиживать врага в зависимости от количества нанесенного урона. После окончания действия обездвиживания, на враге некоторое время будет оставаться отрицательный эффект, который будет снижать скорость его передвижения (значение этого эффекта уменьшается с течением времени). До завершения действия отрицательного эффекта враг будет получать увеличенный урон от мин и ловушек. За 1% Качества:
1% увеличение физического урона Время существования ловушки 4 секунд(-ы)
Наносит от (16-1447) до (22-2026) физического урона
Враги получают увеличенный на 15% урон от ударов ловушками и минами
В начале действия отрицательного эффекта враги имеют на 80% меньше скорости передвижения
Базовая длительность: 3 секунд
Удерживает врага на месте
Ловушки не срабатывают по истечении времени их существования Для получения умения выберите предмет и поместите камень в гнездо соответствующего цвета. Щелкните ПКМ, чтобы вынуть камень из гнезда. , Подрыв трупа Подрыв трупа Чары, Область, Огонь
Радиус: 22
Расход маны: (5-20)
Время применения: 0.60 сек.
Шанс критического удара: 6.00%
Эффективность добавленного урона: 160% Требуется Уровень 4 Герой выбирает целью труп и наносит урон от чар врагам поблизости. Труп взрывается, нанося урон от огня. На взрыв не действуют модификаторы урона от чар и его нельзя отразить. За 1% Качества:
0.5% повышение скорости сотворения чар Взрыв наносит базовый урон от огня, равный 6% от максимума здоровья трупа
Наносит от (15-798) до (22-1197) урона от огня
+(0-4) к радиусу Для получения умения выберите предмет и поместите камень в гнездо соответствующего цвета. Щелкните ПКМ, чтобы вынуть камень из гнезда. , Подрыв трупа ваал Подрыв трупа ваал Ваал, Чары, Область, Огонь
Разовый расход душ: 30 (N) /
Максимум зарядов: 1
Нельзя получать души: 8.000 сек.
Время применения: 0.60 сек.
Шанс критического удара: 5.00%
Эффективность добавленного урона: 200% Требуется Уровень 4 Герой выбирает целью труп, из которого вырывается пульс, уничтожающий выбранный труп и все трупы поблизости. Враги вокруг каждого трупа получают урон от чар, а сами трупы взрываются, нанося урон от огня. На взрывы трупов не действуют модификаторы урона от чар, и их нельзя отразить. Взрывы будут продолжаться, пока в области есть трупы, а задержка между взрывами будет расти, пока не истечёт время действия умения или не будет взорвано 22 трупа. За 1% Качества:
1% увеличение урона по области Взрыв наносит базовый урон от огня, равный 9% от максимума здоровья трупа
Наносит от (23-1395) до (33-2092) урона от огня
+(0-4) к радиусу
Осквернено Для получения умения выберите предмет и поместите камень в гнездо соответствующего цвета. Щелкните ПКМ, чтобы вынуть камень из гнезда. , Взрывная стрела Взрывная стрела Атака, Снаряд, Область, Длится, Огонь, Лук
Расход маны: (18-27)
Время применения: 1.00 сек.
Шанс критического удара: 6.00%
Скорость снаряда: 3260 Требуется Уровень 28 Герой отправляет стрелу, которая вскоре взрывается. Попадание во врага дополнительными стрелами отсрочивает взрыв. Когда фитили догорят или враг умрет, стрелы взорвутся и нанесут урон от огня по области, ранив оказавшихся рядом противников. Чем больше стрел взорвалось одновременно, тем больше радиус взрыва. За 1% Качества:
1% шанс поджечь врагов Базовая длительность: 1 секунд
Взрыв наносит от (44-586) до (66-879) базового урона от огня за взрывную стрелу
+2 к радиусу взрыва за взрывную стрелу Для получения умения выберите предмет и поместите камень в гнездо соответствующего цвета. Щелкните ПКМ, чтобы вынуть камень из гнезда. , Удар преисподней Удар преисподней Атака, Область, Ближний бой, Удар, Огонь, Длится
Радиус: 15
Расход маны: 6
Время применения: 1.00 сек.
Эффективность добавленного урона: (104%-133%) Требуется Уровень 12 Герой совершает атаку оружием, накладывая заряд отрицательного эффекта на основную цель и отрицательный эффект без заряда на все остальные поражённые цели. При достижении 6 зарядов, истечении их времени действия или смерти врага, отрицательный эффект пропадает, нанося урон основной цели и другим врагам поблизости. При смерти врага, находящегося под действием любого из этих отрицательных эффектов, он взорвётся, нанося урон врагам поблизости. Урон от взрыва нельзя отразить. Требует меч, топор, булаву, скипетр, посох или свободные руки. За 1% Качества:
0.5% увеличение области действия Наносит (103.9-133)% от базового урона
50% физического урона становится уроном от огня
Базовая длительность: 0.8 секунд
Взрыв наносит базовый урон от огня, равный 6% от максимума здоровья трупа
Отрицательный эффект наносит 66% от урона за каждый заряд
Добавляет от (5-75) до (8-113) урона от огня от атак
+(0-2) к дальности ближнего боя Для получения умения выберите предмет и поместите камень в гнездо соответствующего цвета. Щелкните ПКМ, чтобы вынуть камень из гнезда.

  • атака
    • оружие
      • Одноручное оружие ближнего боя
        • Конкретный тип оружия
      • Двуручное оружие ближнего боя
        • Конкретный тип оружия
    • Ближний бой (Обратите внимание, что он не является супертипом для оружия ближнего боя)
      • Без оружия
  • Сотворение (сюда так же относятся также модификаторы, имеющие и более уточненный вид «Сотворение чар»)
    • Чары
      • Проклятье
  • Постепенный урон
    • Горение
    • Отравление

Прочие типы [ править | править код ]

  • Положительный эффект
    • Аура
  • Снаряд
    • Жезл
    • Лук
  • Эффект умения
  • Эффект стихий
    • Поджог
    • Заморозка
    • Охлаждение
    • Шок
  • оглушение
    • блок (восстановление)

Падение предельной полезности модификаторов “Увеличение” [ править | править код ]

Из-за того, что модификаторы «увеличение» складываются между собой, добавление все большего процентных величин становится все менее эффективным. Если у вас 100 ед. здоровья, добавление 8% даст вам 8 ед. здоровья, что равняется 8% вашего текущего общего здоровья. Если же вы имеет 100 ед. здоровья и модификаторы на 250% увеличения здоровья, то дополнительные 8% все также будут давать вам 8 ед.здоровья, однако это будет всего лишь 2.3% вашего текущего общего здоровья.

Общее количество здоровья до взятия узла на 8% увеличения здоровья = 100

Общее здоровье после взятия 8% узла = 100 * (100 + 8 )/100 = 108

Увеличение в абсолютных единицах = 108 — 100 = 8

Увеличение в % = 8/100 = 8%

Общее количество здоровья до взятия узла на 8% увеличения здоровья = 100 * (100 + 250)/100 = 350

Общее здоровье после взятия 8% узла = 100 * (100 + 250+8 )/100 = 358

Увеличение в абсолютных единицах = 358 — 350 = 8

Увеличение в % = 8/350 = 2.3%

Умножающие модификаторы “Больше” и “Меньше” [ править | править код ]

Как уже было сказано выше: модификаторы “Больше” и “Меньше” перемножаются между собой. «На 30% меньше» и «На 30% больше» вместе не дадут стартовые 100% показателя, они дадут 91%. Чтобы компенсировать эффект «На 30% меньше» вам потребуется модификатор «На 42,8% больше».

Применение «На 30% меньше» к 100 ед. урона

100 * (100 —30)/100 = 70

Применение «На 30% больше» к полученному сниженному значению

100 * (100-30)/100 * (100+30)/100 = 91

Найдет необходимую величину модификатора БОЛЬШЕ, что компенсировать потери от модификатора МЕНЬШЕ.

100 * 70/100 *(100+x)/100 = 100

70* (100+x)/100 = 100

70/100*x = 100 — 70

И все же, несколько модификаторов „БОЛЬШЕ“ значительно умножат ваш урон.

«На 50% больше урона» от Средоточия 1-го уровня и «На 30% больше урона» Мины 1-го уровня дадут следубщее:

100 * (100+50)/100 * (100+30)/100= 195

Это 95% увеличение урона.

Пример расчета [ править | править код ]

Допустим у меня 100 ед.здоровья, и два пассивных умения по «15% увеличения максимального здоровья». Они складываются, и в итоге мы получим:

100 + (100 * 0,15) + (100 * 0,15), или

100 * (1 + 0,15 + 0,15) = 130 здоровья

Теперь я надеваю предмет, дающий +40 к здоровью, и буре пассивное умение, дающее +20 к здоровью. Плоские модификаторы применяются первыми, и я получу:

(100 + 40 + 20) * (1 + 0,15 + 0,15) = 160 * 1.3 = 208 здоровья

Теперь я возьму два пассивных умения «На 10% больше здоровья». Это умножающие модификаторы, так они применяются отдельно друг от друга:

(100 + 40 + 20) * (1 + 0,15 + 0,15) * 1,10 * 1,10 = 251,68 здоровья

Обратите внимание, что если бы они складывались с остальными %, а не перемножались, я бы получил:

(100 + 40 + 20) * (1 + 0,15 + 0,15 + 0,1 + 0,1) = 240 здоровья

Усложненные примеры [ править | править код ]

Здесь показано как взаимодействуют модификаторы «увеличения» от различных источников и умножающие модификаторы. Допустим, вы Ведьма, использующая Огненный шар 10-го уровня, усиленный Ускорением снарядов 7-го уровня

Илон Маск рекомендует:  Кодированиераскодирование UTF8

Ваши пассивные умения:


20% увеличение урона от стихий чарами

21% увеличение урона чарами

22% увеличение урона от огня

23% увеличение урона снарядами

24% увеличение урона от огня

8% увеличение урона от стихий

6% увеличение урона по области

Модификаторы на снаряжении

15% увеличение урона чарами

16% увеличение урона от огня

Модификаторы от связанного камня поддержки

13% увеличение урона снарядами

Пример №1: огненный шар + ускорение снарядов

Базовый средний урон: 85 – 128 = 106.5

106.5 * (100 + “Пассивки”(20 + 21 +22 +23 +24 +8 +6) + “Предметы”(15 +16) + “Поддержка”(13)) /100 = 285.42

Пример №2: огненный шар + ускорение снарядов и еще возьмем «пассивку» 12% увеличение урона чарами

106.5 * (100 + “Пассивки”(20 + 21 +22 +23 +24 +8 +6 +12) + “Предметы”(15 +16) + “Поддержка”(13)) /100 = 298.2

(Это 4.5 % увеличение нашего урона: 298.2/285.42-1)

Пример №3: огненный шар + ускорение снарядов и добавим камень поддержки Средоточие 1-го уровня (На 50% больше урона)

106.5 * (100 + “Пассивки”(20 + 21 +22 +23 +24 +8 +6) + “Предметы”(15 +16) + “Поддержка”(13)) /100 * “Средоточие”(100+50)/100 = 428.13

(Это 50 % увеличение нашего урона: 428.13/285.42-1)

Пример №4: огненный шар + ускорение снарядов + МДС 20-го уровня (На 30% меньше урона, 38% Увеличение урона)

106.5 * (100 + “Пассивки”(20 + 21 +22 +23 +24 +8 +6) + “Предметы”(15 +16) + “Поддержка”(13+38)) /100 * “МДС”( (100-30)/100 = 228.12

(Это 20.1 % уменьшение нашего урона: 228.12/285.42-1)

Пример №5: огненный шар + ускорение снарядов + МДС 20-го уровня + Средоточие 1-го уровня (На 30% меньше урона, На 50% больше урона, 38% Увеличение урона)

106.5 * (100 + “Пассивки”(20 + 21 +22 +23 +24 +8 +6) + “Предметы”(15 +16) + “Поддержка”(13+38)) /100 * “МДС”( (100-30)/100 * “Средоточие”(100+50)/100 = 342.18

(Это 19.9 % увеличение нашего урона: 342.18/285.42-1)

Информация для разработчиков [ править | править код ]

Соответствующие данные могут быть найдены в content.ggpk

Мод Data/Mods.dat Список модов с принадлежащими к ним статистикой & ценностей баффов и навыков, условий
Mod Domains Data/ModsDomains.dat
Mod Generation Types Data/ModsGenerationTypes.dat

Собственное свойство [ править | править код ]

Implicit modifiers always spawn on entities before the addition or change of additional modifiers (for example by changing the rarity).

On monsters, implicit modifiers can be very commonly found. For example, some monsters are granted damage conversion which converts their inherent damage to that of another element. However, on unique monsters and bosses implicits are most notable — for example most bosses are granted a boost to their item rarity and item quantity as well as other bonuses such as on Atziri.

On items, visible implicit modifiers are most commonly found on:

Shields and body armour also commonly have a hidden movement speed penalty modifier.

Unlike the implicit modifiers on monsters, the implicit modifiers on equipment can be by altered in various ways:

  • Благодатная сфера Благодатная сфера Размер стопки: 20 Изменяет числовые значения собственных свойств предмета Щелкните правой кнопкой мыши по этому объекту, а затем левой по другому предмету, чтобы использовать.
    Для разделения щелкните мышкой с зажатой клавишей Shift. — re rolls the range of the stats found on the implicit modifiers
  • Сфера ваал Сфера ваал Размер стопки: 10 Оскверняет предмет, непредсказуемо изменяя его Щелкните правой кнопкой мыши по этому объекту, а затем левой по предмету, чтобы осквернить его. Осквернённые предметы не могут быть модифицированы снова.
    Для разделения щелкните мышкой с зажатой клавишей Shift. — Corrupting an item can replace the implicit modifier with another depending on the item type
  • Enchantment — Enchanting Перчатки, Обувь or шлемы can give them a new implicit modifier

Certain unique items also have special interactions with implicits

  • Талисман Великого волка Талисман Великого волка Уровень талисмана: 4 Осквернено Повстречал старший волк короля
    в свете полной, большой луны.
    Силу диких земель даря,
    кровь монарха взамен испил. — has two randomly chosen talisman implicits

Регулярные выражения для чайников

Что такое регулярные выражения?

В народе: регэкспы, регулярки.

По-простому — это выражения для поиска и замены подстроки по шаблону.

В PHP используется название PCRE (Perl Compatible Regular Expressions —
перл совместимые регулярные выражения). В этой статье я постараюсь раскрыть
потенциал это мощного инструмента программиста. Не пытайтесь понять все сразу,
впитывайте порциями и приходите за добавкой.

Начнем

// наша строка для испытаний
$string = ‘abcdefghijklmnopqrstuvwxyz0123456789’ ;

Если нам нужно просто узнать есть ли шаблон ‘abc’ в строке $string
мы можем набросать такой код:

echo preg_match ( «/abc/» , $string ) ;
?>

Этот код выведет ‘1’. Потому что он нашел 1 (одно) вхождение шаблона в строке.
Если шаблон в строке не обнаружен, preg_match вернет 0. При нахождении первого вхождения,
функция сразу возвращает результат! Дальнейший поиск не продолжается (см. preg_match_all)

Нахождение начала строки

Теперь мы желаем узнать, начинается ли строка с ‘abc’.
Символ начала строки в регулярках — ‘^’ (caret — знак вставки).

// тест на начало строки
if ( preg_match ( «/^abc/» , $string ) )
<
// окей, строка начинается с абс
echo ‘The string begins with abc’ ;
>
else
<
echo ‘это фэйл’ ;
>
?>

Пример выведет:
The string begins with abc

Оборачивающие слэши — разделители, содержат регуряное выражение. Это могут быть любые парные символы,
например @regex@, #regex#, /regex/ и .т.п.

Символ ^ сразу после первого разделителя указывает что выражение начинается сначала строки и НИКАК иначе.

Что делать с регистром символов (строчные-прописные)

Перепишем код, чтобы он искал строку ‘ABC’:

Скрипт вернет:
Не думаю

Все потому что поиск регистро-зависимый. Шаблон ‘abc’ не тоже самое что ‘ABC’.
Чтобы найти оба варианта, нужно использовать модификатор. В регулярных выражениях
для этого применяется модификатор ‘i’, который нужно указать за закрывающим разделителем
регулярного выражения.

if ( preg_match ( «/^ABC/i» , $string ) ) <
echo ‘Совпадение, строка начинается с abc’ ;
> else <
echo ‘Не думаю’ ;
>
?>

Теперь скрипт найдет паттерн ‘abc’. Также теперь будут попадать под шаблон
строки вида abc, ABC, Abc, aBc, и т.п.

Позже будет рассказано подробнее о модификаторах.

Как указать в паттерне конец строки

Делается это также как и в случае с поиском начала строки.
Распространенная ошибка, допускаемя многими прогерами — использование символа $ для указания конца строки в шаблоне.
Это неверно, правильное решение — использовать утверждение \z. Посмотрите на этот код

Сниппет вернет true, потому что $ = \Z, что в свою очередь можно описать выражением (?=\z|\n\z).
Когда нам нужно получить в результате строку без «разделителей строк», $ не должен использоваться.
Также $ совпададет больше одного раза с модификатором /m, в противоположность \z. Изменим немного код,
удалим каретку (^) в начале паттерна и добавим \z в конце, также уберем зависимость от регистра модификатором /i.

// паттерн в конце строки?
if ( preg_match ( «/89 \z /i» , $string ) ) <
echo ‘Совпадение, строка заканчивается на 89’ ;
> else <
echo ‘Не думаю’ ;
>
?>

Результат скрипта:
>> Совпадение, строка заканчивается на 89

Потому что мы определили конец строки 89. Вот так.

Мета символы

Ранее мы поэкспериментировали с простыми регулярками. Познакомились с кареткой (^) и долларом ($)/
Эти символы имееют особенное значение. Каретка (^) обозначает начало страки и доллар ($) — ее конец.
Такие символы в купе с остальными специальными называются мета символами (meta characters).

Список мета символов в регулярных выражениях:

Разберем все символы на примерах.
Если вам нужно составить шаблон в котором содержится такой символ, его необходимо экранировать (см. preg_quote)
Например шаблон: «1+1», нужно записать как-то так:

// образец
$string = ‘1+1=2’ ;


if ( preg_match ( «/^1 \+ 1/i» , $string ) ) <
// yep
echo ‘The string begins with 1+1’ ;
> else <
// nope
echo ‘Не думаю’ ;
>
?>

Результат скрипта:
The string begins with 1+1

Потому что интерпретатор проигнорировал специальное значение символа «+», обозначенного символом экранирования «\» (бэкслэш).
Если бы мы не добавили экран к плюсу, то preg_match(«/^1+1/i», $string) не нашло бы совпадений с шаблоном.
Сам бэкслэш в свою очередь тоже нужно экранировать, если мы ищем именно этот символ «\\».

Что означают остальные мета символы

Квадратные скобки [ ] обозначают «строковой класс».

Символьный класс. Это просто набор символов, которые должны совпасть в искомой строке.
Они могут записываться индивидуально (по одному):

Или как диапазон, разделенный символом «-«:

// Ищем шаблон
echo preg_match ( «/b[aoiu]g/» , $string , $matches ) ;

Результат скрипта:
return 1

Потому что preg_match() нашел совпадение.
Этот код также найдет совпадение со строками ‘bag’ ‘bog’ ‘big’, но не с ‘beg’.
Диапазон символов [a-f] равнозначен такой записи [abcdef]. Словами формулируется так [от ‘a’ до ‘f’].
Еще раз повторю, выражения регистрозависимые, и [A-F] не тоже самое что и [a-f].

Мета символы не работыют внутри классов, поэтому их не нужно экранировать внутри квадратных скобок [. ].
Например класс [abcdef$] совпадет с символами a b c d e f $. Доллар ($) внутри класса — это простой бакс знак доллара без какого либо специального мета-свойства.

Есть правда исключения из правил:
Одна из полезных функций регулярных выражений — возможность указать шаблон НЕ совпадающий с диапазоном символов.
Чтобы это сделать, нужно использовать каретку (^) первым символом класса.
Найдем любые символы, кроме «b»:

// осуществляем поиск
preg_match ( «/[^b]/» , $string , $matches ) ;

// выведем все совпадения в цикле foreach
foreach ( $matches as $key => $value ) <
echo $key . ‘ -> ‘ . $value ;
>
?>

Результат скрипта:
0 -> a

Здесь preg_match() нашел первое совпадение с шаблоном /[^b]/.
Изменим скрипт и используем preg_match_all() для нахождения всех вхождений соответствующих шаблону /[^b]/.

// ищем ВСЕ совпадения
preg_match_all ( «/[^b]/» , $string , $matches ) ;

// выведем все совпадения в цикле foreach
foreach ( $matches [ 0 ] as $value ) <
echo $value ;
>
?>

Результат скрипта:
acefghijklmnopqrstuvwxyz0123456789

Выведет все символы, которые НЕ совпадают с шаблоном «b».

Так мы можем отфильтровать все цифры в строке:

// все символы не являющиеся цифрами от 0 до 9
preg_match_all ( «/[^0-9]/» , $string , $matches ) ;

foreach ( $matches [ 0 ] as $value ) <
echo $value ;
>
?>

Результат скрипта:
abcefghijklmnopqrstuvwxyz

Шаблон [^0-9] расшифровывается как все НЕ включая цифры от 0 до 9.

Продолжаете слушать нашу радиостанцию?
Тогда продолжим.

Метасимвол Бэкслэш (\).

Основное значение — экранирование других метасимволов.

// create a string
$string = ‘This is a [templateVar]’ ;

// try to match our pattern
preg_match_all ( «/[ \[ \] ]/» , $string , $matches ) ;

// loop through the matches with foreach
foreach ( $matches [ 0 ] as $value ) <
echo $value ;
>
?>

Здесь мы хотели найти все символы []. Без экранирования шаблон выглядел бы так — «/[[]]/»,
но мы добавили бэеслэши к скобкам [], чтобы отменить их мета-статус.
Также, к примеру, поступим с путем к файлу.
c:\dir\file.php
В паттерне будем использовать разделитель «\\».

Бэкслэш также ортодоксально используется в строках для указания специальных последовательностей: \n, \r и др.

Еще он неймспейсы разделяет!

Следующий символ «.» (точка) ака «полный стоп».

`Точка` совпадает с любым символом кроме символов разрыва строки \r или \n.
С помощью точки мы можем найти любой одиночный символ, за исключением разрыва строки.
Чтобы точка также совпадала с переводом каретки и разрывом строки, можно использовать флаг /s.

Ищем одиночный символ

$string = ‘sex at noon taxes’ ;

echo preg_match ( «/s.x/» , $string , $matches ) ;
?>

Результат скрипта:
1

Да, да preg_match() нашел одно совпадение. Пример также сработает с sax, six, sox, sux, и s x, но не совпадет с «stix».

Теперь попробуем найти \n.

// create a string
$string = ‘sex’ . » \n » . ‘at’ . » \n » . ‘noon’ . » \n » . ‘taxes’ . » \n » ;

// echo the string
echo nl2br ( $string ) ;

// look for a match
echo preg_match_all ( «/ \s /» , $string , $matches ) ;

Результат скрипта:
sex
at
noon
taxes
4

preg_match_all() нашел 4 совпадения разрыва строки «\n» потому что мы использовали флаг \s. Подробнее про флаге в разделе Спец Последовательностей..

Следующий волшебный символ — звездочка (*) asterisk
Совпадает с НОЛем и/или БОЛЕЕ вхождений шаблона, находящегося перед звездочкой.
* означает опциональный шаблон — допускается что символы могут быть, а могут и отсутствовать в строке.
Так шаблон .* совпадает с любым количеством любых символов. Пример:

// create a string
$string = ‘php’ ;

// look for a match
echo preg_match ( «/ph*p/» , $string , $matches ) ;

Результат скрипта:
1

Нашлось одно совпадение. В примере это один символ «h».
Пример также совпадет также со строкой «pp» (ноль символов «h»), и «phhhp» (три символа «h»).

Добрались до мета символа символа «+»

Плюс почти тоже самое что и звездочка, за исключением того что плюс совпадает с ОДНИМ и БОЛЬШЕ символом.
Так в примере звездочка «*» совпала со строкой ‘pp’, с плюсом «+» такое не пройдет.

// create a string
$string = ‘pp’ ;

// look for a match
echo preg_match ( «/ph+p/» , $string , $matches ) ;

Результат скрипта:

Потому что ни одного символа «h».

Следубщий пациент
Мета символ «?»

Знак вопроса совпадет с НУЛЕМ или ОДНИМ вхождением символа или регулярным выражением,
указанным сразу перед ним. Полезен для указания опциональных символов (которых может и не быть).

Например, телефонный номер в Австралии: 1234-5678.

// create a string
$string = ‘12345678’ ;

// look for a match
echo preg_match ( «/1234-?5678/» , $string , $matches ) ;

Результат скрипта:
1

Потому что -? совпал 0 раз с символом «-«. Изменение строки на «1234-5678» выдаст тот же результат.

Фигурные скобки <>

Указывает на количество совпавших символов или их интервал.
Например, за фразой PHP должно следовать ТОЧНО ТРИ цифры:

// create a string
$string = ‘PHP123’ ;

// look for a match
echo preg_match ( «/PHP[0-9]<3>/» , $string , $matches ) ;

Результат скрипта:
1

Шаблон PHP 0-9(цифры от 0 до 9) <3>(три раза) совпал.

Специальные последовательности

Бэкслэш (\) используется для спец. последовательностей:

* \d — любая цифра (тоже самое что и [0-9])
* \D — любая НЕ цифра ([^0-9])
* \s — все «недосимволы» — пробелы, переводы строки, табуляция ([ \t\n\r\f\v])
* \S — все НЕ «недосимволы» ([^ \t\n\r\f\v])
* \w — все альфа-цифровые символы (буквенно-числовые) ([a-zA-Z0-9_])
* \W — все НЕ альфа-цифровые символы ([^a-zA-Z0-9_])

Итак, используя последофательности (флаги) мы можем сократить наши регулярные выражения
и улучшить их читабельность.


// match our pattern containing a special sequence
preg_match_all ( «/[ \w ]/» , $string , $matches ) ;

// loop through the matches with foreach
foreach ( $matches [ 0 ] as $value ) <
echo $value ;
>
?>

Результат скрипта:
abcefghijklmnopqrstuvwxyz0123456789

Мы нашли (preg_match_all) все цифры и буквы (\w) класса ( [] ).

На следующем примере мы можем убедиться, что строка не содержит чисел.

// create a string
$string = ‘2 bad for perl’ ;

// echo our string
if ( preg_match ( «/^ \d /» , $string ) ) <
echo ‘String begins with a number’ ;
> else <
echo ‘String does not begin with a number’ ;
>
?>

Метасимвол «.» (Точка, полный стоп)

Совпадает один раз с любым символом (кроме разрыва строки)

// create a string
$string = ‘abcdefghijklmnopqrstuvwxyz0123456789’ ;

// try to match any character
if ( preg_match ( «/./» , $string ) ) <
echo ‘The string contains at least on character’ ;
> else <
echo ‘String does not contain anything’ ;
>
?>

Результат скрипта:
The string contains at least on character

Конечно, код содержит хотябы один символ.

Ранее была рассмотрена проблема нахождения символа разрыва строки, потому что «.» не совпадает с таким символом (\n).
Здесь нам на помощь придет флаг \s. Он найдет любой пробельный символ (недосимвол).

Для примера используем \n.

// create a string
$string = ‘sex’ . » \n » . ‘at’ . » \n » . ‘noon’ . » \n » . ‘taxes’ . » \n » ;

// echo the string
echo nl2br ( $string ) ;

// look for a match
echo preg_match_all ( «/ \s /» , $string , $matches ) ;

Результат скрипта:
sex
at
noon
taxes
4

preg_match() нашел 4 совпадения перевода строки \n.

Теперь все вместе, хором

Более сложные выражения.
Рассмотрим оператор OR (ИЛИ).
В регулярных выражениях это символ «|» (труба, канал).

Настало время показательного «Hello World» скрипта.

// a simple string
$string = «This is a Hello World script» ;

// try to match the patterns This OR That OR There
echo preg_match ( «/^(This|That|There)/» , $string ) ;
?>

Усложним задачу: попытаемся найти одновременно Hello или Jello в строке.

// a simple string
$string = «This is a Hello World script» ;

// try to match the patterns Jello or Hello
if ( ! preg_match ( «/(Je|He)llo/» , $string ) ) <
echo ‘Pattern not found’ ;
> else <
echo ‘pattern found’ ;
>
?>

Хотя шаблон совпал, мы не видим какую имеено сроку мы нашли.
Для возвращения найденных результатов в preg_match добавляется третий параметр (&$matches):

// a simple string
$string = «This is a Hello World script» ;

// try to match the patterns Jello or Hello
// put the matches in a variable called matches
preg_match ( «/(Je|He)llo/» , $string , $matches ) ;

// loop through the array of matches and print them
foreach ( $matches as $key => $value ) <
echo $key . ‘->’ . $value . ‘
‘ ;
>
?>

Элемент массив $matches[0] содержит всю совпавшую подстроку (всегда), в примере — Hello.
Последующие элементы содержат последовательно вхождения субпаттернов «()».
$matches[1] совпадает с первым субпатерном. В примере — (Je|He)

Модификаторы и утверждения

Модификаторы изменяют поведения шаблонов регулярных выражений.

i — регистронезависимый (Ignore Case, case insensitive)
U — нежадный поиск (Make search ungreedy)
s — включая перевод строки (Includes New line)
m — мультистрока (Multiple lines)
x — Extended for comments and whitespace
e — Enables evaluation of replacement as PHP code. (preg_replace only)
S — Extra analysis of pattern

b — граница слова (Word Boundry)
B — НЕ граница слова (Not a word boundary)
A — начало шаблона (Start of subject)
Z — конец шаблона или разрыв строки (End of subject or newline at end)
z — конец шаблона (End of subject)
G — первая совпавшая позиция в шаблоне (First matching position in subject)
?>

Простой пример модификатора «i»

// create a string
$string = ‘abcdefghijklmnopqrstuvwxyz0123456789’ ;

// try to match our pattern
if ( preg_match ( «/^ABC/i» , $string ) ) <
echo ‘Совпадение, строка начинается с abc’ ;
> else <
echo ‘Не думаю’ ;
>
?>
?>

Использование модификатора «s»

/*** create a string with new line characters ***/
$string = ‘sex’ . » \n » . ‘at’ . » \n » . ‘noon’ . » \n » . ‘taxes’ . » \n » ;

/*** look for a match */
echo preg_match ( «/sex.at.noon/» , $string , $matches ) ;

Результат скрипта:

«.» не находит символы разрыва строки, добавим модификатор «s»
чтобы это исправить

/*** create a string with new line characters ***/
$string = ‘sex’ . » \n » . ‘at’ . » \n » . ‘noon’ . » \n » . ‘taxes’ . » \n » ;

/*** look for a match using s modifier ***/
echo preg_match ( «/sex.at.noon/s» , $string , $matches ) ;
?>
?>

Результат скрипта:
1

Разрывы строк позволяют нам использовать модификатор «m».
Это улично-магический модификатор. Он принимает строку за однострочнкую с символом разрыва на конце,
даже если в строке на самом деле больше символов разрыва (мультистрока).
Т.е. если в строке нет символов разрыва строк, этот модификатор ничего не значит.

// create a string
$string = ‘sex’ . » \n » . ‘at’ . » \n » . ‘noon’ . » \n » . ‘taxes’ . » \n » ;

// look for a match
if ( preg_match ( «/^noon/im» , $string ) ) <
echo ‘Pattern Found’ ;
> else <
echo ‘Pattern not found’ ;
>
?>

Результат скрипта:
Pattern Found

Конечно регулярное выражение найдет совпадение.
Все что следует после первого символа разрыва строки отбрасывается из-за модификатора «m».

В примере используюся вместе модификаторы «i» и «m», их действие комбинируется.

«x» модификатор позволяет составлять регулярное выражение на нескольких строках,
что повышает его читабельность и позволяет добавлять комментарии внутри шаблона.

// create a string
$string = ‘sex’ . » \n » . ‘at’ . » \n » . ‘noon’ . » \n » . ‘taxes’ . » \n » ;

// create our regex using comments and store the regex
// in a variable to be used with preg_match
$regex = ‘
/ # opening double quote
^ # caret means beginning of the string
noon # the pattern to match
/imx
‘ ;

// look for a match
if ( preg_match ( $regex , $string ) ) <
echo ‘Pattern Found’ ;
> else <
echo ‘Pattern not found’ ;
>
?>

Код в пояснениях не нуждается, он просто демонстрирует как можно вставить комментарии и
написать выражение в несколько строк.

Модификатор «e»

Спец млжификатор, который изменяет выполнение сопоставления шаблону. Ниже будет выделена целая секция для его описания.

Модификатор «S»

Этот модификатор позволяет нам проанализировать строку до сопостовления с шаблонами,
которые не помечены якорями. Т.е. если шаблон не имеет начальной фиксированой позиции, как например:

Паттерн может успорить выполение шаблона в случае с множественными совпадениями.
В следующем примере появляется множественное вхождение шаблона, поэтому добавим «S».

// match our pattern containing a special sequence
preg_match_all ( «/[ \w ]/S» , $string , $matches ) ;

// loop through the matches with foreach
foreach ( $matches [ 0 ] as $value ) <
echo $value ;
>
?>

Результат скрипта:
abcefghijklmnopqrstuvwxyz01234567890

На практике модификатор используется достаточно редко.

Модификатор границы слова (word boundary) «\b»

Граница слова создается между двух «\b» модификаторов.
Это специальный «подпирающий тип модификаторов, которые позволяют указть ТОЧНОЕ совпадение.
Текст должен совпасть только с точным шаблоном заключенным в «\b»
Например, шаблон «cat» не совпадет с «catalog».

$string = ‘eregi will not be available in PHP 6’ ;

// ищем строку «lab»
if ( preg_match ( «/ \b lab \b /i» , $string ) ) <
// Совпадение
echo $string ;
> else <
echo ‘Не думаю’ ;
>
?>

Результат скрипта:
Не думаю

Мы пытаемся найти совпадение с паттерном «lab», которое находится внутри строки в слове «available».
Из за использования границ слов, шаблон не совпал с подстрокой.
Давайте попробуем пример, не используя модификатора границ слов.

$string = ‘eregi will remain in the computer lab’ ;


// ищем строку «lab»
if ( preg_match ( «/ \b lab \b /i» , $string ) ) <
// Совпадение
echo $string ;
> else <
echo ‘Не думаю’ ;
>
?>

Результат скрипта:
eregi will remain in the computer lab

Мы видим что совпадение произошло с целым словом «lab». (\blab\b).

Модификатор \B

Этот модификатор относится к предыдущем, но \B не ставит условия гранц слова, а наоборот
отрицает границу слов. Этот модификатор полезен, когда нужно найти что-нибудь внутри
текста, который находится внутри слова, но не в самом начале или конце фразы.

$string = ‘This lathe turns wood.’ ;

// match word boundary and non-word boundary
if ( preg_match ( «/ \B the \b /» , $string ) ) <
echo ‘Совпал шаблон «the».’ ;
> else <
echo ‘Не думаю’ ;
>
?>

Результат скрипта:
>> Совпал шаблон «the».

Илон Маск рекомендует:  Что такое код udm_set_agent_param

Этот код сначала найдет паттерн «the». Потому что сначала указан модификатор «не граница слова»,
the находится внутри фразы и не снача ее, затем модификатор \b границы указывает что фраза должна
закончится на -the.

$string = ‘The quick brown fox jumps over the lazy dog.’ ;

// match word boundary and non-word boundary
if ( preg_match ( «/ \B the \b /» , $string ) ) <
echo ‘Совпал шаблон «the».’ ;
> else <
echo ‘Не думаю’ ;
>
?>

Результат скрипта:
Не думаю

В этот раз мы ничего не нашли, потому что «the» стоит на границе слова, а мы использовали модификатор \B.

Последний модификатор — \U

По умолчанию, PCRE «жадный» — это не значит что они съедят вашу печеньку,
а означает что шаблон совпадет с наибольшим возможным количеством символов,
попадающих под этот шаблон.

Чтобы отключить такую «жадность» регулярных выражений
— используем ограничитель «?», например «(.*?)»
— используем модификатор «\U».

Новичкам желательно использовать этот модификатор по-умолчанию, чтобы не возникало конфузов.

$string = ‘foobar foo—bar fubar’ ;

// try to match the pattern
if ( preg_match ( «/foo(.*)bar/U» , $string ) ) <
echo ‘Совпадение’ ;
> else <
echo ‘Не думаю’ ;
>

Результат скрипта:
Совпадение

Другой пример — дан кусок html

Попытаемся найти все ссылки выражением preg_match_all(«/.*/s», $string),
код вернет всю искомую строку вместо трех ссылок. Добавив Нежадный модификатор, все три ссылки поотдельности.

Вычисление с preg_replace

Приветствуем на сцене модификатор «e».

Этот модификатор вычисляет заменяемый аргумент.
До этого мы не рассматривали preg_replace(), поэтому быстрый пример:

$string = ‘We will replace the word foo’ ;

// заменяем `for` на `bar`
$string = preg_replace ( «/foo/» , ‘bar’ , $string ) ;

Пример заменит в строке foo на bar. В таких простых заменах целесообразнее использовать функции обработки строк
str_replace(), которые быстрее справляются с простыми задачами, но имеют некоторые ограничения, например не поддерживают юникод.

// строка с шаблонными переменными
$string = ‘This is the <_foo_>bought to you by <_bar_>‘ ;

// создади массив со значениями переменных
$templateVars = [ «FOO» => «The PHP Way» , «BAR» => «PHPro.orG» ] ;

// заменяем и вычисляем
$string = preg_replace ( «/<_(.*?)_>/ime» , » \$ templateVars[‘$1’]» , $string ) ;

Без модификатора «е» скрипты выдаст результат:
This is a $template_vars[FOO] and this is a $template_vars[BAR]

С модификатором переменные вычислятся после замены:
This is the The PHP Way bought to you by PHPro.orG

Таким образом, модификатор «e» обладает потенциалом встроенного шаблонизатора.

Заглядывание вперед (Look Aheads)

Возможность регулярных выражений «заглянуть вперед» шаблона для определения дальнейших совпадений.
«Подглядывание вперед» бывает положительное и отрицательное

Рассмотрим сначала заглядывание вперед с отрицанием. Обозначается в шаблоне символами «?!».
Полезно при поиске шаблона, стоящего впереди от совпадения, которое нам нужно.

$string = ‘I live in the whitehouse’ ;

// try to match white not followed by house
if ( preg_match ( «/white+(?!house)/i» , $string ) ) <
// if we find the word white, not followed by house
echo ‘Совпадение’ ;
> else <
echo ‘Не думаю’ ;
>
?>

Результат скрипта:
No match is found

Потому что слово «white» следует за словом «house».
Подадим блюдо под другим соусом:

$string = ‘I live in the white house’ ;

// try to match white not followed by house
if ( preg_match ( «/white+(?!house)/i» , $string ) ) <
// if we find the word white, not followed by house
echo ‘Совпадение’ ;
> else <
echo ‘Не думаю’ ;
>
?>

Результат скрипта:
Совпадение

Есть совпадение, потому что слово «white» не следует сразу же за словом «house» (как в «whitehouse»)

Позитивное/положительное заглядывание вперед «?=»

$string = ‘This is an example eg: foo’ ;

// try to match eg followed by a colon
if ( preg_match ( «/eg+(?=:)/» , $string , $match ) ) <
print_r ( $match ) ;
> else <
echo ‘Нет совпадений’ ;
>
?>

Результат скрипта:
Array < [0]=>‘eg’ >

Код ищет паттерн «eg», стоящий перед «:» двоеточием.
Но что если нам нужно найти что-то до двоеточия, например дом из предудыщего примера.
Для этого на помощь приходят «заглядывания назад».

Заглядывание назад (Look Behinds)

Позволяет просмотреть строку назад и определить наличие совпадений с шаблоном.
Также разделяется на положительное и отрицательное.
Положительное — записывается «?

$string = ‘I live in the whitehouse’ ;

// try to match house preceded by white
if ( preg_match ( «/(? , $string ) ) <
// if we find the word white, not followed by house
echo ‘Совпадение’ ;
> else <
echo ‘Не думаю’ ;
>
?>

Результат скрипта:
Совпадение

Здесь мы нашли совпадение, потому что паттерн «house» сразу следует за паттерном «house».
Движок регулярных выражений «посмотрел назад» шаблона «house» и определил совпадение.

Если мы хотим, чтобы «house» НЕ следовал за словом «white»?
Используем отрицительное заглядывание назад — «?

/*** a simple string ***/
$string = ‘I live in the whitehouse’ ;

/*** try to match house preceded by white ***/
if ( preg_match ( «/(? , $string ) )
<
/*** if we find the word white, not followed by house ***/
echo ‘Совпадение’ ;
>
else
<
/*** if no match is found ***/
echo ‘Не думаю’ ;
>
?>

Результат скрипта:
no match is found

Потому что отрицательное заглядывание не нашло шаблона «house» c шаблоном «white» в начале его.
Давайте поменяем цвет «дома», белым слишком девственный для правительственного здания.

$string = ‘I live in the bluehouse’ ;

// ищем `house` с непредшествующим `white`
if ( preg_match ( «/(? , $string ) ) <
/*** if we find the word white, not followed by house ***/
echo ‘Совпадение’ ;
> else <
/*** if no match is found ***/
echo ‘Не думаю’ ;
>
?>

Мы изменили «whitehouse» на «bluehouse» и теперь наша регулярка сработала, потому что
шаблон «white» не обнаружен перед «house».

По-умолчанию регулярки жадные, это значит что квантификаторы (какое слово страшное)
*, +, ? «пожирают» столько символов сколько могут.

/*** 4 x and 4 z chars ***/
$string = «xxxxzzzz» ;

/*** greedy regex ***/
preg_match ( «/^(.*)(z+)$/» , $string , $matches ) ;

/*** results ***/
echo $matches [ 1 ] ;
echo «
» ;
echo $matches [ 2 ] ;
?>

Первый паттерн (.*) совпал со всеми четыремя «x» и тремя из четырех символов «z».
Сработала жадность — шаблон забрал столько символов, сколько было в искомой строке.
Проще простого помочь перестать квантификаторам быть жадными, добавив «?» к квантификатору как в примере:

/*** string of characters ***/
$string = «xxxxzzzz» ;

/*** a non greedy match ***/
preg_match ( «/^(.*?)(z+)$/» , $string , $matches ) ;

/*** show the matches ***/
echo $matches [ 1 ] ;
echo «
» ;
echo $matches [ 2 ] ;
?>

Теперь $matches[1] содержит четыре «x» символа и $matches[2] четыре символа «z».
Потому что квантификатор «?» изменил поведение шаблона с «взять как можно БОЛЬШЕ» на «взять как можно МЕНЬШЕ».

Чтобы сделать нежадным весь шаблон, используем модификатор «U».


/*** string of characters ***/
$string = «xxxxzzzz» ;

/*** a non greedy match ***/
preg_match ( «/^(.*)(z+)$/U» , $string , $matches ) ;

/*** show the matches ***/
echo $matches [ 1 ] ;
echo «
» ;
echo $matches [ 2 ] ;
?>

Результат как в предыдущем примере.

Подводные камни c ? и U

Важно заметить, что модификатор «U» не только делает поиск нежадным, он инвертирует поведение жадности квантификатора «?».
Если использовался квантификатор «?» и одновременно модификатор «U», действие «?» будет инвертировано.

/*** string of characters ***/
$string = «xxxxzzzz» ;

/*** a non greedy match ***/
preg_match ( «/^(.*?)(z+)$/U» , $string , $matches ) ;

/*** show the matches ***/
echo $matches [ 1 ] ;
echo «
» ;
echo $matches [ 2 ] ;
?>

Результат скрипта:
xxxxzzz
Delimiters

В этом мане было рассмотрено много регулярок и все они разделялись слэшем «/».
Иногда нам нужно находить в шаблоне слэш и когда он одновременно является разделителем регуляного выражения,
нам придется экранировать каждый встречающийся слэш, что неудобно.

Поэтому в качестве разделителя можно взять любой символ, например #, @, ^ и т.п.

/*** get the host name from a url ***/
preg_match ( ‘#^(?:http://)?([^/]+)#i’ , «http://www.phpro.org/tutorials» , $matches ) ;

/*** show the host name ***/
echo $matches [ 1 ] ;
?>

Примеры

// the string to match against
$string = ‘The cat sat on the mat’ ;

// match the beginning of the string
echo preg_match ( «/^The/» , $string ) ;

// match the end of the string
// returns 1
echo preg_match ( «/mat \z /» , $string ) ;

// match anywhere in the string
// returns 0 as no match was found for dog.
echo preg_match ( «/dog/» , $string ) ;
?>

Поиск нескольких шаблонов

// the string to match against
$string = ‘The cat sat on the matthew’ ;

// matches the letter «a» followed by zero or more «t» characters
echo preg_match ( «/at*/» , $string ) ;

// matches the letter «a» followed by a «t» character that may or may not be present
echo preg_match ( «/at?/» , $string ) ;

// matches the letter «a» followed by one or more «t» characters
echo preg_match ( «/at+/» , $string ) ;

// matches a possible letter «e» followed by one of more «w» characters anchored to the end of the string
echo preg_match ( «/e?w+ \z /» , $string ) ;

// matches the letter «a» followed by exactly two «t» characters
echo preg_match ( «/at<2>/» , $string ) ;

// matches a possible letter «e» followed by exactly two «t» characters
echo preg_match ( «/e?t<2>/» , $string ) ;

// matches a possible letter «a» followed by exactly 2 to 6 «t» chars (att attt atttttt)
echo preg_match ( «/at<2,6>/» , $string ) ;

Запомните, preg_match() возвращает только 0 или 1, и останавливается после первого успешного нахождения шаблона.

Чтобы найти все совпадения — используйте preg_match_all().

Чит Шит

\w — Any “word” character (a-z 0-9 _)
\W — Any non “word” character
\s — Whitespace (space, tab CRLF)
\S — Any non whitepsace character
\d — Digits (0-9)
\D — Any non digit character
. — (Period) – Any character except newline

^ — Start of subject (or line in multiline mode)
$ — End of subject (or line in multiline mode)
[ — Start character class definition
] — End character class definition
| — Alternates, eg (a|b) matches a or b
( — Start subpattern
) — End subpattern
\ — Escape character

n- Zero or more of n
n+ — One or more of n
n? — Zero or one occurrences of n
— n occurrences exactly
— At least n occurrences
— Between n and m occurrences (inclusive)

i — Case Insensitive
m — Multiline mode — ^ and $ match start and end of lines
s — Dotall — . class includes newline
x — Extended– comments and whitespace
e — preg_replace only – enables evaluation of replacement as PHP code
S — Extra analysis of pattern
U — Pattern is ungreedy
u — Pattern is treated as UTF-8

\b — Word boundary
\B — Not a word boundary
\A — Start of subject
\Z — End of subject or newline at end
\z — End of subject
\G — First matching position in subject

(?=) — Positive look ahead assertion foo(?=bar) matches foo when followed by bar
(?!) — Negative look ahead assertion foo(?!bar) matches foo when not followed by bar
(? ) — Once-only subpatterns (?>\d+)bar Performance enhancing when bar not present
(?(x)) — Conditional subpatterns
(?(3)foo|fu)bar — Matches foo if 3rd subpattern has matched, fu if not
(?#) — Comment (?# Pattern does x y or z)

Дополнения от меня

Posix символьные классы

Дополнительные шорткуты для шаблонов. Могут применяться только внутри классов.
Пример для поиска числа с пробелами — preg_match(«@[[:space:]\d]+@», $string)

Внутренние модификаторы шаблонов

Модификаторы m, s, x, U, X, J могут использоваться внутри шаблона.
Например (?im) установит мультистроковой регистронезивисимый метод поиска для паттерна.
Отключить внутренние модификаторы можно перечислив их через дефис, например (?im-sx)

Пример:
шаблон (?i:foo) совпадет с «FoO»

Именованный «захват»

Возможность регулярных выражений именовать ключи в результирующем массиве совпадений.

Записывается: (? ), (?’name’) или (?P ).
Раньше поддерживался только такой синтаксис: (?P ). [

preg_match ( ‘/Name: (.+), Age: ( \d +)/’ , $text , $matches ) ;
preg_match ( ‘/Name: (?P .+), Age: (?P \d +)/’ , $text , $matches ) ;
?>

Результат скрипта:
array(‘Name’ => ‘строка’, ‘Age’ => ‘число’)

Замена через callback-функцию

В php есть возможность указать функцию обратного вызова
для совпадений, если нам нужно проделать с ними необычные вещи.
Для этого используется preg_replace_callback.

\s * \w |’ ,
create_function (
‘$matches’ ,
‘return strtoupper($matches[0]);’
) ,
$line
) ;
?>

Данный код заменит все первые буквы в параграфах на заглавные.

В php >= 5.3 callback-функцию можно записать в сокращенном виде

\s * \w |’ ,
function ( $matches ) <
return strtoupper ( $matches [ 0 ] ) ;
> ,
$line
) ;
?>

Pattern Modifiers

The current possible PCRE modifiers are listed below. The names in parentheses refer to internal PCRE names for these modifiers. Spaces and newlines are ignored in modifiers, other characters cause error.

i (PCRE_CASELESS) If this modifier is set, letters in the pattern match both upper and lower case letters. m (PCRE_MULTILINE) By default, PCRE treats the subject string as consisting of a single «line» of characters (even if it actually contains several newlines). The «start of line» metacharacter (^) matches only at the start of the string, while the «end of line» metacharacter ($) matches only at the end of the string, or before a terminating newline (unless D modifier is set). This is the same as Perl. When this modifier is set, the «start of line» and «end of line» constructs match immediately following or immediately before any newline in the subject string, respectively, as well as at the very start and end. This is equivalent to Perl’s /m modifier. If there are no «\n» characters in a subject string, or no occurrences of ^ or $ in a pattern, setting this modifier has no effect. s (PCRE_DOTALL) If this modifier is set, a dot metacharacter in the pattern matches all characters, including newlines. Without it, newlines are excluded. This modifier is equivalent to Perl’s /s modifier. A negative class such as [^a] always matches a newline character, independent of the setting of this modifier. x (PCRE_EXTENDED) If this modifier is set, whitespace data characters in the pattern are totally ignored except when escaped or inside a character class, and characters between an unescaped # outside a character class and the next newline character, inclusive, are also ignored. This is equivalent to Perl’s /x modifier, and makes it possible to include commentary inside complicated patterns. Note, however, that this applies only to data characters. Whitespace characters may never appear within special character sequences in a pattern, for example within the sequence (?( which introduces a conditional subpattern. e (PREG_REPLACE_EVAL)

This feature was DEPRECATED in PHP 5.5.0, and REMOVED as of PHP 7.0.0.

The addslashes() function is run on each matched backreference before the substitution takes place. As such, when the backreference is used as a quoted string, escaped characters will be converted to literals. However, characters which are escaped, which would normally not be converted, will retain their slashes. This makes use of this modifier very complicated.

Make sure that replacement constitutes a val >preg_replace() .

Use of this modifier is discouraged, as it can easily introduce security vulnerabilities:

// uppercase headings
$html = preg_replace (
‘( (.*?) )e’ ,
‘» » . strtoupper(«$2″) . » «‘ ,
$html
);

The above example code can be easily exploited by passing in a string such as

To prevent this kind of remote code execution vulnerability the preg_replace_callback() function should be used instead:

// uppercase headings
$html = preg_replace_callback (
‘( (.*?) )’ ,
function ( $m ) <
return » $m [ 1 ] >» . strtoupper ( $m [ 2 ]) . » $m [ 1 ] >» ;
>,
$html
);

Only preg_replace() uses this modifier; it is ignored by other PCRE functions.

It is usually not possible to match more than pcre.backtrack_limit characters in ungreedy mode.

X (PCRE_EXTRA) This modifier turns on additional functionality of PCRE that is incompatible with Perl. Any backslash in a pattern that is followed by a letter that has no special meaning causes an error, thus reserving these combinations for future expansion. By default, as in Perl, a backslash followed by a letter with no special meaning is treated as a literal. There are at present no other features controlled by this modifier. J (PCRE_INFO_JCHANGED) The (?J) internal option setting changes the local PCRE_DUPNAMES option. Allow duplicate names for subpatterns. As of PHP 7.2.0 J is supported as modifier as well. u (PCRE_UTF8) This modifier turns on additional functionality of PCRE that is incompatible with Perl. Pattern and subject strings are treated as UTF-8. An invalid subject will cause the preg_* function to match nothing; an invalid pattern will trigger an error of level E_WARNING. Five and six octet UTF-8 sequences are regarded as invalid since PHP 5.3.4 (resp. PCRE 7.3 2007-08-28); formerly those have been regarded as valid UTF-8.

User Contributed Notes 11 notes

Regarding the validity of a UTF-8 string when using the /u pattern modifier, some things to be aware of;

1. If the pattern itself contains an invalid UTF-8 character, you get an error (as mentioned in the docs above — «UTF-8 validity of the pattern is checked since PHP 4.3.5»

2. When the subject string contains invalid UTF-8 sequences / codepoints, it basically result in a «quiet death» for the preg_* functions, where nothing is matched but without indication that the string is invalid UTF-8

3. PCRE regards five and six octet UTF-8 character sequences as valid (both in patterns and the subject string) but these are not supported in Unicode ( see section 5.9 «Character Encoding» of the «Secure Programming for Linux and Unix HOWTO» — can be found at http://www.tldp.org/ and other places )

4. For an example algorithm in PHP which tests the validity of a UTF-8 string (and discards five / six octet sequences) head to: http://hsivonen.iki.fi/php-utf8/

The following script should give you an idea of what works and what doesn’t;


= array(
‘Valid ASCII’ => «a» ,
‘Valid 2 Octet Sequence’ => «\xc3\xb1» ,
‘Invalid 2 Octet Sequence’ => «\xc3\x28» ,
‘Invalid Sequence Identifier’ => «\xa0\xa1» ,
‘Valid 3 Octet Sequence’ => «\xe2\x82\xa1» ,
‘Invalid 3 Octet Sequence (in 2nd Octet)’ => «\xe2\x28\xa1» ,
‘Invalid 3 Octet Sequence (in 3rd Octet)’ => «\xe2\x82\x28» ,

‘Valid 4 Octet Sequence’ => «\xf0\x90\x8c\xbc» ,
‘Invalid 4 Octet Sequence (in 2nd Octet)’ => «\xf0\x28\x8c\xbc» ,
‘Invalid 4 Octet Sequence (in 3rd Octet)’ => «\xf0\x90\x28\xbc» ,
‘Invalid 4 Octet Sequence (in 4th Octet)’ => «\xf0\x28\x8c\x28» ,
‘Valid 5 Octet Sequence (but not Unicode!)’ => «\xf8\xa1\xa1\xa1\xa1» ,
‘Valid 6 Octet Sequence (but not Unicode!)’ => «\xfc\xa1\xa1\xa1\xa1\xa1» ,
);

echo «++Invalid UTF-8 in pattern\n» ;
foreach ( $examples as $name => $str ) <
echo » $name \n» ;
preg_match ( «/» . $str . «/u» , ‘Testing’ );
>

echo «++ preg_match() examples\n» ;
foreach ( $examples as $name => $str ) <

preg_match ( «/\xf8\xa1\xa1\xa1\xa1/u» , $str , $ar );
echo » $name : » ;

if ( count ( $ar ) == 0 ) <
echo «Matched nothing!\n» ;
> else <
echo «Matched < $ar [ 0 ]>\n» ;
>

echo «++ preg_match_all() examples\n» ;
foreach ( $examples as $name => $str ) <
preg_match_all ( ‘/./u’ , $str , $ar );
echo » $name : » ;

$num_utf8_chars = count ( $ar [ 0 ]);
if ( $num_utf8_chars == 0 ) <
echo «Matched nothing!\n» ;
> else <
echo «Matched $num_utf8_chars character\n» ;
>

Прототипирование на продакшн-технологиях

В Яндекс.Деньгах мы сделали БЭМ-платформу основным инструментом дизайнеров для построения интерфейсов, дополнив ее всем необходимым арсеналом для масштабирования.

Недостающее звено, или Предпосылки для прототипов

Обостренная необходимость в прототипах

Осмысленный и кастомизируемый UI

В Яндекс.Деньгах мы руководствуемся простой идеей, что UI должен легко и быстро генерироваться под нужную структуру по заданным параметрам, поэтому для создания масштабируемых и кастомных интерфейсов мы внедрили прототипирование в дизайн-процесс. Для прототипов мы используем БЭМ-технологии, переиспользуем разработческую библиотеку блоков и визуализируем интерфейсные решения, опираясь на конструкции паттернов, в основе которых лежат «живые стайл-гайды» (CSS стайл-гайды).

В соответствии с этим макеты нельзя воспринимать как законченное дизайн-решение. Это скорей черновые наброски: если они и делаются, то лишь для быстрого «поиска» новых визуальных решений. Их впоследствии нужно приземлять на браузерные технологии, иначе интерфейс потеряет свою ценность, как только появятся первые намеки на изменение визуала или сценариев взаимодействия.

Макет провоцирует на бомбардировку вопросами со стороны разработки и заказчиков, ведь по нему не всегда понятно, как это должно работать и как лучше реализовать. К тому же макет принято оценивать как кропотливый результат дизайнерской работы.

В то время как сверстанный прототип — это просто итерация, в результате которой мы получаем UI определенной версии на основе определенных параметров. Плюс интерфейс становится восприимчив к изменениям на лету и рассказывает про себя сам.

Тестирование на раннем этапе

Тестирование — еще одна из многих причин реализации прототипов. При разработке продукта есть острая необходимость получить интерфейс, близкий к реальному, на самых ранних этапах.
Это нужно для внутреннего тестирования: чтобы обкатать первую концепцию, допиливая ее и пробуя различные связки. И для внешнего: чтобы проверить первоначальные гипотезы на пользователях, подсовывая им разные ветки сценариев.

Посылка от разработчиков, или Что под капотом у Brickbox

БЭМ-технологии в дизайне

Нельзя сказать, что вначале мы делаем визуал, а потом дробим его на блоки и элементы в различных модификациях. На деле мы не подстраиваемся искусственно под БЭМ. Это скорей естественная, фундаментальная часть нашего дизайн-процесса.

Мы по умолчанию думаем в этих терминах, описываем смысловую структуру блока, затем преобразуем (стилизуем) ee в наглядный вид. Поэтому при прототипировании используется практически тот же стек технологий, что и при разработке. В нем мы чувствуем себя естественно и органично.

Внешние библиотеки и уровни дизайна

Все собрано в один stub Brickbox, который может развернуть у себя любой участник команды (не обязательно дизайнер) и начать прототипировать. Это позволяет описывать структуру страниц в терминах компонентов (BEMJSON) и смотреть результат в браузере. Вся магия по сборке происходит «под капотом».

В Brickbox подтягиваются все необходимые библиотеки:

  • Yamoney Guidlines — фундаментальный уровень (отступы, цвета, типографика, графика и так далее);
  • LEGO — общеяндексовая библиотека компонентов (расширенный аналог bem-components);
  • Yamoney-bem-components — библиотека блоков Яндекс.Денег (готовые блоки для отображения банковских карт, инпуты с цифрами и другая специфичная информация).

От прототипов к дизайн-системе

Зачистка

Несмотря на то, что дизайн-система должна быть не сводом правил, а естественным подспорьем при прототипировании, без наведения первоначального порядка не обошлось. Нужно было исключить инстинктивные решения, которые делали всю систему уязвимой.

Илон Маск рекомендует:  Как создавать интерфейс программы

Для того чтобы не расползтись стилистически при синхронной работе, мы отстрелили вкусовщину и причесали базовые значения, на которых будет основываться UI.

Мы отобрали минимальный набор необходимых параметров, но при этом не скатились в примитив. Сконцентрировались на возможных состояниях и на правилах соотношения блоков между собой и убрали инстинктивные значения, которые были сделаны на глаз. Затем зафиксированный результат перевели в код.

Визуальный язык в коде

Вычисление цвета

Для того чтобы цвета разных интерфейсных сущностей (блоков, компонентов, типографики) не существовали в вакууме, их значения наследуются от базовых цветов.

Дальнейшие манипуляции с цветами проводятся через Hue/Saturation/Lightness. Оттенки серого задаются с прозрачностью от чёрного (это дает больше гибкости при изменении заднего фона блоков).

Названия цветовых переменных не приклеиваются к конкретным значениям, а учитывают интерфейсные состояния блоков и типографики. В переменные вынесены все возможные состояния, этого хватает для того, чтобы покрыть основные интерфейсные потребности.

Цветовые переменные сделаны по следующему принципу:

  • основная цветовая палитра проекта задаётся в виде переменных;
  • из переменных генерируются конкретные цветовые значения.
    При генерации заложены вычисления, которые опираются на интерфейсные правила. Они служат своего рода «защитой от дурака» и минимизируют появление лишних цветов.

На практике в стилях любого блока ни один цвет не пишется руками, используются только переменные. Это делает блок по умолчанию кастомным и готовым к изменениям.

Структура сложных компонентов

Отступы используются не только для визуального ритма, а в большей степени для обозначения уровней вложенности и разделения смысловых блоков и элементов. Также система отступов подчеркивает информационную иерархию.

Типографика, или Как покрыть значительную часть визуала

Текст — фундамент практически любой визуальной сущности. Поэтому для ускорения прототипирования и более легкой манипуляции внешним видом блоков любой текст в интерфейсе выводится в блоке text. Мы вынесли блок text с модификаторами для цвета, размера, регистра, жирности, межбуквенного интервала. Их можно использовать в различных комбинациях. В итоге мы получаем все необходимые вариации текста при помощи небольшого количества комбинаций.

В интерфейсе встречается типографика двух типов:

  • текст внутри интерфейсных блоков;
  • самодостаточные текстовые блоки (на текстовых страницах).

В первом случае мы ко всем текстовым элементам примиксовываем блок text (добавляется класс текстового блока) с нужными модификаторами.

Во втором — к текстовым блокам добавляем еще один модификатор —type. (с учетом семантики), для которого прописаны относительные отступы (они высчитываются с учетом заложенных типографических правил для удобного восприятия текста).

Графика

Вся интерфейсная графика разделяется на три типа:

Для использования в интерфейсе любой графической сущности достаточно указать название блока и необходимые модификации.

Вынесение графики в БЭМ-блоки и использование их в интерфейсе позволяет безболезненно и легко экспериментировать с различными библиотеками, просто заменяя SVG-файлы, и мгновенно наблюдать их новое отображение в интерфейсных сущностях.

Паттерны

Вырезаем дублирование стилей

После того как разобрались с базовым параметрами интерфейсных сущностей (цветами отступами, текстом и графикой), самое время задуматься о принципах визуализации — о том, как превратить структуру блока в осмысленную форму. Компонентность, конечно же, дело привычное, но описывать стили каждого нового блока, игнорируя закономерности, становится трудозатратно, а полная изоляция хороша ровно до того момента, пока не началась кастомизация.

Для решения этой задачи у нас появляется фундаментальный уровень — паттерн.

Качественный UI по умолчанию, или Как не думать о стилях

Паттерн — это конструкция с возможными модификациями, которая примиксовывается к блоку и его элементам и определяет его визуальную структуру. Использование паттернов позволяет ускорить (и даже автоматизировать) процесс визуализации. Паттерны с каждым новым прототипом обрастают правилами, по которым генерируются схожие сущности.

Пример блоков на основе паттернов.

70% из коробки, или Как наследовать внешний вид

Все бесконечное многообразие окружающих нас интерфейсных множеств сводится к числу понятных/базовых/фундаментальных конструкций, на основе которых можно получить практически любой визуал (приемлемый для веба).

Сейчас библиотека состоит из восьми основных паттернов:

  • списки;
  • формы;
  • таблицы;
  • карточки;
  • секции с гибким контентом;
  • диалоговые блоки;
  • бэйджи;
  • конфигурации «иконка или изображение + текст».

Этот список расширяется.

Декоратор

Локальная инъекция, или Как победить избыток классов

При прототипировании не всегда нужно строить фабрику блоков, иногда достаточно просто примерить визуал на структуру.

Декоратор выполняет роль контролируемых (ограниченных) инлайн-стилей, относительно которых еще нет понимания по классификации.

  • внешние отступы;
  • внутренние отступы;
  • представление.

Он не несет логического смысла. Это больше косметика, которая нужна для визуальной «подпорки». Декоратор помогает понять, какие локальные стили чаще всего используются, и в каких конструкциях. Вдобавок декораторы являются индикаторами для переноса свойств в модификаторы паттернов.


Сборка интерфейса

UI как комбинация параметров, или Закономерность наслаивания смысла

Блок в дизайнерском понимании — это составная сущность, которая может содержать в себе блоки из других библиотек, основываться на каких-либо формах и иметь собственные уникальные стили.

Глобально у блока есть содержимое и представление.

Содержимое:

Представление:

Всё базируется на переменных. У переменных могут быть разные значения, которые в совокупности дают новую тему. Процесс визуализации проходит следующим образом:

1 шаг: в BEMJSON описывается основная структура блока;
2 шаг: контролы берутся из внутренней библиотеки компонентов Lego;
3 шаг: любая графика, кроме контентной, берётся из дизайнерской библиотеки;
4 шаг: к узлам блока миксуется паттерн;
5 шаг: дописываются уникальные стили.

Если уникальные стили начинают повторятся, они выносятся на уровень паттернов. Через несколько итераций паттерн начинает покрывать большинство визуальных потребностей, а в стилях самого блока (на уровне CSS) описываются только косметические особенности.

Процесс визуализации блока.

«Околодизайна», или Бытовуха вокруг нового процесса

Вход в дизайн-систему

Адаптация новых участников и Что делать с неизбежно растущим порогом входа

Без малейшего преувеличения, технологии сильно помогают поднять дизайн-процесс на новый уровень, при условии, что они естественны для дизайнера и не блокируют выполнение задач.

Поэтому новый участник может оперировать высокоуровневыми понятиями или конструкциями для визуализации своего интерфейса, постепенно погружаясь в тонкости. Таким образом, решение любой визуальной задачи становится просто очередной итерацией на основе новых параметров.

Точечное внедрение

По сути нужно выделить несколько инициативных участников, которые сделают всю фундаментальную работу, затем проходить по проектам и сводить все бесконечное многообразие интерфейсных множеств к числу понятных/базовых/фундаментальных конструкций.

Дальше порционно (по мере готовности) добавлять дизайнеров для последующего масштабирования.

Внутренняя экспансия

Как перевернуть игру, или Интеграция в бизнес-процесс

Дизайн — самая несистемная часть процесса, поэтому ее хоть как-то хотят контролировать люди со стороны (менеджеры, владельцы бизнеса и другие люди, отвечающие за сроки).

Под какой бы оболочкой ни продавались дизайн-спринты, это не дизайнерский инструмент, а больше менеджерская уловка, с помощью которой есть возможность более или менее равномерно вытаскивать из дизайнеров результат (какой бы он ни был).

Пока механизмы не выстроены, вы будете играть по тем правилам, которые придумали за вас. Развлекаясь со спринтами, перекладывая листочки с одного края доски на другой и измеряя результат своей работы количеством отрисованных макетов.

Но на самом деле людей успокаивает не тотальный контроль, а системность и предсказуемость. Соответственно, при разработке продукта дизайнер может работать эффективно только после того, как сделает прозрачным процесс своей работы и, при необходимости, сможет погрузить в него любого участника команды (включая менеджеров).

Открытый доступ для всех участников проекта к дизайн-материалам, в которых показывается вся инженерная красота конструкций, включающая в себя составные части и правила, по которым визуализируется интерфейс, здорово помогает в принятии тяжелых решений на любых этапах.

В конечном счете всё направлено к банальному сокращение издержек, увеличению скорости и к стремлению сделать дизайн-процесс открытым и быстрым. Так как зачастую в тот момент, когда вы ввязались в обсуждение новой задачи с внутренним «заказчиком», как правило, вы уже отстаете от сроков. К сожалению, такова реальность, которую нужно менять. Соответственно, для балансировки процесса нет другого варианта, кроме как забирать инициативу на сторону дизайна и выдавать концепты на опережение, по возможности — частично или полностью заготавливая решения заранее.

В процессе решения всех этих вопросов у нас естественным образом появляется дизайн-среда, которая с одной стороны использует коллективный опыт, а с другой — позволяет точечно себя модифицировать под решение конкретных задач и сценариев, оставляя зазор для экспериментов.

С каждым прототипом растет число смысловых и визуальных зависимостей, что в дальнейшем позволяет реализовывать более умные и осмысленные дизайн-решения. У прототипа нет конечной точки и то, что мы видим в продакшене, это состояние, которое замораживается и отправляется в разработку.

По сути мы стремимся к максимально автоматизированной генерации интерфейса, и дизайн-система способствует этому, сильно сокращая рутину, но тем не менее мы оставляем возможность подкрутить все руками, полностью контролируя весь машинный процесс.

Дальнейший вектор

Мы поймали тот вектор, который позволяет эффективно прорабатывать визуальную часть проектов. И в дальнейшем будем бить в два направления.

Во-первых, будут вычленяться принципы и библиотеки, которые можно использовать как дизайн-фундамент для реализации различного типа проектов.

Во-вторых, будет продолжаться непрерывный процесс более плотной оптимизации дизайн-системы под конкретные проекты, с фиксированием всех особенностей и закономерностей, которые можно систематизировать и переиспользовать.

Что касается экспансии и опенсорса, то этот вектор нам интересен. А если говорить начистоту, то мы считаем, что просто эгоистично держать внутри весь опыт и нет причин не делиться лучшими практиками, помогающими системно решать дизайн-задачи любого уровня.

Модификаторы

Модификаторы

SIMAI Framework создан как инструмент позволяющий облегчить работу веб-мастеров с интерфейсом сайта. Он содержит большое количество модификаторов позволяющих изменять различные свойства элементов. Для того чтобы орентировться в таком большом количестве вариантов используется правило единообразия, при котором зная как работает один модификатор, вы с легкостью сможете разобраться как работают и другие.

Сокращения

В SIMAI Framework используются следующие сокращения модификаторов:

  • .a — модификаторы абсолютного положения (absolute);
  • .b — модификаторы границ (border);
  • .bg — модификаторы фона (background);
  • .с — модификаторы цвета текста (color);
  • .d — модификаторы отображения (display);
  • .f — модификаторы заливки SVG объектов (fill);
  • .h — модификаторы высоты объекта (height);
  • .l — модификаторы ссылок (link);
  • .m — модификаторы внешнего отступа (margin);
  • .o — модификаторы прозрачности (opacity);
  • .p — модификаторы внутреннего отступа (padding);
  • .s — модификаторы цвета линий SVG объектов (stroke);
  • .t — текстовые модификаторы (typography);
  • .w — модификаторы ширины (width).

Если модификатор действует только для какой либо сторон элемента (отступы, границы) то к базовому сокращению добавляется обозначение стороны:

  • l — левая сторона (left);
  • r — правая сторона (right);
  • t — верхняя сторона (top);
  • b — нижняя сторона (bottom);
  • x — по горизонтали (ось X).
  • y — по вертикали (ось Y);

Например: pl-1 , pr-1 , px-1 .

Если модификатор имеет несколько единиц измерения (высота), то к базовму сокращению добавляется обозначение единицы измерения:

  • v — видимая область экрана (visible);

Значения

Значения модификаторов задаются через тире — . Они могут быть числовыми, текстовыми и комбинированного типа. Числовые значения, как правило, указывают уровень изменения, а не абсолютное значение. Основой для расчета уровней изменения служит базовый размер шрифта html (rem). Уровни изменения различных модификаторов подобраны так, чтобы хорошо сочетаться при совместном использовании.

Уровни размера текста:

  • -3 – 0.625rem
  • -2 – 0.75rem
  • -1 – 0.875rem
  • 0 – 1rem (размер шрифта html)
  • 1 – 1.25rem
  • 2 – 1.5rem
  • 3 – 2rem
  • 4 – 2.5rem
  • 5 – 3rem
  • 6 – 4rem
  • 7 – 6rem

Уровни размера текста могут использоваться для всех элементов которые содержат в себе текст. Надо иметь ввиду что отрицательные значения содержат два знака тире после названия модификатора. Так, например, отрицательное значение размера текста будет выглядеть так t—2 , что означает 2-й уровень уменьшения относительно базового размера шрифта.

Соотношение размеров в модификаторах:

Размер 0.25rem 0.5rem 1rem 2rem 4rem 8rem 16rem 32rem 48rem 64rem
Margin .m-0 .m-1 .m-2 .m-3 .m-4 .m-5 .m-6 .m-7
Padding .p-0 .p-1 .p-2 .p-3 .p-4 .p-5 .p-6 .p-7
Width REM .wr-1 .wr-2 .wr-3 .wr-4 .wr-5 .wr-6 .wr-7 .wr-8
Height REM .hr-1 .hr-2 .hr-3 .hr-4 .hr-5 .hr-6

Уровни размеров и расстояний используются для модификаторов внутреннего и внешнего отступа, ширины и высоты заданной в rem.

Текстовые значения подобраны таким образом чтобы максимально соотвествовать названию свойства элемента в CSS. Так например модификатор делающий текст жирным будет .t-bold .

Комбинированные значения используются для указания вариации текущего значения (цвет) или для указания изменения типа значения (высота ширина). Так, например, если базовый красный цвет обозначается как .c-red , то его оттенок 50 будет иметь обозначение .c-red-50 .

Контрольные точки

SIMAI Framework разработан по технологии «Mobile First» (сначала мобильные) и включает в себя возможности указания классов для различных размеров экрана. Контрольные точки действуют на следующих размерах экрана:

  • Без параметра — действует по умолчанию на всех размерах экрана.
  • -sm — действует на экранах шириной 576 пикселей и выше.
  • -md — действует на экранах шириной 768 пикселей и выше.
  • -lg — действует на экранах шириной 992 пикселей и выше.
  • -xl — действует на экранах шириной 1200 пикселей и выше.

Адаптивные модификаторы

В SIMAI Framework включено множество адаптивных модификаторов, позволяющих изменять различные параметров элементов. Данные модификаторы обозначены значком адаптивный .

При использовании адаптивных модификаторов, рекомендуется придерживаться правила «сначала мобильные». Когда указываете модификаторы задавайте их по мере роста экрана: без контрольной точки, -sm, -md, -lg, -xl. Также следует иметь ввиду что максимально большой параметр будет распространятся на экраны большего порядка, если не задано иное:

  • Без параметра — действует на всех размерах экрана.
  • -sm — действует на устройствах -sm, -md, -lg, -xl.
  • -md — действует на устройствах -md, -lg, -xl.
  • -lg — действует на устройствах -lg, -xl.
  • -xl — действует на устройствах -xl.

Например: p-1 , p-sm-1 , p-md-1 , p-xl-1 .

Как видим адаптивные модификаторы действуют на указанную ширину экрана и выше. Поэтому, если вы используете модификаторы -sm, -md, -lg, -xl, рекомендуется также задать и значение базового модификатора без контрольной точки. Это позволит облегчить восприятие изменения свойств элемента при различных разрешениях экрана.

Модификаторы

Модификаторы имеют большую роль в общем своде правил MCSS, но так же применимы и к другим методологиям, из за чего вынесены в отдельный независимый модуль документации.

Основное предназначение модификатора — дополнять базовые стили и функционал сущности, расширяя или частично переопределяя его особенности.

Модификатор не должен переопределять большую часть базового набора функционала сущности, при возникновении такой ситуации стоит пересмотреть присвоенную роль сущности и принять решение упростить или вынести в самостоятельную единицу (модуль, блок).

Определение модификатора


Представление модификатора обязательно должно определять связь с модифицируемым элементом. Модификатор, без модифицируемого элемента не может существовать в принципе. Связь можно осуществить как вложенностью на файловой системе, так и определением связного ключевого слова:

Что бы наглядно отделить модификатор от других элементов, используется особое правило именования, определяющее специальный разделитель, используемый только в названиях модификаторов — “__“ (двойное подчеркивание).

Подробней почитать о правилах именования и о ключевом слове можно в отдельном модуле отдельном модуле.

В CSS/HTML

Именование

В первой версии синтаксиса MCSS использовалась такая запись модификатора:

С отбросом поддержки IE6 появилась возможность описывать модификатор в более читабельном виде, относительно HTML.

Наглядные пример удобства второго подхода:

Чем больше модификаторов, тем больше пользы от нового типа записи:

Стоит заметить, что во втором варианте незначительно увеличивается каскадность селекторов. Такое уменьшение производительности минимально и в случае редкого использования фактически не повлияет на общую скорость загрузки, к тому же, по обратную сторону фронтенда итоговый документ становится легче.

Расположение

Говоря о расположении в HTML, главное правило — определять модификатор максимально выше в сущности. Чем выше определен модификатор, тем больше контроля над сущностью и модификацией отдельных ее элементов, как существующих, так и новых в будущем.

Плохой пример использования модификатора:

Хороший пример использования модификатора:

В CSS, модификаторы стоит прописывать после основной группы модифицируемых элементов, чтобы не создавать путаницу, которая обязательно возникнет при появлении нескольких модификаций.

Общие правило расположение стилей описано в отдельном модуле.

Модификаторы 3D MAX

Модификатор изгибает поверхность под заданный угол. Можно передвигать центр изгиба.

Shell

Данный модификатор выдавливает, придает объем, можно использовать на сплайны и любые другие объекты.

Twist

Скручивает поверхность по заданной оси, возможно изменить центр скручивания.

Symmetry

Создает плоскость относительно которой объект отразится. Плоскость передвигается в любом направлении.

TurboSmooth

Сглаживание поверхности с заданной силой.

Relax

Избавляет поверхность от острых углов, работает схоже с TurboSmooth и Spherify.

Spherify

Этот модификатор превращает любой объект, если это возможно в сферу (если у объекта достаточно полигонов). Задается процент сферизирования.

Noise

Создает шумы или неровности. Задается Scale (размер) и деформация по осям.

FFD (box\cyl )

Создает редактируемую сетку вокруг объекта. Поверхность плавно принимает форму сетки.

Сглаживание на подобии TurboSmooth, но с большим количеством функций. Позволяет создавать слои сглаживания для отдельных групп полигонов.

Lattice

Создает «клетку» из ребер поверхности. На месте точек можно создать сферы заданного диаметра.

Lathe

Проворачивает выбранный сплайн вокруг оси «Axis» образует поверхности с симметрией вращения.

Sweep

Протягивает одну из предложенных в модификаторе форм вдоль сплайна и образует поверхность, возможно изменять параметры формы и угол сечения.

Имитирует «плавление» , возможность выбрать материал плавления (лед, стекло, желе) и степень «расплавленности»

Задается амплитуда «волны» по горизонтали и вертикали. Объект деформируется:

Stretch

Простой модификатор, объект сужается как бы по «талии» и вытягивается в высоту.

Taper

Так же простой модификатор, редко его использую, делает собственно следующее:

Комплексные модификаторы

Применение комплексных модификаторов продиктовано несколькими причинами:

· совместное действие двух и более модификаторов усиливает эффект, получаемый при использовании одиночного модификатора. Это связано с отмеченным выше зарождением центров кристаллизации на нерастворимых примесях в слое жидкой фазы с диффузионным переохлаждением, обусловленным введением растворимой примеси (особенно поверхностно-активной);

· при использовании комплексного модификатора создается возможность минимизировать содержание каждого из его компонентов, что облегчает выполнение условий ограничения состава сплава по примесям;

· сочетание модификаторов с физическими воздействиями усиливает эффект от действия модификаторов и создает возможность получения особо-мелких и специальных структур.

Различают комплексные модификаторы трех типов:

· рафинирующие, содержащие активные элементы Mn, Si, Са, Mg, Al, P3M и др.;

· упрочняющие, содержащие карбиды, бориды, нитриды, которые образуются в сплаве в результате взаимодействия соответствующих элементов и способствуют дисперсионному упрочнению основы;

· рафинирующе-упрочняющие, которые содержат активные элементы и соединения.

Модификаторы, содержащие такие активные элементы, как РЗМ, Ва, Са, являются эффективным средством изменения природы и формы неметаллических включений, получения наиболее предпочтительного типа оксидных включений в оболочке суль­фидов.

Получило применение модифицирование стали нитридами ванадия, титана, циркония, алюминия путем введения в сталь специальных лигатур или азотированных ферросплавов. В ре­зультате в стали при закалке и последующем отпуске выделяют­ся нитридные и карбонитридные дисперсные частицы. При мо­дифицировании конструкционных сталей нитридами ванадия происходит измельчение аустенитного зерна на 3-4 балла, по­вышение пластичности, ударной вязкости и прочности.

Таблица 5 Комплексные модификаторы.

Металл (сплав) Модификатор Примечание
Серый чугун Fe-Si-Ca + Al, Ti, Ce, La
Серый чугун с пони­женным углеродным эквивалентом С + 0,3 Si (3,5-3,7) Si-Mn-Zr Цель: получение чугуна с пластинчатым графитом
Сталь РЗМ с силикокальцием, ферромарганцем, ферроси­лицием Цель: удаление сульфидов церия
Сталь Ti-B-Ca, Ti-Ce-B, Mg-Zr-Ce, Ti-V-Ca
Алюминиевые сплавы Ti+В.смеси хлори­стых и фтористых солей (хлористый натрий, фтористый натрий, хлористый калий и криолит) Цель: получение более дисперсных и стабильных интерметаллидов
Ковкий чугун Al + Bi + B Цель: сокращение продолжительности отжига
Высокопрочный чугун с вермикулярным графитом Mg + Ti, Y, Ce, Ca Цель: получение разобщен­ных, утолщенных включений с округлыми концами (компактнее пластинчатого графита)

Особенностью модифицирования стали комплексными сплавами является то, что параллельно с измельчением структу­ры меняются природа и форма неметаллических включений, снижается в 1,5-2,0 раза загрязненность границ аустенитных зе­рен оксидными, сульфидными и нитридными включениями, по­вышается равномерность распределения структурных состав­ляющих, обеспечивается увеличение пластичности и ударной вязкости стали.

При производстве чугуна с шаровидным графитом наряду с раздельными модификаторами (магний либо церий) применяют комплексный модификатор (магний + церий). Добавка церия к магнию нейтрализует действие вредных примесей (титан, алю­миний, свинец, сурьма, мышьяк, висмут, олово), крайне вредно влияющих на качество чугуна, модифицированного магнием. Примеры комплексных модификаторов приведены в табл. 5.

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Сдача сессии и защита диплома — страшная бессонница, которая потом кажется страшным сном. 8774 — | 7145 — или читать все.

188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

Модификаторы патэрна

В Java можно управлять доступом (видимостью) методов и переменных класса из других классов. Модификатор доступа отвечает на вопрос «Кто может обращаться к данному методу/переменной?». Каждому методу или переменной можно указывать только один модификатор.

1) Модификатор «public».

К переменной, методу или классу, помеченному модификатором public, можно обращаться из любого места программы. Это самая высокая степень открытости – никаких ограничений нет.

2) Модификатор «private».

К переменной, методу или классу, помеченному модификатором private, можно обращаться только из того же класса, где он объявлен. Для всех остальных классов помеченный метод или переменная – невидимы. Это самая высокая степень закрытости – только свой класс. Такие методы не наследуются и не переопределяются. Доступ к ним из класса-наследника также невозможен.

3) Модификатор «по умолчанию».

Если переменная или метод не помечены никаким модификатором, то считается, что они помечены модификатором «по умолчанию». Переменные и методы с таким модификатором видны всем классам пакета, в котором они объявлены, и только им. Этот модификатор еще называют «package» или «package private», намекая, что доступ к переменным и методам открыт для всего пакета, в котором находится их класс

4) Модификатор «protected».

Этот уровень доступа чуть шире, чем package. К переменной, методу или классу, помеченному модификатором protected, можно обращаться из его же пакета (как package), но еще из всех классов, унаследованных от текущего.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL