<commit_before>/**
 * @scope enchant.Timeline.prototype
 */
enchant.Timeline = enchant.Class.create(enchant.EventTarget, {
    /**
     * @name enchant.Timeline
     * @class
     [lang:ja]
     * アニメーションを管理するためのクラス.
     *
     * 操作するノードひとつに対して, 必ずひとつのタイムラインが対応する.
     * タイムラインクラスは, 自身に様々なアクションを追加するメソッドを持っており,
     * これらを使うことで簡潔にアニメーションや様々な操作をすることができる.
     * タイムラインクラスはフレームとタイムのアニメーションができる.
     * @param {enchant.Node} node 操作の対象となるノード.
     [/lang]
     [lang:en]
     * Time-line class.
     * Class for managing the action.
     *
     * For one node to manipulate the timeline of one must correspond.
     * Time-line class has a method to add a variety of actions to himself,
     * entities can be animated and various operations by using these briefly.
     * You can choose time based and frame based(default) animation.
     * @param {enchant.Node} node target node.
     [/lang]
     [lang:de]
     * @param {enchant.Node} node
     [/lang]
     * @constructs
     * @extends enchant.EventTarget
     */
    initialize: function(node) {
        enchant.EventTarget.call(this);
        this.node = node;
        this.queue = [];
        this.paused = false;
        this.looped = false;
        this.isFrameBased = true;
        this._parallel = null;
        this._activated = false;
        this.addEventListener(enchant.Event.ENTER_FRAME, this.tick);

        var tl = this;
        this._nodeEventListener = function(e) {
            tl.dispatchEvent(e);
        };
    },
    /**
     * @private
     */
    _deactivateTimeline: function() {
        if (this._activated) {
            this._activated = false;
            this.node.removeEventListener('enterframe', this._nodeEventListener);
        }
    },
    /**
     * @private
     */
    _activateTimeline: function() {
        if (!this._activated && !this.paused) {
            this.node.addEventListener("enterframe", this._nodeEventListener);
            this._activated = true;
        }
    },
    /**
     [lang:ja]
     * 一つのenchant.Event.ENTER_FRAMEイベントはアニメーションに一つの時間単位になる. （デフォルト）
     [/lang]
     [lang:en]
     [/lang]
     [lang:de]
     [/lang]
     */
    setFrameBased: function() {
        this.isFrameBased = true;
    },
    /**
     [lang:ja]
     * 一つのenchant.Event.ENTER_FRAMEイベントはアニメーションに前のフレームから経過した時間になる.
     [/lang]
     [lang:en]
     [/lang]
     [lang:de]
     [/lang]
     */
    setTimeBased: function() {
        this.isFrameBased = false;
    },
    /**
     [lang:ja]
     * キューの先頭にあるアクションを終了し, 次のアクションへ移行する.
     * アクションの中から呼び出されるが, 外から呼び出すこともできる.
     *
     * アクション実行中に, アクションが終了した場合,
     * もう一度 tick() 関数が呼ばれるため, 1フレームに複数のアクションが処理される場合もある.
     *
     * @example
     * sprite.tl.then(function A(){ .. }).then(function B(){ .. });
     * // 最初のフレームで A・B の関数どちらも実行される.
     [/lang]
     [lang:en]
     [/lang]
     [lang:de]
     [/lang]
     */
    next: function(remainingTime) {
        var e, action = this.queue.shift();

        if (action) {
            e = new enchant.Event("actionend");
            e.timeline = this;
            action.dispatchEvent(e);
        }

        if (this.queue.length === 0) {
            this._deactivateTimeline();
            return;
        }

        if (this.looped) {
            e = new enchant.Event("removedfromtimeline");
            e.timeline = this;
            action.dispatchEvent(e);
            action.frame = 0;

            this.add(action);
        } else {
            // remove after dispatching removedfromtimeline event
            e = new enchant.Event("removedfromtimeline");
            e.timeline = this;
            action.dispatchEvent(e);
        }
        if (remainingTime > 0 || (this.queue[0] && this.queue[0].time === 0)) {
            var event = new enchant.Event("enterframe");
            event.elapsed = remainingTime;
            this.dispatchEvent(event);
        }
    },
    /**
     [lang:ja]
     * 自身のenterframeイベントのリスナとして登録される関数.
     * 1フレーム経過する際に実行する処理が書かれている.
     * (キューの先頭にあるアクションに対して, actionstart/actiontickイベントを発行する)
     * @param {enchant.Event} enterFrameEvent enterframeイベント.
     [/lang]
     [lang:en]
     * @param {enchant.Event} enterFrameEvent
     [/lang]
     [lang:de]
     * @param {enchant.Event} enterFrameEvent
     [/lang]
     */
    tick: function(enterFrameEvent) {
        if (this.paused) {
            return;
        }<commit_msg>bugfix about Timeline#next<commit_after>/**
 * @scope enchant.Timeline.prototype
 */
enchant.Timeline = enchant.Class.create(enchant.EventTarget, {
    /**
     * @name enchant.Timeline
     * @class
     [lang:ja]
     * アニメーションを管理するためのクラス.
     *
     * 操作するノードひとつに対して, 必ずひとつのタイムラインが対応する.
     * タイムラインクラスは, 自身に様々なアクションを追加するメソッドを持っており,
     * これらを使うことで簡潔にアニメーションや様々な操作をすることができる.
     * タイムラインクラスはフレームとタイムのアニメーションができる.
     * @param {enchant.Node} node 操作の対象となるノード.
     [/lang]
     [lang:en]
     * Time-line class.
     * Class for managing the action.
     *
     * For one node to manipulate the timeline of one must correspond.
     * Time-line class has a method to add a variety of actions to himself,
     * entities can be animated and various operations by using these briefly.
     * You can choose time based and frame based(default) animation.
     * @param {enchant.Node} node target node.
     [/lang]
     [lang:de]
     * @param {enchant.Node} node
     [/lang]
     * @constructs
     * @extends enchant.EventTarget
     */
    initialize: function(node) {
        enchant.EventTarget.call(this);
        this.node = node;
        this.queue = [];
        this.paused = false;
        this.looped = false;
        this.isFrameBased = true;
        this._parallel = null;
        this._activated = false;
        this.addEventListener(enchant.Event.ENTER_FRAME, this.tick);

        var tl = this;
        this._nodeEventListener = function(e) {
            tl.dispatchEvent(e);
        };
    },
    /**
     * @private
     */
    _deactivateTimeline: function() {
        if (this._activated) {
            this._activated = false;
            this.node.removeEventListener('enterframe', this._nodeEventListener);
        }
    },
    /**
     * @private
     */
    _activateTimeline: function() {
        if (!this._activated && !this.paused) {
            this.node.addEventListener("enterframe", this._nodeEventListener);
            this._activated = true;
        }
    },
    /**
     [lang:ja]
     * 一つのenchant.Event.ENTER_FRAMEイベントはアニメーションに一つの時間単位になる. （デフォルト）
     [/lang]
     [lang:en]
     [/lang]
     [lang:de]
     [/lang]
     */
    setFrameBased: function() {
        this.isFrameBased = true;
    },
    /**
     [lang:ja]
     * 一つのenchant.Event.ENTER_FRAMEイベントはアニメーションに前のフレームから経過した時間になる.
     [/lang]
     [lang:en]
     [/lang]
     [lang:de]
     [/lang]
     */
    setTimeBased: function() {
        this.isFrameBased = false;
    },
    /**
     [lang:ja]
     * キューの先頭にあるアクションを終了し, 次のアクションへ移行する.
     * アクションの中から呼び出されるが, 外から呼び出すこともできる.
     *
     * アクション実行中に, アクションが終了した場合,
     * もう一度 tick() 関数が呼ばれるため, 1フレームに複数のアクションが処理される場合もある.
     *
     * @example
     * sprite.tl.then(function A(){ .. }).then(function B(){ .. });
     * // 最初のフレームで A・B の関数どちらも実行される.
     [/lang]
     [lang:en]
     [/lang]
     [lang:de]
     [/lang]
     */
    next: function(remainingTime) {
        var e, action = this.queue.shift();

        if (action) {
            e = new enchant.Event("actionend");
            e.timeline = this;
            action.dispatchEvent(e);

            e = new enchant.Event("removedfromtimeline");
            e.timeline = this;
            action.dispatchEvent(e);

            if (this.looped) {
                this.add(action);
            }
        }

        if (this.queue.length === 0) {
            this._deactivateTimeline();
            return;
        }

        if (remainingTime > 0 || (this.queue[0] && this.queue[0].time === 0)) {
            var event = new enchant.Event("enterframe");
            event.elapsed = remainingTime;
            this.dispatchEvent(event);
        }
    },
    /**
     [lang:ja]
     * 自身のenterframeイベントのリスナとして登録される関数.
     * 1フレーム経過する際に実行する処理が書かれている.
     * (キューの先頭にあるアクションに対して, actionstart/actiontickイベントを発行する)
     * @param {enchant.Event} enterFrameEvent enterframeイベント.
     [/lang]
     [lang:en]
     * @param {enchant.Event} enterFrameEvent
     [/lang]
     [lang:de]
     * @param {enchant.Event} enterFrameEvent
     [/lang]
     */
    tick: function(enterFrameEvent) {
        if (this.paused) {
            return;
        }
{'fraction_non_alphanumeric': 0.12516144182223787, 'fraction_numerical': 0.0017611835153222965, 'mean_word_length': 1.921124828532236, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7205719', 'n_tokens_mistral': 3392, 'n_tokens_neox': 3260, 'n_words': 502}