расширенный текст? Виде!

Продолжая нашу серию, мы подошли к отдельному веб-компоненту, который я рассмотрю в следующих двух постах. Сначала простое улучшение текста, обобщенное для повторного использования (этот), затем добавление того же обобщенного тега, чтобы он отвечал уникальному случаю использования в HAXcms.

Ссылки

  • Демонстрация Codepen с несколькими тегами
  • Демонстрация (глоссарий в следующей части более впечатляющий)
  • npm install @lrnwebcomponents/enhanced-text
  • источник микросервиса
  • источник веб-компонента

Какова цель?

Целью было создать элемент, который мог бы анализировать текст и дополнять его автоматически. Первым деревом принятия решений становится вопрос, будет ли это управляться Light Dom или данными/свойствами? Очевидно, я выбрал оба варианта ;). Нет, это микс.

Light Dom / узлы щелевого контента были выбраны для обеспечения текста, потому что:

  • Контент для наших реализаций CMS уже существовал
  • Обертывание тега на существующие <p> / обычные HTML-теги является высоко семантическим / прогрессивным улучшением
  • Мы могли бы поддерживать более высокий уровень SEO, используя по умолчанию существующий текстовый контент и просто обернув содержимое.

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

  • vide — поддержка дополнения текста из этой конечной точки
  • loading — статус для визуализации того, что что-то происходит.

Дополнительные соображения касались поддержки резервного копирования, чтобы в случае сбоя дополнения из микросервиса, он все равно продолжал бы отображать текст в слотах. CSS / HTML в этом элементе очень минималистичен, за исключением вращающегося загрузчика.

Демонстрация кодепена

Здесь показано несколько вариантов тега enhanced-text, включая vide, wikipedia, glossary и переключение булева auto для того, чтобы увеличить текст немедленно по событию (нажатие кнопки в случае с vide).

веб-компонент с улучшенным текстом

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

firstUpdated(changedProperties) {
     if (super.firstUpdated) {
       super.firstUpdated(changedProperties);
     }
     // automatic enhancement if set, otherwise manual
     if (this.auto) {
       this.enhance();
     }
   }
Вход в полноэкранный режим Выход из полноэкранного режима

Если у нас auto установлено в TRUE, то мы автоматически расширяем наш элемент, чтобы перейти к запросу на его обработку. Жизненный цикл firstUpdated похож на connectedCallback, но Lit async рендерит shadowRoots, так что это первый раз, когда безопасно запрашивать информацию там и работать с ней.

Давайте теперь посмотрим на enhancement, который делает всю тяжелую работу.

// apply enhancement to text. if not in auto user must invoke this.
   async enhance() {
     const body = this.innerHTML;
     this.loading = true;
     if (this.vide) {
       await MicroFrontendRegistry.call('@enhancedText/textVide', {body: body, fixationPoint: this.fixationPoint}, this.enahncedTextResponse.bind(this));
     }
     if (this.haxcmsGlossary && (this.haxcmsSiteLocation || this.haxcmsSite)) {
       if (this.haxcmsSite) {
         await MicroFrontendRegistry.call('@haxcms/termsInPage', {body: body, type: 'site', site: this.haxcmsSite, wikipedia: this.wikipedia}, this.applyTermFromList.bind(this));
       }
       else {
         await MicroFrontendRegistry.call('@haxcms/termsInPage', {body: body, type: 'link', site: this.haxcmsSiteLocation, wikipedia: this.wikipedia}, this.applyTermFromList.bind(this));
       }
     }
     // all above will run in order
     this.loading = false;
   }
Вход в полноэкранный режим Выход из полноэкранного режима

Здесь мы выполняем различные опции из наших свойств, используем this.innerHTML для получения содержимого тела для обработки, и позволяем вызовам MicroFrontendRegistry отправлять данные в микросервисы и из них.

Доверять пока слишком многому…

Не так много происходит с enhanceTextResponse, который является тем случаем, который запускает вызов, чтобы «расширить» текст.

enahncedTextResponse(data) {
     if (data.status && data.data && data.data.length) {
      let parser = new DOMParser();
      let doc = parser.parseFromString(data.data, 'text/html');
      this.innerHTML = doc.body.innerHTML;
     }
   }
Вход в полноэкранный режим Выход из полноэкранного режима

Если наши данные из микро отравлены (каким-то образом), то DOMParser, по крайней мере, обработает тег script, хотя это очень минимальная форма XSS, и дальнейшая работа здесь по обеспечению конечной точки необходима для больших реализаций, которым потребуются дополнительные уровни гарантии безопасности.

конечная точка vide

TextVide — это попытка с открытым исходным кодом реализовать технику, известную как Bionic Reading — плагин для браузера, который улучшает блоки текста, чтобы помочь глазу пользователя сфокусироваться на достаточной части слова для эффективного чтения.

Конечная точка для этого микросервиса невероятно минимальна (13 строк минус комментарии) в результате всей работы, проделанной в пакете text-vide.

import { stdPostBody, stdResponse, invalidRequest } from "../../../utilities/requestHelpers.js";
import { textVide } from 'text-vide';
export default async function handler(req, res) {
  // use this if POST data is what's being sent
  const body = stdPostBody(req);
  const text = body.body;
  if (text) {
    const highlightedText = textVide(text, { fixationPoint: body.fixationPoint ? parseInt(body.fixationPoint) : 4 });
    res = stdResponse(res, highlightedText, {cache: 86400, methods: "OPTIONS, POST" });
  }
  else {
    res = invalidRequest(res, 'missing `text` param');
  }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Пока мы жестко кодируем точку фиксации (4), но она может принимать переменную для изменения. Нам все еще нужно опробовать это на конечных пользователях с реальным контентом, чтобы понять, насколько это ценно и какой метод улучшения точки фиксации лучше.

В следующей статье я расскажу, как этот же элемент может быть подключен к нашей системе HAXcms для обеспечения глоссария терминами, дополненными в контексте. Это наша основная цель — дать студентам возможность быстро получить ссылки на определения, если они забыли термин и то, как он используется в курсе. Однако мы не хотим, чтобы наши преподаватели (конечные пользователи, создающие контент) вспоминали все места, где используется термин, или чтобы им приходилось поддерживать и управлять определением после его написания.

Оцените статью
devanswers.ru
Добавить комментарий