Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

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'>». Без понятия, как можно поддерживать все возможные ситуации.

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

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

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

У меня есть 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 изначально будет не совсем удачным для парсинга тегов предложенном мною выше способом.
Не понял, в чём тут проблема (за исключением того, что сообщении один текст, а в блоке кода другой)
 
Ты явно что-то делаешь не так, если у тебя внутри формата json лежат теги от minimessage.
Я получаю json сообщение чата из пакетов и пытаюсь запарсить в нем теги сохраняя форматирование из json.
Да, лучше забить на это. Можно проверять json на наличие тегов, превращать json в полностью чистый текст и парсить теги.
Либо можно пойти более костыльным и простым путём - заменить все устаревшие ampersand и section на minimessage теги. Для этого либо реплейс, либо регулярка, либо цикл с перебором символов + StringBuilder.
После этого тебе останется лишь рекурсивно распарсить весь minimessage внутри json, как ты сам и предложил.
Но я так и не понял, какая с этим проблема.
В таком случае структура отформатированного текста будет отличаться. К примеру текст "&lbold &ctext" будет выглядеть так:
upload_2024-10-4_19-59-55.png
а текст "<bold>bold <red>text" так:
upload_2024-10-4_20-0-34.png
Это меня не очень устраивает, ну, может и нормально.
И не все так просто. Надо из json получить текст со старым форматированием и как то сохранить ховер и клик ивенты...
Не понял, в чём тут проблема (за исключением того, что сообщении один текст, а в блоке кода другой)
Где тут?
 
Ну преобразуй тест обратно в легаси формат и твой пазл сам сложиться, ну а свои ховеры и клики запиши в некий лист, что бы не потерялись для дальнейшего восстановления в компоненты.
 
Последнее редактирование:
К примеру текст "&lbold &ctext" будет выглядеть так:
Посмотреть вложение 67833
а текст "<bold>bold <red>text" так:
Посмотреть вложение 67834
Это меня не очень устраивает, ну, может и нормально.
А тебе как нужно? У adventure более корректный парсер, на большинстве серверов уже используется он или json, скорее всего.
Ну, если тебе нужно как в legacy, то просто закрывай все цветовые теги перед открытием новых. Вот и будет отображение, как в legacy формате.

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

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

Назад
Верх