Формулы (YFormula)

Формулы позволяют производить различные вычисления и преобразования данных и выводить результат как в базах данных так и в некоторых других частях системы Yonote.

Синтаксис YFormula - это упрощенный JavaScript код, многие операции из этого языка, такие как конкатинация, математические операции, тернарные выражения и тд можно использоваться в YFormula.

Основы синтаксиса

Строковые литералы (или проще - строки) всегда записываются с применением одинарных или двойных кавычек: "Привет Мир!” или ‘Привет Мир!‘

Конкатинация (сложение) строк осуществляется через символ +

'Привет' + 'Мир' = 'Привет Мир!'

Тем же способом, но уже без кавычек, выполняются математические операции:

1 + 1 = 2

Условия if

Условия можно записывать двумя способами, используя if или с помощью тернарных операторов.

if(condition, expression, expression2)

В случае если condition возвращает истину (true) или больше или меньше 0 - возвращается expression, иначе expression2 (если не указан - вернется false)

На пример:

if(10 > 5, 'Вернем текст') = 'Вернем текст'

if(5 > 10, 'Текст не вернется') = false

if(prop('Числа') > 0, 'Больше 0', 'Меньше или равно 0') = 'Меньше или равно 0'

Функции и свойства

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

Свойства

Формулы поддерживают почти все типы свойств. Обратите внимание, что типы формул отличаются от типов свойств.

Типы свойств

Название свойства Пример формулы
Заголовок prop("Title")
prop("Title").length()
Текст prop("Text")
prop("Text").length()
Выбор prop("Priority") == "High"
Множественный выбор prop("Tags").length()
prop("Tags").includes("Finance")
Чекбокс prop("Checkbox") == true
!prop("Checkbox") == false
Электронная почта, URL, номер телефона !empty(prop("Phone"))
!empty(prop("Email"))
link("Call", "tel:" + prop("Phone"))
Уникальный идентификатор prop("Task ID").split("-").first()
prop("Task ID").split("-").last()
Создано, изменено prop("Created By").name()
prop("Created By").email()
Человек prop("Person")
prop("Person").name()
prop("Person").map(current.email())
Дата, время создания, время последнего изменения prop("Due Date") > now()
dateBetween(prop("Birthday"), now(), "days")
Число prop("Number") / 2
pi() * prop("Radius") ^ 2
Связь prop("Tasks").length()
Сводка prop("Purchases").length()
prop("Average cost") * 12

Встроенные функции

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

Математические операторы

Оператор Описание Пример
+, -, *, % Сложение, вычитание, умножение, деление по модулю 2 * pi()
"hello" + "world"

Логические значения

Значение Описание Пример
true, false Логические значения true
false

Операторы сравнения

Оператор Описание Пример
==, >, >=, <, <= Сравнение 123 == 123
"Yonote" == "Motion"

Логические операторы

Оператор Описание Пример
&& Оператор И true && false = false
|| Оператор ИЛИ true || false = true
! Оператор отрицание (НЕ) !true = false

Тернарный оператор

Оператор Описание Пример
? : Тернарный оператор X ? Y : Z эквивалентно ifs(X, Y, Z)

Функции

Формулы Yonote поддерживают следующие функции.

Основные функции

Название Описание Пример
if Возвращает первое значение, если условие истинно, иначе возвращает false. if(true, 1) = 1
prop("Checked") == true ? "Complete" : "Incomplete"
empty Возвращает true, если значение пустое. empty(0) = true
empty([]) = true
length Возвращает длину текста или списка. length(“hello“) = 5
"hello".length() = 5
[1, 2, 3].length() = 3
substring Возвращает подстроку текста. substring("Yonote", 0, 3) = “Yon“
substring("Yonote", 3) = “ote“
contains Возвращает true, если строка поиска присутствует в значении. contains("Yonote", "yo") = true
test Возвращает true, если значение соответствует регулярному выражению. test("Yonote", "Yo") = true
test("Yonote", "\\d") = false
match Возвращает все совпадения регулярного выражения в виде списка. match("Yonote Yonote", "Yo")
match("Yonote 123 Yonote 456", "\\d+")
replace Заменяет первое совпадение регулярного выражения на новое значение. replace("Yonote Yonote", "Yo", "Mo")
replaceAll Заменяет все совпадения регулярного выражения на новое значение. replaceAll("Yonote Yonote", "Yo", "Mo") replaceAll("Yonote 123", "\\d", "")
lower Преобразует текст в нижний регистр. lower("YONOTE")
upper Преобразует текст в верхний регистр. upper("yonote")
style Добавляет стили и цвета к тексту. style("Yonote", "b", "u")
style("Yonote", "blue", "gray_background")
unstyle Удаляет стили все форматирования из текста. unstyle()
format Возвращает значение в виде текста. format(1234)
format(now())
add Возвращает сумму двух чисел. add(5, 10)
5 + 10
subtract Возвращает разность двух чисел. subtract(5, 10)
5 - 10
multiply Возвращает произведение двух чисел. multiply(5, 10)
5 * 10
mod Возвращает остаток от деления. mod(5, 10)
5 % 10
pow Возвращает результат возведения числа в степень. pow(5, 10)
5 ^ 10
divide Возвращает частное двух чисел. divide(5, 10) <br> 5 / 10
min Возвращает наименьшее число из аргументов. min(1, 2, 3) <br> min([1, 2, 3])
max Возвращает наибольшее число из аргументов. max(1, 2, 3) <br> max([1, 2, 3])
sum Возвращает сумму аргументов. sum(1, 2, 3) <br> sum([1, 2, 3], 4, 5)
median Возвращает медиану аргументов. median(1, 2, 4) <br> median([1, 2, 3], 4)
mean Возвращает среднее арифметическое аргументов. mean(1, 2, 3) <br> mean([1, 2, 3], 4, 5)
abs Возвращает абсолютное значение числа. abs(10) <br> abs(-10)
round Округляет число до ближайшего целого. round(0.4) <br> round(1.234, 2)
ceil Возвращает наименьшее целое число, большее или равное числу. ceil(0.4) <br> ceil(-0.6)
floor Возвращает наибольшее целое число, меньшее или равное числу. floor(0.4) <br> floor(-0.6)
sqrt Возвращает квадратный корень числа. sqrt(4) <br> sqrt(7)
cbrt Возвращает кубический корень числа. cbrt(9) <br> cbrt(64)
exp Возвращает e^x, где x — аргумент. exp(1) <br> exp(-1)
ln Возвращает натуральный логарифм числа. ln(2.718281828459045) <br> ln(10)
log10 Возвращает логарифм числа по основанию 10. log10(10) <br> log10(100000)
log2 Возвращает логарифм числа по основанию 2. log2(4) <br> log2(1024)
sign Возвращает знак числа. sign(-10) <br> sign(10)
pi Возвращает число π. pi()
e Возвращает число e. e()
toNumber Преобразует текст в число. toNumber("2") <br> toNumber(now())
now Возвращает текущую дату и время. now()
today Возвращает текущую дату без времени. today()
minute Возвращает минуты из даты. minute(parseDate("2023-07-10T17:35Z"))
hour Возвращает часы из даты. hour(parseDate("2023-07-10T17:35Z"))
day Возвращает день недели из даты. day(parseDate("2023-07-10T17:35Z"))
date Возвращает день месяца из даты. date(parseDate("2023-07-10T17:35Z"))
week Возвращает номер недели в году. week(parseDate("2023-01-02"))
month Возвращает месяц из даты. month(parseDate("2023-07-10T17:35Z"))
year Возвращает год из даты. year(now())
dateAdd Добавляет время к дате. dateAdd(now(), 1, "days") <br> dateAdd(now(), 2, "months")
dateSubtract Вычитает время из даты. dateSubtract(now(), 1, "days") <br> dateSubtract(now(), 2, "months")
dateBetween Возвращает разницу между двумя датами. dateBetween(now(), parseDate("2022-09-07"), "days")
dateBetween(parseDate("2030-01-01"), now(), "years")
dateRange Возвращает диапазон дат. dateRange(prop("Start Date"), prop("End Date"))
dateStart Возвращает начало диапазона дат. dateStart(prop("Date Range"))
dateEnd Возвращает конец диапазона дат. dateEnd(prop("Date range"))
timestamp Возвращает текущий Unix-таймстамп. timestamp(now())
fromTimestamp Возвращает дату из Unix-таймстампа. fromTimestamp(1689024900000)
formatDate Форматирует дату по заданному шаблону. formatDate(now(), "MMMM D, Y") <br> formatDate(now(), "MM/DD/YYYY")
parseDate Возвращает дату, разобранную по стандарту ISO 8601. parseDate("2022-01-01") <br> parseDate("2022-01-01T00:00Z")
name Возвращает имя человека. name(prop("Created By"))
prop("Pioneers").map(name(current)).join(", ")
email Возвращает адрес электронной почты человека. email(prop("Created By"))
prop("People").map(email(current)).join(", ")
at Возвращает значение по индексу в списке. at([1, 2, 3], 1)
first Возвращает первый элемент списка. first([1, 2, 3])
last Возвращает последний элемент списка. last([1, 2, 3])
slice Возвращает часть списка. slice([1, 2, 3], 1, 2) <br> slice(["a", "b", "c"], 1)
concat Возвращает объединение списков. concat([1, 2], [3, 4]) <br> concat(["a", "b"], ["c", "d"])
sort Возвращает отсортированный список.
[3, 1, 2].sort() = [1, 2, 3]
reverse Возвращает список в обратном порядке.
["a", "b", "c"].reverse() = ['c', 'b', 'a']
join Возвращает строку, объединенную из списка.
["a", "b", "c"].join(", ") = 'a, b, c'
["dog", "go"].join("") = 'doggo'
split Возвращает список, разделенный по разделителю. split("apple,pear,orange", ",")
unique Возвращает список уникальных значений. unique([1, 1, 2])
includes Возвращает true, если список содержит значение. includes(["a", "b", "c"], "b") <br> includes([1, 2, 3], 4)
find Возвращает первый элемент, удовлетворяющий условию. find(["a", "b", "c"], current == "b") <br> find([1, 2, 3], current > 100)
findIndex Возвращает индекс первого элемента, удовлетворяющего условию. findIndex(["a", "b", "c"], current == "b") <br> findIndex([1, 2, 3], current > 100)
filter Возвращает элементы списка, удовлетворяющие условию. filter([1, 2, 3], current > 1) <br> filter(["a", "b", "c"], current == "a")
some Возвращает true, если хотя бы один элемент удовлетворяет условию. some([1, 2, 3], current == 2) <br> some(["a", "b", "c"], current.length > 2)
every Возвращает true, если все элементы удовлетворяют условию. every([1, 2, 3], current > 0) <br> every(["a", "b", "c"], current == "b")
map Возвращает список, преобразованный по условию. map([1, 2, 3], current + 1) <br> map([1, 2, 3], current + index)
flat Возвращает упрощенный список. flat([1, 2, 3]) <br> flat([[1, 2], [3, 4]])
id Возвращает идентификатор страницы. id() <br> id(prop("Relation").first())
equal Возвращает true, если значения равны. equal(1, 1) <br> "a" == "b"
unequal Возвращает true, если значения не равны. unequal(1, 2) <br> "a" != "a"

Вспомогательные функции

Название Описание Пример
makeArray(from, to?) Возвращает массив из указанного диапазона
makeArray(5) = [0,1,2,3,4]
makeArray(5, 10) = [5,6,7,8,9,10]
makeArray(20, 15) = [20,19,18,17,16,15]
makeArray("01", "31") = ["01","02",...,"31"]
makeArray("10", "01") = ["10","09",...,"01"]
toJson(data) Конвертирует переменную в JSON
toJson( { a: 1} ) = '{"a":1}'
fromJson(data) Парсит JSON в объект/строку/число и тд
fromJson('{"a":1}') = { a: 1 }
icon(symbol) Вставляет эмодзи или иконку
icon('😃') = 😃
$static
Подробнее
Статическая переменная (только в базах данных)
$static.a = 123

В разработке

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


let Присваивает значение переменной и вычисляет выражение. let(person, "Alan", "Hello, " + person + "!")
let(radius, 4, round(pi() * radius ^ 2))
lets Присваивает значения нескольким переменным и вычисляет выражение. lets(a, "Hello", b, "world", a + " " + b)
lets(base, 3, height, 8, base * height / 2)
repeat Повторяет текст заданное количество раз. repeat("0", 4)
repeat("~=", 10)
link Создает гиперссылку из текста и URL. link("Yonote", "https://yonote.ru")

Ограничения и литы YFormula

В YFormula нельзя:

  • создавать функций через function, () => и тд
  • объявлять переменные через let, const, var
  • обратиться к DOM дереву браузера и к браузерному API