Как я могу повторно использовать код между макросами 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

Другие вопросы по тегам