1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Точный парсинг тегов MiniMessage в json с сохранением форматирования.

Тема в разделе "Разработка плагинов для новичков", создана пользователем normalped, 3 окт 2024.

  1. Автор темы
    normalped

    normalped Участник Пользователь

    Баллы:
    36
    У меня есть json текст который я получаю с разных мест сервера, например из чата. Я хочу запарсить теги MiniMessage и получить новый json. Простыми словами, я могу запарсить json, получить Component из Adventure API и пройтись по его детям, если это TextComponent, я получу его текст, запаршу через MiniMessage и добавлю полученный компонент в список детей. Проблема заключается в том, что если получится так, что текст будет разделен на части, то с большой вероятностью я не смогу правильно запарсить теги из MiniMessage.

    Для примера, у меня есть текст: "some <green>green &ctext</green>", если он будет отправлен игроку в чат, я получу примерно такой json:
    Код:
    {
       "text":"",
       "extra":[
          {
             "text":"some<green>test",
             "color":"gold"
          },
          {
             "text":"text</green>",
             "color":"red"
          }
       ]
    }

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

    Я перепробовал все, что мог придумать, но, к сожалению, все безуспешно. Это был простой пример ситуации. Может быть такое, что теги будут вложены или разделены не на 2 а больше компонентов. Также может случиться так, что тег будет разбит прямо в том месте, где расположены аргументы, например «<tag:'test» и «text'>». Без понятия, как можно поддерживать все возможные ситуации.

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

    Буду благодарен за ваши предложения.
     
  2. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Ты явно что-то делаешь не так, если у тебя внутри формата json лежат теги от minimessage. Или если у тебя minimessage в одной строке вместе с legacy ampersand. Так быть не должно ни при каких обстоятельствах.
    Если ты это не контролируешь - оставь эту ответственность тому, кто генерирует подобный тестовый мусор.
    Я бы сделал упор именно на это, а не на попытку совместить микроволновку с телевизором.

    Если ты всё-таки хочешь взять на себя этот груз и начать парсить подобную помойку - тебе будет нужен собственный сериализатор, т.к. стандартные в Adventure с таким, очевидно, не справятся.
    Либо можно пойти более костыльным и простым путём - заменить все устаревшие ampersand и section на minimessage теги. Для этого либо реплейс, либо регулярка, либо цикл с перебором символов + StringBuilder.
    После этого тебе останется лишь рекурсивно распарсить весь minimessage внутри json, как ты сам и предложил.
    Но я так и не понял, какая с этим проблема.

    Не понял, в чём тут проблема (за исключением того, что сообщении один текст, а в блоке кода другой)
     
  3. Автор темы
    normalped

    normalped Участник Пользователь

    Баллы:
    36
    Я получаю json сообщение чата из пакетов и пытаюсь запарсить в нем теги сохраняя форматирование из json.
    Да, лучше забить на это. Можно проверять json на наличие тегов, превращать json в полностью чистый текст и парсить теги.
    В таком случае структура отформатированного текста будет отличаться. К примеру текст "&lbold &ctext" будет выглядеть так:
    upload_2024-10-4_19-59-55.png
    а текст "<bold>bold <red>text" так:
    upload_2024-10-4_20-0-34.png
    Это меня не очень устраивает, ну, может и нормально.
    И не все так просто. Надо из json получить текст со старым форматированием и как то сохранить ховер и клик ивенты...
    Где тут?
     
  4. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Ну преобразуй тест обратно в легаси формат и твой пазл сам сложиться, ну а свои ховеры и клики запиши в некий лист, что бы не потерялись для дальнейшего восстановления в компоненты.
     
    Последнее редактирование: 4 окт 2024
  5. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    А тебе как нужно? У adventure более корректный парсер, на большинстве серверов уже используется он или json, скорее всего.
    Ну, если тебе нужно как в legacy, то просто закрывай все цветовые теги перед открытием новых. Вот и будет отображение, как в legacy формате.

    Ну, можно и так. Но, на мой взгляд, проще конвертировать legacy в adventure, чем adventure в legacy и потом ещё раз обратно
     

Поделиться этой страницей