Как отформатировать текст и вставить видео с помощью Quill?

Я начал интегрировать WYSIWYG в проект блога, для этого использую Quill (до этого у меня не было опыта). Я смог настроить свой редактор так, как это требовалось, но я не понимаю, как работать с текстовым форматом и вставлять видео. У меня есть два поля в моей форме сообщения, «предварительный просмотр» и «контент» (два редактора гусиных перьев), при этом вводится текст, который я могу придать ему формат (заголовок, курсив, подчеркивание ... и т. Д.), И когда щелкаю опцию вставки видео, редактор позволяет мне добавить ссылку и визуализировать встроенное видео в этот момент. Когда я нажимаю кнопку сохранения, он сохраняет сообщение в моей базе данных, но на моей единственной странице сообщения я визуализирую все поля без формата (заголовок, курсив, подчеркивание и т. Д.), А также не вставляю видео. Как мне дать формат и показать видео? Любая помощь будет оценена.

Я прочитал документацию Quill и попытался понять, как справиться с этим с помощью дельт, но я не знаю, как заставить это работать.

Я использую Meteor + React, это мой код (я покажу только соответствующий код):

Это моя библиотека quill.jsx

import React, { Component } from 'react';
import QuillLib from './vendor/quill.js';
import { ud } from '/helpers/lib/main.jsx';

class Quill extends Component {
  constructor(props) {
    super(props);
    this.id = ud.shortUID();
}

componentDidMount() {
  const that = this;
  const toolbarOptions = [
    [{ font: [] }],
    [{ header: 1 }, { header: 2 }],
    [{ header: [1, 2, 3, 4, 5, 6, false] }],
    [{ align: [] }],
    ['bold', 'italic', 'underline', 'strike'],
    ['blockquote', 'code-block'],
    [{ script: 'sub' }, { script: 'super' }],
    [{ indent: '-1' }, { indent: '+1' }],
    [{ color: [] }, { background: [] }],
    ['video'],
    ['image'],
];

const quill = new QuillLib(`#quill-editor-container-${this.id}`, {
  modules: {
    toolbar: toolbarOptions,
  },
  theme: 'snow',
});
const content = this.props.content;
  quill.setContents(content);
  quill.on('text-change', (delta) => {
    if (that.props.onChange) {
      that.props.onChange(quill);
    }
  });
}

render() {
  return (
    <div className="wysiwyg-wrapper">
      <div id={`quill-editor-container-${this.id}`}></div>
    </div>
  );
 }
}
export default Quill;

Это мой компонент формы ввода, list.jxs

import { Meteor } from 'meteor/meteor';
import { PostSchema } from '/modules/blog/lib/collections.jsx';
import Quill from '/modules/quill/client/main.jsx';

export class BlogCategory extends Component {
  constructor(props) {
    super(props);
    this.state = {
      post: {
        content: '',
        preview: '',
      },
    };
    this.onPreviewChange = this.onPreviewChange.bind(this);
    this.onContentChange = this.onContentChange.bind(this);
  }

  onPreviewChange(content) {
    this.state.post.preview = content.getText();
    this.setState(this.state);
  }
  onContentChange(content) {
    this.state.post.content = content.getText();
    this.setState(this.state);
  }

  save() {
    const content = this.state.post.content;
    const preview = this.state.post.preview;
    const post = new PostSchema();
    post.set({
      content,
      preview,
    });
    if (post.validate(false)) {
      const id = post.save(); 
    }
    console.log(post.getValidationErrors(false));
  }

  renderCreatePostForm() {
   let content;
   if (this.state.showForm) {
     content = (
      <form action="">
        <Quill 
           content={this.state.post.preview} 
           onChange={this.onPreviewChange}
        />
        <Quill
           content={this.state.post.content}
           onChange={this.onContentChange}
        />
      </form>
     );
    }
    return content;
  }
  render() {
    let content = (
      <div className="col-xs-12">
        {this.renderActions()}
      </div>
    );
   if (!this.props.ready) {
    content = <p>LOADING...</p>;
   }
   return content;
  }
}
export default createContainer(() => {
  const handleValidPost = Meteor.subscribe('posts');
  return {
    ready: handleValidPost.ready(),
    posts: PostSchema.find({}).fetch(),
  };
}, BlogCategory);

И, наконец, мой collections.jsx

import { Mongo } from 'meteor/mongo';
export const PostCollection = new Mongo.Collection('Posts');
export const PostSchema = Astro.Class({
  name: 'PostSchema',
  collection: PostCollection,
  fields: {
    content: {
     validator : Validators.and([
       Validators.required(),
       Validators.string(),
       Validators.minLength(3)
     ])
    },
    preview: {
     validator : Validators.and([
       Validators.required(),
       Validators.string(),
       Validators.minLength(3)
     ])
    },
  }
});

person Marco Chavez    schedule 22.08.2016    source источник
comment
Не могли бы вы опубликовать рабочий пример кода, чтобы осветить вашу проблему?   -  person Daniel Lane    schedule 01.09.2016
comment
Если бы код работал, он бы не спрашивал   -  person Craig1123    schedule 10.11.2016
comment
Вам удалось заставить это работать? Я предполагаю, что вы могли бы использовать React Player для отображения ссылок на видео или аудио, но я бы не знал, как это реализовать ...   -  person Deelux    schedule 03.12.2016


Ответы (1)


При получении Quill содержимого от getText вы потеряли текстовый формат и информацию о видео. При использовании getText все нестроковые данные будут опущены. Quill данные определяются как Delta (который является объектом JSON).

Вы можете исправить это, обновив свои onPreviewChange и onContentChange, чтобы использовать getContents вместо getText. Сохраните эти Delta в БД и загрузите снова.

  onPreviewChange(content) {
    this.state.post.preview = content.getContents();
    this.setState(this.state);
  }
  onContentChange(content) {
    this.state.post.content = content.getContents();
    this.setState(this.state);
  }

person An Nguyen    schedule 08.08.2017