3

bulletedlist に似た新しいリスト プラグインを追加しようとしているので、新しいボタンを作成しましたが、UL タグを使用しようとすると、arrowedlist という新しいボタンと bulletedlist ボタンがペアになります。

私がこれを行っている理由は、クラスを追加できるようにするためです (方法はわかっています)。2 つの異なるボタンを使用できます。1 つはデフォルトの箇条書きリストを適用し、もう 1 つはクラス付きの UL タグを適用します。

基本的な質問は次のとおりです。ボタンをペアにせずに、ブレットリストと同じ方法で UL を使用するボタンを追加する方法はありますか?

    // Register commands.
        editor.addCommand( 'numberedlist', new listCommand( 'numberedlist', 'ol' ) );
        editor.addCommand( 'bulletedlist', new listCommand( 'bulletedlist', 'ul' ) );
        editor.addCommand( 'arrowedlist', new listCommand( 'arrowedlist', 'ul' ) );


        // Register the toolbar button.
        if ( editor.ui.addButton ) {
            editor.ui.addButton( 'NumberedList', {
                label: editor.lang.list.numberedlist,
                command: 'numberedlist',
                directional: true,
                toolbar: 'list,10'
            });
            editor.ui.addButton( 'BulletedList', {
                label: editor.lang.list.bulletedlist,
                command: 'bulletedlist',
                directional: true,
                toolbar: 'list,20'
            });
            editor.ui.addButton( 'ArrowedList', {
                label: editor.lang.list.arrowedlist,
                command: 'arrowedlist',
                directional: true,
                toolbar: 'list,30'
            });

        }

明らかなことを見逃していないことを願っています、ありがとう!

4

2 に答える 2

4

リストシステムはそのようなことを行うように設計されていないため、これは簡単ではありませんが、それについて何かを行うことができます. リスト プラグイン ( plugins/list/plugin.js) のコードを変更する必要があります。これらは、実装される基本的な前提です。

  • 異なるリストを区別する:
    • それぞれ属性<ol>を取得data-numberedlistします。
    • カスタムクラスに応じて、それぞれ<ul>が取得data-bulletedlistまたは属性を取得します。data-arrowedlist
  • クラスにカスタム CSS を追加します。
  • コマンドでカスタム クラスが定義されている場合は、新しく作成されたリストにカスタム クラスを追加します。
  • ボタンで作成されたすべてのリストにカスタム属性を追加します (最初のポイントを参照)。
  • コマンドがrefreshと を区別するように<ul data-bulletedlist="true><ul data-arrowedlist="true>ます。

最新の CKedtor (4.2) を使用していると仮定しています。ここであなたを導くために最善を尽くします。これを読みながら、次の変更を実装するGistを見てください。これは間違いなく、違いのコンテキストを取得するのに役立ちます. それでは...頑張って行きましょう!;)


修正事項

リストに特定のスタイルを追加する

プラグイン定義の外に置くと、これはすべてのエディターに対してグローバルになります。

CKEDITOR.addCss( 'ul.myclass { color: red } ' );

listCommand() 関数がカスタム クラスをパラメーターとして受け入れるようにします。

Advanced Content Filterでカスタム クラスとdata-name属性を許可する必要があります。

function listCommand( name, type, className ) {
    this.name = name;
    this.type = type;
    this.context = type;

    // Remember the class of this command.
    this.className = className;

    this.allowedContent = {};
    this.allowedContent[ type ] = {
        classes: className || '',
        attributes: 'data-' + name
    };
    this.allowedContent.li = true;
    this.requiredContent = type;
}

arrowedlist のコマンドを追加

ここに注意myclassしてください。

editor.addCommand( 'arrowedlist', new listCommand( 'arrowedlist', 'ul', 'myclass' ) );

ボタンを追加する

editor.ui.addButton( 'ArrowedList', {
    label: editor.lang.list.bulletedlist,
    command: 'arrowedlist',
    directional: true,
    toolbar: 'list,20'
});

すべての NEW リストに data-name 属性を追加

リストの種類を区別するdata-nameには、要素に属性を追加します。

listNode = doc.createElement( this.type );
listNode.data( this.name, true );

カスタム クラスを NEW 矢印付きリストに追加します。

if ( this.className )
    listNode.addClass( this.className );

listCommand のプロトタイプで refresh() を拡張する

<ul>これにより、 arrowedlist ボタンが を持っている場合にのみ、その状態が変わることが保証されますdata-arrowedlist。もちろん、bulletedlist と numberedlist についても同様の動作です。

if ( list && limit.contains( list ) ) {
    var isList = list.is( this.type ) && list.data( this.name );

    this.setState( isList ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF );
}

データ処理者ルールを追加する

エディターの存続期間中、それぞれ<ol>data-numberedlist. したがって、クラスが設定されているかどうかに応じて、それぞれ<ul>が取得data-arrowedlistまたは取得します。data-bulletedlistmyclass

出力では、カスタム属性が除外されるため、保存するデータは完全にクリーンです。

editor.dataProcessor.dataFilter.addRules( {
    elements: {
        ol: function( element ) {
            element.attributes[ 'data-numberedlist' ] = true;
        },
        ul: function( element ) {
            var className = element.attributes.class;

            if ( className && className.match( /myclass/g ) )
                element.attributes[ 'data-arrowedlist' ] = true;
            else
                element.attributes[ 'data-bulletedlist' ] = true;
        }
    }
} );

editor.dataProcessor.htmlFilter.addRules( {
    elements: {
        ol: function( element ) {
            delete element.attributes[ 'data-numberedlist' ];
        },
        ul: function( element ) {
            delete element.attributes[ 'data-arrowedlist' ];
            delete element.attributes[ 'data-bulletedlist' ];
        }
    }
} );

テスト

ソース ビューで次の HTML を設定してみてください。

<ul class="myclass">
    <li>Foo</li>
    <li>Bar</li>
</ul>

WYSIWYG に戻ると、レッド リストになるはずです。また、矢印付きリスト ボタンは、そのようなリストに関連付けられた唯一のボタンになります。

于 2013-08-07T20:24:05.487 に答える
1

@oleq

箇条書きリストを番号付きリストに変更しようとすると、機能は動作しますが、番号付きリスト ボタンがクリックされず、クリックされていないように見えます。

箇条書きリストから矢印付きリストに変更しようとすると、機能が機能せず、箇条書きリストのボタンがクリックされたままになり、矢印付きリストから箇条書きリストに変更した場合も同様です。

番号付きリストから矢印付きリストに変更しようとすると、リストは通常​​の箇条書きリストに変更されますが、リストが単純な箇条書きに変更されても、<ul>まだ の属性があります。data-numberedlist="true"

フォーマットされていないリストを番号付きリストに変更したり、番号付きリストから変更したりする場合、クリックされたボタンを含むすべてが正常に機能しますが、その間に使用されている他のボタンのいずれかでは機能しません。

また、矢印付きのリストから番号付きのリストに移動すると、<ul>タグが変更されますが、タグに属性<ol>が適用されます。何かが競合していることはわかりますが、どこにあるのかはよくわかりません。class="arrowbullet" data-arrowedlist="true"<ol>

于 2013-08-14T10:40:04.870 に答える