Как я могу повторно использовать код между макросами Javascript и минимизировать работу, выполняемую в макросах?
В настоящее время у меня есть два макроса, которые являются частью плагина (очень ограниченной аудитории), который я разрабатываю, и оба выглядят в основном так:
(function(){
exports.name = "name";
exports.params = [
{name: "value"}
];
function get(tiddler) {
// return some contents of some tiddler fields according to some rule
}
function parse(data) {
// convert string to some kind of useful object
}
function logic(x, y) {
// determine whether the two objects correspond in some way
};
function format(data, title) {
// produce WikiText for a link with some additional decoration
};
exports.run = function(value) {
value = parse(value);
var result = [];
this.wiki.each(function(tiddler, title) {
var data = get(tiddler);
if (data !== undefined && logic(value, parse(data))) {
result.push(format(data, title));
}
});
return result.join(" | ");
};
})();
Так что они уже достаточно аккуратно учтены, когда рассматриваются индивидуально; проблема в том, что только ядро logic
действительно отличается между двумя макросами. Как я могу поделиться функциями get
, logic
а также format
между макросами? Я пытался просто поместить их в отдельный тиддлер, но это не сработало; при запуске макросов TW вызывает ошибку, утверждая, что функции "не определены". Обертывание каждой функции как своего собственного макроса javascript в отдельном тиддлере, например
(function(){
exports.name = "get";
exports.params = [
{name: "tiddler"}
];
exports.run = function(tiddler) {
// return some contents of some tiddler fields according to some rule
}
})();
тоже не помогло.
Я также хотел бы, чтобы это было более модульным / гибким, поворачивая основной get
/parse
/logic
/format
обработать в пользовательский фильтр, затем позволить обычному выражению фильтра позаботиться об итерации и использовать, например, виджет или макрос <> для отображения элементов. Как именно это настроить? Документация говорит мне
Если предоставленных операторов фильтров недостаточно, разработчик может добавить новые фильтры, добавив модуль с
filteroperator
тип
но я не могу найти ни документации API для этого, ни примеров.
1 ответ
Как я могу разделить функции get, логику и формат между макросами?
Вы можете использовать стандарт Common/JS require('<tiddler title>')
синтаксис для доступа к экспортам другого тиддлера. Целевой тидлер должен быть настроен как модуль JS (т. Е. type
поле установлено в application/javascript
и module-type
поле установлено в library
). Вы можете увидеть пример здесь:
https://github.com/Jermolene/TiddlyWiki5/blob/master/core/modules/widgets/count.js#L15
Я также хотел бы настроить его на более модульный / гибкий, превратив основной процесс get / parse / logic / format в пользовательский фильтр, а затем разрешив обычному выражению фильтра позаботиться об итерации и используя, например, виджет или Макрос <> для отображения элементов. Как именно это настроить?
API для написания операторов фильтра в настоящее время не документирован, но есть много примеров, на которые стоит обратить внимание:
https://github.com/Jermolene/TiddlyWiki5/tree/master/core/modules/filters