Erlang синтаксический анализ переменных-заполнителей - PullRequest
0 голосов
/ 11 октября 2018

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

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

parse_text() ->
    Text = <<"this is text {{{--test_placeholder_1--}}} and this also">>,
    % would not work here:
    % Text = <<"this is text {{{--test_placeholder_1--}}} and this {{{--test_placeholder_2--}}} also">>,
    [_,Tail] = binary:split(Text, [<<"{{{--">>],[global]),
    [Id|_] = binary:split(Tail, [<<"--}}}">>],[global]),

    Pattern = <<"{{{--", Id/binary, "--}}}">>,
    Replacement = get_content(Id),
    Result = binary:replace(Text, Pattern, Replacement),

    io:fwrite("~p\n", [Result]).


get_content(<<"test_placeholder_1">>)->
    <<"test id 1!">>;
get_content(<<"test_placeholder_2">>)->
    <<"test id 2!">>;
get_content(_)->
    <<"not found text!">>.

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

Cheers!

1 Ответ

0 голосов
/ 11 октября 2018

Я не уверен, что это лучшая идея, но она работает для нескольких заполнителей

parse_text(Input) ->
    List = lists:foldr(
        fun(E, Acc) ->
            case get_content(E) of
                <<"not found text!">> -> [E| Acc];
                Match -> [Match | Acc]
            end 
        end, [], binary:split(Input, [<<"{{{--">>, <<"--}}}">>], [global])
    ),
    erlang:list_to_binary(List).


get_content(<<"test_placeholder_1">>)->
    <<"test id 1!">>;
get_content(<<"test_placeholder_2">>)->
    <<"test id 2!">>;
get_content(_)->
    <<"not found text!">>.

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

Я чувствую, что вы должны проверить плагин ErlyDTL- ErlyDTL Wiki

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