2016-06-13 18 views
4

私はプロジェクトのためにQuillの使用法を調べていますが、単一の要素と単一のパラメータより複雑なカスタムフォーマット/ブロットを作成できるかどうかを知る必要があります。複雑な部分構造を持つカスタムフォーマット/ブロットを作成することは可能ですか?

私が欲しいレイアウトのいずれかの例は次のようになります。

<span class="format-container"> 
    <span class="format-info" data-attr="param 1 (non-displayed)"> 
     param 2 (displayed to user -- click to invoke application UI to edit) 
    </span> 
    <span class="format-content"> 
     User's text/child elements go here 
    </span> 
</span> 

私はに探しているすべての場合において、カスタム書式は、インラインスコープのものであり、まだ単一親コンテナと、単一の場所を持っています子供のコンテンツが移動するようにします

Quillのカスタムフォーマットは現時点ではあまりよく文書化されていないようです。私は情報源を突き刺し、これが0.20.1で可能ではない可能性が高いことを知ることができました。しかし、私はそれが1.0.0ベータ版で実行可能であるように感じます、私は実際に何を書く必要があるのか​​についての詳細はわかりません。

これは1.0.0でも可能ですか?もしそうなら、それはどうすればできますか?

EDIT:これは私がつもりです:Example

+0

。私はEmbedを試みましたが、それは常に自分のコンテンツを自分の新しい行に強制しました。それは怒っていました。あなたはこれを理解したことがありますか? –

+0

私はライブラリのソースコードを掘り下げて過ごしましたが、実際には可能ではないと私は考えています。 ParchmentはDOMの「抽象化」であるにもかかわらず、DOMの親子関係はまだその場所に依存しています。つまり、このようなサブコンテナ内の子要素を持つと、物事が壊れる可能性があります。結局、私は自分の書式設定システムを修正したので、それは必要ではありませんでした。 –

答えて

6

私は最小限の労力でこれをやり遂げる方法を考え出しました。これは、Quill 1.3以上の新しいブロットタイプを定義することを伴いますが、古いバージョンでは同じコードが動作するはずですが、テストされていません。

実際の例については、コードスニペットを参照してください。要点は、既存の埋め込みブロット「blots/embed」を拡張し、任意のDOMノードインスタンスを挿入する独自のツールバーハンドラを定義することです。興味深いことに、私はほとんどまったく同じ要件を持つ

// utility function used to inherit non prototypical methods/properties 
 
function extend(target, base) { 
 
    for (var prop in base) { 
 
    target[prop] = base[prop]; 
 
    } 
 
} 
 

 
// definition of a custom Blot. 
 
(function(Embed) { 
 
    'use strict'; 
 

 
    function Span() { 
 
    Object.getPrototypeOf(Embed).apply(this, arguments); 
 
    } 
 

 
    Span.prototype = Object.create(Embed && Embed.prototype); 
 
    Span.prototype.constructor = Span; 
 
    extend(Span, Embed); 
 

 
    Span.create = function create(value) { 
 
    return value; // expects a domNode as value 
 
    }; 
 

 
    Span.value = function value(domNode) { 
 
    return domNode; 
 
    }; 
 

 
    Span.blotName = 'span'; 
 
    Span.tagName = 'SPAN'; 
 
    Span.className = 'complex'; 
 

 
    Quill.register(Span, true); 
 
})(Quill.import('blots/embed')); // import the embed blot. This is important as this is being extended 
 

 
// custom handler for the toolbar button 
 
var handler = function() { 
 
    var complexSpan = document.getElementById('complextype').firstElementChild.cloneNode(true); 
 
    var selection = quill.getSelection(); 
 

 
    quill.insertEmbed(selection.index, 'span', complexSpan); 
 
} 
 

 
// instantiate quill. Note that modules.toolbar.handlers has a 'span' handler. Quill parses this from // the class on the button in the toolbar markup: 'ql-span' this is 'ql-' + blotName 
 
var quill = new Quill('#editor', { 
 
    modules: { 
 
    toolbar: { 
 
     container: '.toolbar', 
 
     handlers: { 
 
     'span': handler 
 
     } 
 
    } 
 
    }, 
 
    theme: 'snow' 
 
});
button.ql-span { 
 
    width: 150px !important; 
 
} 
 

 
.complex { 
 
    border-radius: 10px; 
 
    border: 2px solid black; 
 
    margin: 3px; 
 
} 
 

 
.inner { 
 
    border-radius: 10px; 
 
    background: #767676; 
 
    color: #FFFFFF; 
 
    padding-left: 6px; 
 
    padding-right: 6px; 
 
} 
 

 
.formatting { 
 
    font-weight: bold; 
 
    font-style: italic; 
 
    text-decoration: underline; 
 
} 
 

 
.nested { 
 
    margin-left: 3px; 
 
    margin-right: 3px; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/quill/1.3.1/quill.min.js"></script> 
 
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/quill/1.3.1/quill.snow.css" /> 
 
<div id="wrapper"> 
 
    <div id="toolbar" class="toolbar"> 
 
    <span class="ql-formats"> 
 
     <button class="ql-bold"></button> 
 
     <button class="ql-italic"></button> 
 
     <button class="ql-underline"></button> 
 
    </span> 
 
    <span class="ql-formats"> 
 
     <button class="ql-span">Complex Span Type</button> 
 
    </span> 
 
    </div> 
 

 
    <div id="editor">Lorem Ipsum 
 
    <span contenteditable="false"> 
 
     <span class="complex" spellcheck="false"> 
 
     <span class="inner">Format applied</span> 
 
     <span class="nested">More text</span> 
 
     <span class="formatting">with formatting</span> 
 
     <span class="nested">dolor</span> 
 
     </span> 
 
    </span> sit amet 
 
    </div> 
 
</div> 
 

 
<div id="complextype" style="display:none;"> 
 
<span contenteditable="false"><span class="complex" spellcheck="false"><span class="inner">Format applied</span><span class="nested">More text</span><span class="formatting">with formatting</span><span class="nested">dolor</span></span></span> 
 
</div>

+0

興味深い。私は結局、別のRTEフレームワークに完全に切り替わったことを認めますので、私はもうこれを直接テストすることはできません。私が掘り進んだときに "ハンドラー"を見たことは覚えていません。だから、最近追加されたものか、私はただそれを見逃しただけです。あなたはこれがうまくいってうれしい! Plunkr/JsFiddle /その他の実例を私に与えることができれば、この答えをうれしく受け入れて、他の人がそれをより簡単に見つけることができるようにします。 –

+0

@StephenCohen私は自分の答えを編集し、機能的なコードスニペットを提供しました。そして公平であるために、カスタムハンドラが欠けていたのは難しいことではありませんでした。 Quillはすばらしいプロジェクトですが、ドキュメントは場所が不自由です。 –

+0

ニース!私はそれがまだ完璧ではないことがわかります(ユーザーが任意のコンテンツをスパンの中に入れられるようにしていれば、フォーマットが適用された後は編集できません)。しかし、技術的にはやっていることをやっています。 、ここにあなたの緑色のチェックマークがあります! –

0

ドキュメントとガイドはまだ書かれているが、見るのに適した場所は、既存のカスタム書式が実装されている方法です。数式フォーマットは、特にユースケースによく似ています。

+0

私はそれを見ましたが、大きな違いがあります。そのうちの最大のものは、通常の子コンテンツを持つことができるインラインブロットが必要な一方、フォーミュラは埋め込みです。基本的には、外側のスパンが境界線をレンダリングし、最初の子スパンがメタデータテキストをレンダリングし、ユーザーは入力を2番目の子スパンに入力したまま入力を続けます。わかりやすいモックアップ画像で質問を編集します。 –

関連する問題