Greasy Fork is available in English.
Embed video, images from links.
// ==UserScript== // @name Embed Me! // @version 0.4.0 // @description Embed video, images from links. // @license MIT // @author eight04 <[email protected]> // @homepageURL https://github.com/eight04/embed-me // @supportURL https://github.com/eight04/embed-me/issues // @namespace eight04.blogspot.com // @grant GM_addStyle // @grant GM_registerMenuCommand // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue // @grant GM_xmlhttpRequest // @require https://greasyfork.org/scripts/371339-gm-webextpref/code/GM_webextPref.js?version=705415 // @connect gfycat.com // @connect soundcloud.com // @connect www.youtube.com // @noframes true // @include * // ==/UserScript== const _module_exports_$9 = {}; Object.defineProperty(_module_exports_$9, "__esModule", { value: true }); _module_exports_$9.parseRotation = _module_exports_$9.parseRotationName = _module_exports_$9.Rotation = _module_exports_$9.parsePiece = _module_exports_$9.parsePieceName = _module_exports_$9.isMinoPiece = _module_exports_$9.Piece = void 0; var Piece; (function (Piece) { Piece[Piece["Empty"] = 0] = "Empty"; Piece[Piece["I"] = 1] = "I"; Piece[Piece["L"] = 2] = "L"; Piece[Piece["O"] = 3] = "O"; Piece[Piece["Z"] = 4] = "Z"; Piece[Piece["T"] = 5] = "T"; Piece[Piece["J"] = 6] = "J"; Piece[Piece["S"] = 7] = "S"; Piece[Piece["Gray"] = 8] = "Gray"; })(Piece = _module_exports_$9.Piece || (_module_exports_$9.Piece = {})); function isMinoPiece(piece) { return piece !== Piece.Empty && piece !== Piece.Gray; } _module_exports_$9.isMinoPiece = isMinoPiece; function parsePieceName(piece) { switch (piece) { case Piece.I: return 'I'; case Piece.L: return 'L'; case Piece.O: return 'O'; case Piece.Z: return 'Z'; case Piece.T: return 'T'; case Piece.J: return 'J'; case Piece.S: return 'S'; case Piece.Gray: return 'X'; case Piece.Empty: return '_'; } throw new Error("Unknown piece: ".concat(piece)); } _module_exports_$9.parsePieceName = parsePieceName; function parsePiece(piece) { switch (piece.toUpperCase()) { case 'I': return Piece.I; case 'L': return Piece.L; case 'O': return Piece.O; case 'Z': return Piece.Z; case 'T': return Piece.T; case 'J': return Piece.J; case 'S': return Piece.S; case 'X': case 'GRAY': return Piece.Gray; case ' ': case '_': case 'EMPTY': return Piece.Empty; } throw new Error("Unknown piece: ".concat(piece)); } _module_exports_$9.parsePiece = parsePiece; var Rotation; (function (Rotation) { Rotation[Rotation["Spawn"] = 0] = "Spawn"; Rotation[Rotation["Right"] = 1] = "Right"; Rotation[Rotation["Reverse"] = 2] = "Reverse"; Rotation[Rotation["Left"] = 3] = "Left"; })(Rotation = _module_exports_$9.Rotation || (_module_exports_$9.Rotation = {})); function parseRotationName(rotation) { switch (rotation) { case Rotation.Spawn: return 'spawn'; case Rotation.Left: return 'left'; case Rotation.Right: return 'right'; case Rotation.Reverse: return 'reverse'; } throw new Error("Unknown rotation: ".concat(rotation)); } _module_exports_$9.parseRotationName = parseRotationName; function parseRotation(rotation) { switch (rotation.toLowerCase()) { case 'spawn': return Rotation.Spawn; case 'left': return Rotation.Left; case 'right': return Rotation.Right; case 'reverse': return Rotation.Reverse; } throw new Error("Unknown rotation: ".concat(rotation)); } _module_exports_$9.parseRotation = parseRotation; const _module_exports_$8 = {}; Object.defineProperty(_module_exports_$8, "__esModule", { value: true }); _module_exports_$8.getPieces = _module_exports_$8.getBlocks = _module_exports_$8.getBlockXYs = _module_exports_$8.getBlockPositions = _module_exports_$8.PlayField = _module_exports_$8.InnerField = _module_exports_$8.createInnerField = _module_exports_$8.createNewInnerField = void 0; var FieldConstants$2 = { Width: 10, Height: 23, PlayBlocks: 23 * 10, // Height * Width }; function createNewInnerField() { return new InnerField({}); } _module_exports_$8.createNewInnerField = createNewInnerField; function createInnerField(field) { var innerField = new InnerField({}); for (var y = -1; y < FieldConstants$2.Height; y += 1) { for (var x = 0; x < FieldConstants$2.Width; x += 1) { var at = field.at(x, y); innerField.setNumberAt(x, y, (0, _module_exports_$9.parsePiece)(at)); } } return innerField; } _module_exports_$8.createInnerField = createInnerField; var InnerField = /** @class */ (function () { function InnerField(_a) { var _b = _a.field, field = _b === void 0 ? InnerField.create(FieldConstants$2.PlayBlocks) : _b, _c = _a.garbage, garbage = _c === void 0 ? InnerField.create(FieldConstants$2.Width) : _c; this.field = field; this.garbage = garbage; } InnerField.create = function (length) { return new PlayField({ length: length }); }; InnerField.prototype.fill = function (operation) { this.field.fill(operation); }; InnerField.prototype.fillAll = function (positions, type) { this.field.fillAll(positions, type); }; InnerField.prototype.canFill = function (piece, rotation, x, y) { var _this = this; var positions = getBlockPositions(piece, rotation, x, y); return positions.every(function (_a) { var px = _a[0], py = _a[1]; return 0 <= px && px < 10 && 0 <= py && py < FieldConstants$2.Height && _this.getNumberAt(px, py) === _module_exports_$9.Piece.Empty; }); }; InnerField.prototype.canFillAll = function (positions) { var _this = this; return positions.every(function (_a) { var x = _a.x, y = _a.y; return 0 <= x && x < 10 && 0 <= y && y < FieldConstants$2.Height && _this.getNumberAt(x, y) === _module_exports_$9.Piece.Empty; }); }; InnerField.prototype.isOnGround = function (piece, rotation, x, y) { return !this.canFill(piece, rotation, x, y - 1); }; InnerField.prototype.clearLine = function () { this.field.clearLine(); }; InnerField.prototype.riseGarbage = function () { this.field.up(this.garbage); this.garbage.clearAll(); }; InnerField.prototype.mirror = function () { this.field.mirror(); }; InnerField.prototype.shiftToLeft = function () { this.field.shiftToLeft(); }; InnerField.prototype.shiftToRight = function () { this.field.shiftToRight(); }; InnerField.prototype.shiftToUp = function () { this.field.shiftToUp(); }; InnerField.prototype.shiftToBottom = function () { this.field.shiftToBottom(); }; InnerField.prototype.copy = function () { return new InnerField({ field: this.field.copy(), garbage: this.garbage.copy() }); }; InnerField.prototype.equals = function (other) { return this.field.equals(other.field) && this.garbage.equals(other.garbage); }; InnerField.prototype.addNumber = function (x, y, value) { if (0 <= y) { this.field.addOffset(x, y, value); } else { this.garbage.addOffset(x, -(y + 1), value); } }; InnerField.prototype.setNumberFieldAt = function (index, value) { this.field.setAt(index, value); }; InnerField.prototype.setNumberGarbageAt = function (index, value) { this.garbage.setAt(index, value); }; InnerField.prototype.setNumberAt = function (x, y, value) { return 0 <= y ? this.field.set(x, y, value) : this.garbage.set(x, -(y + 1), value); }; InnerField.prototype.getNumberAt = function (x, y) { return 0 <= y ? this.field.get(x, y) : this.garbage.get(x, -(y + 1)); }; InnerField.prototype.getNumberAtIndex = function (index, isField) { if (isField) { return this.getNumberAt(index % 10, Math.floor(index / 10)); } return this.getNumberAt(index % 10, -(Math.floor(index / 10) + 1)); }; InnerField.prototype.toFieldNumberArray = function () { return this.field.toArray(); }; InnerField.prototype.toGarbageNumberArray = function () { return this.garbage.toArray(); }; return InnerField; }()); _module_exports_$8.InnerField = InnerField; var PlayField = /** @class */ (function () { function PlayField(_a) { var pieces = _a.pieces, _b = _a.length, length = _b === void 0 ? FieldConstants$2.PlayBlocks : _b; if (pieces !== undefined) { this.pieces = pieces; } else { this.pieces = Array.from({ length: length }).map(function () { return _module_exports_$9.Piece.Empty; }); } this.length = length; } PlayField.load = function () { var lines = []; for (var _i = 0; _i < arguments.length; _i++) { lines[_i] = arguments[_i]; } var blocks = lines.join('').trim(); return PlayField.loadInner(blocks); }; PlayField.loadMinify = function () { var lines = []; for (var _i = 0; _i < arguments.length; _i++) { lines[_i] = arguments[_i]; } var blocks = lines.join('').trim(); return PlayField.loadInner(blocks, blocks.length); }; PlayField.loadInner = function (blocks, length) { var len = length !== undefined ? length : blocks.length; if (len % 10 !== 0) { throw new Error('Num of blocks in field should be mod 10'); } var field = length !== undefined ? new PlayField({ length: length }) : new PlayField({}); for (var index = 0; index < len; index += 1) { var block = blocks[index]; field.set(index % 10, Math.floor((len - index - 1) / 10), (0, _module_exports_$9.parsePiece)(block)); } return field; }; PlayField.prototype.get = function (x, y) { return this.pieces[x + y * FieldConstants$2.Width]; }; PlayField.prototype.addOffset = function (x, y, value) { this.pieces[x + y * FieldConstants$2.Width] += value; }; PlayField.prototype.set = function (x, y, piece) { this.setAt(x + y * FieldConstants$2.Width, piece); }; PlayField.prototype.setAt = function (index, piece) { this.pieces[index] = piece; }; PlayField.prototype.fill = function (_a) { var type = _a.type, rotation = _a.rotation, x = _a.x, y = _a.y; var blocks = getBlocks(type, rotation); for (var _i = 0, blocks_1 = blocks; _i < blocks_1.length; _i++) { var block = blocks_1[_i]; var _b = [x + block[0], y + block[1]], nx = _b[0], ny = _b[1]; this.set(nx, ny, type); } }; PlayField.prototype.fillAll = function (positions, type) { for (var _i = 0, positions_1 = positions; _i < positions_1.length; _i++) { var _a = positions_1[_i], x = _a.x, y = _a.y; this.set(x, y, type); } }; PlayField.prototype.clearLine = function () { var newField = this.pieces.concat(); var top = this.pieces.length / FieldConstants$2.Width - 1; for (var y = top; 0 <= y; y -= 1) { var line = this.pieces.slice(y * FieldConstants$2.Width, (y + 1) * FieldConstants$2.Width); var isFilled = line.every(function (value) { return value !== _module_exports_$9.Piece.Empty; }); if (isFilled) { var bottom = newField.slice(0, y * FieldConstants$2.Width); var over = newField.slice((y + 1) * FieldConstants$2.Width); newField = bottom.concat(over, Array.from({ length: FieldConstants$2.Width }).map(function () { return _module_exports_$9.Piece.Empty; })); } } this.pieces = newField; }; PlayField.prototype.up = function (blockUp) { this.pieces = blockUp.pieces.concat(this.pieces).slice(0, this.length); }; PlayField.prototype.mirror = function () { var newField = []; for (var y = 0; y < this.pieces.length; y += 1) { var line = this.pieces.slice(y * FieldConstants$2.Width, (y + 1) * FieldConstants$2.Width); line.reverse(); for (var _i = 0, line_1 = line; _i < line_1.length; _i++) { var obj = line_1[_i]; newField.push(obj); } } this.pieces = newField; }; PlayField.prototype.shiftToLeft = function () { var height = this.pieces.length / 10; for (var y = 0; y < height; y += 1) { for (var x = 0; x < FieldConstants$2.Width - 1; x += 1) { this.pieces[x + y * FieldConstants$2.Width] = this.pieces[x + 1 + y * FieldConstants$2.Width]; } this.pieces[9 + y * FieldConstants$2.Width] = _module_exports_$9.Piece.Empty; } }; PlayField.prototype.shiftToRight = function () { var height = this.pieces.length / 10; for (var y = 0; y < height; y += 1) { for (var x = FieldConstants$2.Width - 1; 1 <= x; x -= 1) { this.pieces[x + y * FieldConstants$2.Width] = this.pieces[x - 1 + y * FieldConstants$2.Width]; } this.pieces[y * FieldConstants$2.Width] = _module_exports_$9.Piece.Empty; } }; PlayField.prototype.shiftToUp = function () { var blanks = Array.from({ length: 10 }).map(function () { return _module_exports_$9.Piece.Empty; }); this.pieces = blanks.concat(this.pieces).slice(0, this.length); }; PlayField.prototype.shiftToBottom = function () { var blanks = Array.from({ length: 10 }).map(function () { return _module_exports_$9.Piece.Empty; }); this.pieces = this.pieces.slice(10, this.length).concat(blanks); }; PlayField.prototype.toArray = function () { return this.pieces.concat(); }; Object.defineProperty(PlayField.prototype, "numOfBlocks", { get: function () { return this.pieces.length; }, enumerable: false, configurable: true }); PlayField.prototype.copy = function () { return new PlayField({ pieces: this.pieces.concat(), length: this.length }); }; PlayField.prototype.toShallowArray = function () { return this.pieces; }; PlayField.prototype.clearAll = function () { this.pieces = this.pieces.map(function () { return _module_exports_$9.Piece.Empty; }); }; PlayField.prototype.equals = function (other) { if (this.pieces.length !== other.pieces.length) { return false; } for (var index = 0; index < this.pieces.length; index += 1) { if (this.pieces[index] !== other.pieces[index]) { return false; } } return true; }; return PlayField; }()); _module_exports_$8.PlayField = PlayField; function getBlockPositions(piece, rotation, x, y) { return getBlocks(piece, rotation).map(function (position) { position[0] += x; position[1] += y; return position; }); } _module_exports_$8.getBlockPositions = getBlockPositions; function getBlockXYs(piece, rotation, x, y) { return getBlocks(piece, rotation).map(function (position) { return { x: position[0] + x, y: position[1] + y }; }); } _module_exports_$8.getBlockXYs = getBlockXYs; function getBlocks(piece, rotation) { var blocks = getPieces(piece); switch (rotation) { case _module_exports_$9.Rotation.Spawn: return blocks; case _module_exports_$9.Rotation.Left: return rotateLeft(blocks); case _module_exports_$9.Rotation.Reverse: return rotateReverse(blocks); case _module_exports_$9.Rotation.Right: return rotateRight(blocks); } throw new Error('Unsupported block'); } _module_exports_$8.getBlocks = getBlocks; function getPieces(piece) { switch (piece) { case _module_exports_$9.Piece.I: return [[0, 0], [-1, 0], [1, 0], [2, 0]]; case _module_exports_$9.Piece.T: return [[0, 0], [-1, 0], [1, 0], [0, 1]]; case _module_exports_$9.Piece.O: return [[0, 0], [1, 0], [0, 1], [1, 1]]; case _module_exports_$9.Piece.L: return [[0, 0], [-1, 0], [1, 0], [1, 1]]; case _module_exports_$9.Piece.J: return [[0, 0], [-1, 0], [1, 0], [-1, 1]]; case _module_exports_$9.Piece.S: return [[0, 0], [-1, 0], [0, 1], [1, 1]]; case _module_exports_$9.Piece.Z: return [[0, 0], [1, 0], [0, 1], [-1, 1]]; } throw new Error('Unsupported rotation'); } _module_exports_$8.getPieces = getPieces; function rotateRight(positions) { return positions.map(function (current) { return [current[1], -current[0]]; }); } function rotateLeft(positions) { return positions.map(function (current) { return [-current[1], current[0]]; }); } function rotateReverse(positions) { return positions.map(function (current) { return [-current[0], -current[1]]; }); } const _module_exports_$7 = {}; Object.defineProperty(_module_exports_$7, "__esModule", { value: true }); _module_exports_$7.Buffer = void 0; var ENCODE_TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; var Buffer = /** @class */ (function () { function Buffer(data) { if (data === void 0) { data = ''; } this.values = data.split('').map(decodeToValue); } Buffer.prototype.poll = function (max) { var value = 0; for (var count = 0; count < max; count += 1) { var v = this.values.shift(); if (v === undefined) { throw new Error('Unexpected fumen'); } value += v * Math.pow(Buffer.tableLength, count); } return value; }; Buffer.prototype.push = function (value, splitCount) { if (splitCount === void 0) { splitCount = 1; } var current = value; for (var count = 0; count < splitCount; count += 1) { this.values.push(current % Buffer.tableLength); current = Math.floor(current / Buffer.tableLength); } }; Buffer.prototype.merge = function (postBuffer) { for (var _i = 0, _a = postBuffer.values; _i < _a.length; _i++) { var value = _a[_i]; this.values.push(value); } }; Buffer.prototype.isEmpty = function () { return this.values.length === 0; }; Object.defineProperty(Buffer.prototype, "length", { get: function () { return this.values.length; }, enumerable: false, configurable: true }); Buffer.prototype.get = function (index) { return this.values[index]; }; Buffer.prototype.set = function (index, value) { this.values[index] = value; }; Buffer.prototype.toString = function () { return this.values.map(encodeFromValue).join(''); }; Buffer.tableLength = ENCODE_TABLE.length; return Buffer; }()); _module_exports_$7.Buffer = Buffer; function decodeToValue(v) { return ENCODE_TABLE.indexOf(v); } function encodeFromValue(index) { return ENCODE_TABLE[index]; } const _module_exports_$6 = {}; var __assign$2 = (undefined && undefined.__assign) || function () { __assign$2 = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign$2.apply(this, arguments); }; Object.defineProperty(_module_exports_$6, "__esModule", { value: true }); _module_exports_$6.createActionEncoder = _module_exports_$6.createActionDecoder = void 0; function decodeBool(n) { return n !== 0; } var createActionDecoder = function (width, fieldTop, garbageLine) { var fieldMaxHeight = fieldTop + garbageLine; var numFieldBlocks = fieldMaxHeight * width; function decodePiece(n) { switch (n) { case 0: return _module_exports_$9.Piece.Empty; case 1: return _module_exports_$9.Piece.I; case 2: return _module_exports_$9.Piece.L; case 3: return _module_exports_$9.Piece.O; case 4: return _module_exports_$9.Piece.Z; case 5: return _module_exports_$9.Piece.T; case 6: return _module_exports_$9.Piece.J; case 7: return _module_exports_$9.Piece.S; case 8: return _module_exports_$9.Piece.Gray; } throw new Error('Unexpected piece'); } function decodeRotation(n) { switch (n) { case 0: return _module_exports_$9.Rotation.Reverse; case 1: return _module_exports_$9.Rotation.Right; case 2: return _module_exports_$9.Rotation.Spawn; case 3: return _module_exports_$9.Rotation.Left; } throw new Error('Unexpected rotation'); } function decodeCoordinate(n, piece, rotation) { var x = n % width; var originY = Math.floor(n / 10); var y = fieldTop - originY - 1; if (piece === _module_exports_$9.Piece.O && rotation === _module_exports_$9.Rotation.Left) { x += 1; y -= 1; } else if (piece === _module_exports_$9.Piece.O && rotation === _module_exports_$9.Rotation.Reverse) { x += 1; } else if (piece === _module_exports_$9.Piece.O && rotation === _module_exports_$9.Rotation.Spawn) { y -= 1; } else if (piece === _module_exports_$9.Piece.I && rotation === _module_exports_$9.Rotation.Reverse) { x += 1; } else if (piece === _module_exports_$9.Piece.I && rotation === _module_exports_$9.Rotation.Left) { y -= 1; } else if (piece === _module_exports_$9.Piece.S && rotation === _module_exports_$9.Rotation.Spawn) { y -= 1; } else if (piece === _module_exports_$9.Piece.S && rotation === _module_exports_$9.Rotation.Right) { x -= 1; } else if (piece === _module_exports_$9.Piece.Z && rotation === _module_exports_$9.Rotation.Spawn) { y -= 1; } else if (piece === _module_exports_$9.Piece.Z && rotation === _module_exports_$9.Rotation.Left) { x += 1; } return { x: x, y: y }; } return { decode: function (v) { var value = v; var type = decodePiece(value % 8); value = Math.floor(value / 8); var rotation = decodeRotation(value % 4); value = Math.floor(value / 4); var coordinate = decodeCoordinate(value % numFieldBlocks, type, rotation); value = Math.floor(value / numFieldBlocks); var isBlockUp = decodeBool(value % 2); value = Math.floor(value / 2); var isMirror = decodeBool(value % 2); value = Math.floor(value / 2); var isColor = decodeBool(value % 2); value = Math.floor(value / 2); var isComment = decodeBool(value % 2); value = Math.floor(value / 2); var isLock = !decodeBool(value % 2); return { rise: isBlockUp, mirror: isMirror, colorize: isColor, comment: isComment, lock: isLock, piece: __assign$2(__assign$2({}, coordinate), { type: type, rotation: rotation }), }; }, }; }; _module_exports_$6.createActionDecoder = createActionDecoder; function encodeBool(flag) { return flag ? 1 : 0; } var createActionEncoder = function (width, fieldTop, garbageLine) { var fieldMaxHeight = fieldTop + garbageLine; var numFieldBlocks = fieldMaxHeight * width; function encodePosition(operation) { var type = operation.type, rotation = operation.rotation; var x = operation.x; var y = operation.y; if (!(0, _module_exports_$9.isMinoPiece)(type)) { x = 0; y = 22; } else if (type === _module_exports_$9.Piece.O && rotation === _module_exports_$9.Rotation.Left) { x -= 1; y += 1; } else if (type === _module_exports_$9.Piece.O && rotation === _module_exports_$9.Rotation.Reverse) { x -= 1; } else if (type === _module_exports_$9.Piece.O && rotation === _module_exports_$9.Rotation.Spawn) { y += 1; } else if (type === _module_exports_$9.Piece.I && rotation === _module_exports_$9.Rotation.Reverse) { x -= 1; } else if (type === _module_exports_$9.Piece.I && rotation === _module_exports_$9.Rotation.Left) { y += 1; } else if (type === _module_exports_$9.Piece.S && rotation === _module_exports_$9.Rotation.Spawn) { y += 1; } else if (type === _module_exports_$9.Piece.S && rotation === _module_exports_$9.Rotation.Right) { x += 1; } else if (type === _module_exports_$9.Piece.Z && rotation === _module_exports_$9.Rotation.Spawn) { y += 1; } else if (type === _module_exports_$9.Piece.Z && rotation === _module_exports_$9.Rotation.Left) { x -= 1; } return (fieldTop - y - 1) * width + x; } function encodeRotation(_a) { var type = _a.type, rotation = _a.rotation; if (!(0, _module_exports_$9.isMinoPiece)(type)) { return 0; } switch (rotation) { case _module_exports_$9.Rotation.Reverse: return 0; case _module_exports_$9.Rotation.Right: return 1; case _module_exports_$9.Rotation.Spawn: return 2; case _module_exports_$9.Rotation.Left: return 3; } throw new Error('No reachable'); } return { encode: function (action) { var lock = action.lock, comment = action.comment, colorize = action.colorize, mirror = action.mirror, rise = action.rise, piece = action.piece; var value = encodeBool(!lock); value *= 2; value += encodeBool(comment); value *= 2; value += (encodeBool(colorize)); value *= 2; value += encodeBool(mirror); value *= 2; value += encodeBool(rise); value *= numFieldBlocks; value += encodePosition(piece); value *= 4; value += encodeRotation(piece); value *= 8; value += piece.type; return value; }, }; }; _module_exports_$6.createActionEncoder = createActionEncoder; const _module_exports_$5 = {}; Object.defineProperty(_module_exports_$5, "__esModule", { value: true }); _module_exports_$5.createCommentParser = void 0; var COMMENT_TABLE = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'; var MAX_COMMENT_CHAR_VALUE = COMMENT_TABLE.length + 1; var createCommentParser = function () { return { decode: function (v) { var str = ''; var value = v; for (var count = 0; count < 4; count += 1) { var index = value % MAX_COMMENT_CHAR_VALUE; str += COMMENT_TABLE[index]; value = Math.floor(value / MAX_COMMENT_CHAR_VALUE); } return str; }, encode: function (ch, count) { return COMMENT_TABLE.indexOf(ch) * Math.pow(MAX_COMMENT_CHAR_VALUE, count); }, }; }; _module_exports_$5.createCommentParser = createCommentParser; const _module_exports_$4 = {}; Object.defineProperty(_module_exports_$4, "__esModule", { value: true }); _module_exports_$4.Quiz = void 0; var Operation; (function (Operation) { Operation["Direct"] = "direct"; Operation["Swap"] = "swap"; Operation["Stock"] = "stock"; })(Operation || (Operation = {})); var Quiz = /** @class */ (function () { function Quiz(quiz) { this.quiz = Quiz.verify(quiz); } Object.defineProperty(Quiz.prototype, "next", { get: function () { var index = this.quiz.indexOf(')') + 1; var name = this.quiz[index]; if (name === undefined || name === ';') { return ''; } return name; }, enumerable: false, configurable: true }); Quiz.isQuizComment = function (comment) { return comment.startsWith('#Q='); }; Quiz.create = function (first, second) { var create = function (hold, other) { var parse = function (s) { return s ? s : ''; }; return new Quiz("#Q=[".concat(parse(hold), "](").concat(parse(other[0]), ")").concat(parse(other.substring(1)))); }; return second !== undefined ? create(first, second) : create(undefined, first); }; Quiz.trim = function (quiz) { return quiz.trim().replace(/\s+/g, ''); }; Object.defineProperty(Quiz.prototype, "least", { get: function () { var index = this.quiz.indexOf(')'); return this.quiz.substr(index + 1); }, enumerable: false, configurable: true }); Object.defineProperty(Quiz.prototype, "current", { get: function () { var index = this.quiz.indexOf('(') + 1; var name = this.quiz[index]; if (name === ')') { return ''; } return name; }, enumerable: false, configurable: true }); Object.defineProperty(Quiz.prototype, "hold", { get: function () { var index = this.quiz.indexOf('[') + 1; var name = this.quiz[index]; if (name === ']') { return ''; } return name; }, enumerable: false, configurable: true }); Object.defineProperty(Quiz.prototype, "leastAfterNext2", { get: function () { var index = this.quiz.indexOf(')'); if (this.quiz[index + 1] === ';') { return this.quiz.substr(index + 1); } return this.quiz.substr(index + 2); }, enumerable: false, configurable: true }); Quiz.prototype.getOperation = function (used) { var usedName = (0, _module_exports_$9.parsePieceName)(used); var current = this.current; if (usedName === current) { return Operation.Direct; } var hold = this.hold; if (usedName === hold) { return Operation.Swap; } // 次のミノを利用できる if (hold === '') { if (usedName === this.next) { return Operation.Stock; } } else { if (current === '' && usedName === this.next) { return Operation.Direct; } } throw new Error("Unexpected hold piece in quiz: ".concat(this.quiz)); }; Object.defineProperty(Quiz.prototype, "leastInActiveBag", { get: function () { var separateIndex = this.quiz.indexOf(';'); var quiz = 0 <= separateIndex ? this.quiz.substring(0, separateIndex) : this.quiz; var index = quiz.indexOf(')'); if (quiz[index + 1] === ';') { return quiz.substr(index + 1); } return quiz.substr(index + 2); }, enumerable: false, configurable: true }); Quiz.verify = function (quiz) { var replaced = this.trim(quiz); if (replaced.length === 0 || quiz === '#Q=[]()' || !quiz.startsWith('#Q=')) { return quiz; } if (!replaced.match(/^#Q=\[[TIOSZJL]?]\([TIOSZJL]?\)[TIOSZJL]*;?.*$/i)) { throw new Error("Current piece doesn't exist, however next pieces exist: ".concat(quiz)); } return replaced; }; Quiz.prototype.direct = function () { if (this.current === '') { var least = this.leastAfterNext2; return new Quiz("#Q=[".concat(this.hold, "](").concat(least[0], ")").concat(least.substr(1))); } return new Quiz("#Q=[".concat(this.hold, "](").concat(this.next, ")").concat(this.leastAfterNext2)); }; Quiz.prototype.swap = function () { if (this.hold === '') { throw new Error("Cannot find hold piece: ".concat(this.quiz)); } var next = this.next; return new Quiz("#Q=[".concat(this.current, "](").concat(next, ")").concat(this.leastAfterNext2)); }; Quiz.prototype.stock = function () { if (this.hold !== '' || this.next === '') { throw new Error("Cannot stock: ".concat(this.quiz)); } var least = this.leastAfterNext2; var head = least[0] !== undefined ? least[0] : ''; if (1 < least.length) { return new Quiz("#Q=[".concat(this.current, "](").concat(head, ")").concat(least.substr(1))); } return new Quiz("#Q=[".concat(this.current, "](").concat(head, ")")); }; Quiz.prototype.operate = function (operation) { switch (operation) { case Operation.Direct: return this.direct(); case Operation.Swap: return this.swap(); case Operation.Stock: return this.stock(); } throw new Error('Unexpected operation'); }; Quiz.prototype.format = function () { var quiz = this.nextIfEnd(); if (quiz.quiz === '#Q=[]()') { return new Quiz(''); } var current = quiz.current; var hold = quiz.hold; if (current === '' && hold !== '') { return new Quiz("#Q=[](".concat(hold, ")").concat(quiz.least)); } if (current === '') { var least = quiz.least; var head = least[0]; if (head === undefined) { return new Quiz(''); } if (head === ';') { return new Quiz(least.substr(1)); } return new Quiz("#Q=[](".concat(head, ")").concat(least.substr(1))); } return quiz; }; Quiz.prototype.getHoldPiece = function () { if (!this.canOperate()) { return _module_exports_$9.Piece.Empty; } var name = this.hold; if (name === undefined || name === '' || name === ';') { return _module_exports_$9.Piece.Empty; } return (0, _module_exports_$9.parsePiece)(name); }; Quiz.prototype.getNextPieces = function (max) { if (!this.canOperate()) { return max !== undefined ? Array.from({ length: max }).map(function () { return _module_exports_$9.Piece.Empty; }) : []; } var names = (this.current + this.next + this.leastInActiveBag).substr(0, max); if (max !== undefined && names.length < max) { names += ' '.repeat(max - names.length); } return names.split('').map(function (name) { if (name === undefined || name === ' ' || name === ';') { return _module_exports_$9.Piece.Empty; } return (0, _module_exports_$9.parsePiece)(name); }); }; Quiz.prototype.toString = function () { return this.quiz; }; Quiz.prototype.canOperate = function () { var quiz = this.quiz; if (quiz.startsWith('#Q=[]();')) { quiz = this.quiz.substr(8); } return quiz.startsWith('#Q=') && quiz !== '#Q=[]()'; }; Quiz.prototype.nextIfEnd = function () { if (this.quiz.startsWith('#Q=[]();')) { return new Quiz(this.quiz.substr(8)); } return this; }; return Quiz; }()); _module_exports_$4.Quiz = Quiz; const _module_exports_$3 = {}; var __assign$1 = (undefined && undefined.__assign) || function () { __assign$1 = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign$1.apply(this, arguments); }; Object.defineProperty(_module_exports_$3, "__esModule", { value: true }); _module_exports_$3.Mino = _module_exports_$3.Field = void 0; function toMino(operationOrMino) { return operationOrMino instanceof Mino ? operationOrMino.copy() : Mino.from(operationOrMino); } var Field = /** @class */ (function () { function Field(field) { this.field = field; } Field.create = function (field, garbage) { return new Field(new _module_exports_$8.InnerField({ field: field !== undefined ? _module_exports_$8.PlayField.load(field) : undefined, garbage: garbage !== undefined ? _module_exports_$8.PlayField.loadMinify(garbage) : undefined, })); }; Field.prototype.canFill = function (operation) { if (operation === undefined) { return true; } var mino = toMino(operation); return this.field.canFillAll(mino.positions()); }; Field.prototype.canLock = function (operation) { if (operation === undefined) { return true; } if (!this.canFill(operation)) { return false; } // Check on the ground return !this.canFill(__assign$1(__assign$1({}, operation), { y: operation.y - 1 })); }; Field.prototype.fill = function (operation, force) { if (force === void 0) { force = false; } if (operation === undefined) { return undefined; } var mino = toMino(operation); if (!force && !this.canFill(mino)) { throw Error('Cannot fill piece on field'); } this.field.fillAll(mino.positions(), (0, _module_exports_$9.parsePiece)(mino.type)); return mino; }; Field.prototype.put = function (operation) { if (operation === undefined) { return undefined; } var mino = toMino(operation); for (; 0 <= mino.y; mino.y -= 1) { if (!this.canLock(mino)) { continue; } this.fill(mino); return mino; } throw Error('Cannot put piece on field'); }; Field.prototype.clearLine = function () { this.field.clearLine(); }; Field.prototype.at = function (x, y) { return (0, _module_exports_$9.parsePieceName)(this.field.getNumberAt(x, y)); }; Field.prototype.set = function (x, y, type) { this.field.setNumberAt(x, y, (0, _module_exports_$9.parsePiece)(type)); }; Field.prototype.copy = function () { return new Field(this.field.copy()); }; Field.prototype.str = function (option) { if (option === void 0) { option = {}; } var skip = option.reduced !== undefined ? option.reduced : true; var separator = option.separator !== undefined ? option.separator : '\n'; var minY = option.garbage === undefined || option.garbage ? -1 : 0; var output = ''; for (var y = 22; minY <= y; y -= 1) { var line = ''; for (var x = 0; x < 10; x += 1) { line += this.at(x, y); } if (skip && line === '__________') { continue; } skip = false; output += line; if (y !== minY) { output += separator; } } return output; }; return Field; }()); _module_exports_$3.Field = Field; var Mino = /** @class */ (function () { function Mino(type, rotation, x, y) { this.type = type; this.rotation = rotation; this.x = x; this.y = y; } Mino.from = function (operation) { return new Mino(operation.type, operation.rotation, operation.x, operation.y); }; Mino.prototype.positions = function () { return (0, _module_exports_$8.getBlockXYs)((0, _module_exports_$9.parsePiece)(this.type), (0, _module_exports_$9.parseRotation)(this.rotation), this.x, this.y).sort(function (a, b) { if (a.y === b.y) { return a.x - b.x; } return a.y - b.y; }); }; Mino.prototype.operation = function () { return { type: this.type, rotation: this.rotation, x: this.x, y: this.y, }; }; Mino.prototype.isValid = function () { try { (0, _module_exports_$9.parsePiece)(this.type); (0, _module_exports_$9.parseRotation)(this.rotation); } catch (e) { return false; } return this.positions().every(function (_a) { var x = _a.x, y = _a.y; return 0 <= x && x < 10 && 0 <= y && y < 23; }); }; Mino.prototype.copy = function () { return new Mino(this.type, this.rotation, this.x, this.y); }; return Mino; }()); _module_exports_$3.Mino = Mino; const _module_exports_$2 = {}; Object.defineProperty(_module_exports_$2, "__esModule", { value: true }); _module_exports_$2.decode = _module_exports_$2.extract = _module_exports_$2.Page = void 0; var Page = /** @class */ (function () { function Page(index, field, operation, comment, flags, refs) { this.index = index; this.operation = operation; this.comment = comment; this.flags = flags; this.refs = refs; this._field = field.copy(); } Object.defineProperty(Page.prototype, "field", { get: function () { return new _module_exports_$3.Field(this._field.copy()); }, set: function (field) { this._field = (0, _module_exports_$8.createInnerField)(field); }, enumerable: false, configurable: true }); Page.prototype.mino = function () { return _module_exports_$3.Mino.from(this.operation); }; return Page; }()); _module_exports_$2.Page = Page; var FieldConstants$1 = { GarbageLine: 1, Width: 10, }; function extract(str) { var format = function (version, data) { var trim = data.trim().replace(/[?\s]+/g, ''); return { version: version, data: trim }; }; var data = str; // url parameters var paramIndex = data.indexOf('&'); if (0 <= paramIndex) { data = data.substring(0, paramIndex); } // v115@~ { var match = str.match(/[vmd]115@/); if (match !== undefined && match !== null && match.index !== undefined) { var sub = data.substr(match.index + 5); return format('115', sub); } } // v110@~ { var match = str.match(/[vmd]110@/); if (match !== undefined && match !== null && match.index !== undefined) { var sub = data.substr(match.index + 5); return format('110', sub); } } throw new Error('Unsupported fumen version'); } _module_exports_$2.extract = extract; function decode(fumen) { var _a = extract(fumen), version = _a.version, data = _a.data; switch (version) { case '115': return innerDecode(data, 23); case '110': return innerDecode(data, 21); } throw new Error('Unsupported fumen version'); } _module_exports_$2.decode = decode; function innerDecode(data, fieldTop) { var fieldMaxHeight = fieldTop + FieldConstants$1.GarbageLine; var numFieldBlocks = fieldMaxHeight * FieldConstants$1.Width; var buffer = new _module_exports_$7.Buffer(data); var updateField = function (prev) { var r###lt = { changed: true, field: prev, }; var index = 0; while (index < numFieldBlocks) { var diffBlock = buffer.poll(2); var diff = Math.floor(diffBlock / numFieldBlocks); var numOfBlocks = diffBlock % numFieldBlocks; if (diff === 8 && numOfBlocks === numFieldBlocks - 1) { r###lt.changed = false; } for (var block = 0; block < numOfBlocks + 1; block += 1) { var x = index % FieldConstants$1.Width; var y = fieldTop - Math.floor(index / FieldConstants$1.Width) - 1; r###lt.field.addNumber(x, y, diff - 8); index += 1; } } return r###lt; }; var pageIndex = 0; var prevField = (0, _module_exports_$8.createNewInnerField)(); var store = { repeatCount: -1, refIndex: { comment: 0, field: 0, }, quiz: undefined, lastCommentText: '', }; var pages = []; var actionDecoder = (0, _module_exports_$6.createActionDecoder)(FieldConstants$1.Width, fieldTop, FieldConstants$1.GarbageLine); var commentDecoder = (0, _module_exports_$5.createCommentParser)(); while (!buffer.isEmpty()) { // Parse field var currentFieldObj = void 0; if (0 < store.repeatCount) { currentFieldObj = { field: prevField, changed: false, }; store.repeatCount -= 1; } else { currentFieldObj = updateField(prevField.copy()); if (!currentFieldObj.changed) { store.repeatCount = buffer.poll(1); } } // Parse action var actionValue = buffer.poll(3); var action = actionDecoder.decode(actionValue); // Parse comment var comment = void 0; if (action.comment) { // コメントに更新があるとき var commentValues = []; var commentLength = buffer.poll(2); for (var commentCounter = 0; commentCounter < Math.floor((commentLength + 3) / 4); commentCounter += 1) { var commentValue = buffer.poll(5); commentValues.push(commentValue); } var flatten = ''; for (var _i = 0, commentValues_1 = commentValues; _i < commentValues_1.length; _i++) { var value = commentValues_1[_i]; flatten += commentDecoder.decode(value); } var commentText = unescape(flatten.slice(0, commentLength)); store.lastCommentText = commentText; comment = { text: commentText }; store.refIndex.comment = pageIndex; var text = comment.text; if (_module_exports_$4.Quiz.isQuizComment(text)) { try { store.quiz = new _module_exports_$4.Quiz(text); } catch (e) { store.quiz = undefined; } } else { store.quiz = undefined; } } else if (pageIndex === 0) { // コメントに更新がないが、先頭のページのとき comment = { text: '' }; } else { // コメントに更新がないとき comment = { text: store.quiz !== undefined ? store.quiz.format().toString() : undefined, ref: store.refIndex.comment, }; } // Quiz用の操作を取得し、次ページ開始時点のQuizに1手進める var quiz = false; if (store.quiz !== undefined) { quiz = true; if (store.quiz.canOperate() && action.lock) { if ((0, _module_exports_$9.isMinoPiece)(action.piece.type)) { try { var nextQuiz = store.quiz.nextIfEnd(); var operation = nextQuiz.getOperation(action.piece.type); store.quiz = nextQuiz.operate(operation); } catch (e) { // console.error(e.message); // Not operate store.quiz = store.quiz.format(); } } else { store.quiz = store.quiz.format(); } } } // データ処理用に加工する var currentPiece = void 0; if (action.piece.type !== _module_exports_$9.Piece.Empty) { currentPiece = action.piece; } // pageの作成 var field = void 0; if (currentFieldObj.changed || pageIndex === 0) { // フィールドに変化があったとき // フィールドに変化がなかったが、先頭のページだったとき field = {}; store.refIndex.field = pageIndex; } else { // フィールドに変化がないとき field = { ref: store.refIndex.field }; } pages.push(new Page(pageIndex, currentFieldObj.field, currentPiece !== undefined ? _module_exports_$3.Mino.from({ type: (0, _module_exports_$9.parsePieceName)(currentPiece.type), rotation: (0, _module_exports_$9.parseRotationName)(currentPiece.rotation), x: currentPiece.x, y: currentPiece.y, }) : undefined, comment.text !== undefined ? comment.text : store.lastCommentText, { quiz: quiz, lock: action.lock, mirror: action.mirror, colorize: action.colorize, rise: action.rise, }, { field: field.ref, comment: comment.ref, })); // callback( // currentFieldObj.field.copy() // , currentPiece // , store.quiz !== undefined ? store.quiz.format().toString() : store.lastCommentText, // ); pageIndex += 1; if (action.lock) { if ((0, _module_exports_$9.isMinoPiece)(action.piece.type)) { currentFieldObj.field.fill(action.piece); } currentFieldObj.field.clearLine(); if (action.rise) { currentFieldObj.field.riseGarbage(); } if (action.mirror) { currentFieldObj.field.mirror(); } } prevField = currentFieldObj.field; } return pages; } const _module_exports_$1 = {}; var __assign = (undefined && undefined.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; Object.defineProperty(_module_exports_$1, "__esModule", { value: true }); _module_exports_$1.encode = void 0; var FieldConstants = { GarbageLine: 1, Width: 10, }; function encode(pages) { var updateField = function (prev, current) { var _a = encodeField(prev, current), changed = _a.changed, values = _a.values; if (changed) { // フィールドを記録して、リピートを終了する buffer.merge(values); lastRepeatIndex = -1; } else if (lastRepeatIndex < 0 || buffer.get(lastRepeatIndex) === _module_exports_$7.Buffer.tableLength - 1) { // フィールドを記録して、リピートを開始する buffer.merge(values); buffer.push(0); lastRepeatIndex = buffer.length - 1; } else if (buffer.get(lastRepeatIndex) < (_module_exports_$7.Buffer.tableLength - 1)) { // フィールドは記録せず、リピートを進める var currentRepeatValue = buffer.get(lastRepeatIndex); buffer.set(lastRepeatIndex, currentRepeatValue + 1); } }; var lastRepeatIndex = -1; var buffer = new _module_exports_$7.Buffer(); var prevField = (0, _module_exports_$8.createNewInnerField)(); var actionEncoder = (0, _module_exports_$6.createActionEncoder)(FieldConstants.Width, 23, FieldConstants.GarbageLine); var commentParser = (0, _module_exports_$5.createCommentParser)(); var prevComment = ''; var prevQuiz = undefined; var innerEncode = function (index) { var currentPage = pages[index]; currentPage.flags = currentPage.flags ? currentPage.flags : {}; var field = currentPage.field; var currentField = field !== undefined ? (0, _module_exports_$8.createInnerField)(field) : prevField.copy(); // フィールドの更新 updateField(prevField, currentField); // アクションの更新 var currentComment = currentPage.comment !== undefined ? ((index !== 0 || currentPage.comment !== '') ? currentPage.comment : undefined) : undefined; var piece = currentPage.operation !== undefined ? { type: (0, _module_exports_$9.parsePiece)(currentPage.operation.type), rotation: (0, _module_exports_$9.parseRotation)(currentPage.operation.rotation), x: currentPage.operation.x, y: currentPage.operation.y, } : { type: _module_exports_$9.Piece.Empty, rotation: _module_exports_$9.Rotation.Reverse, x: 0, y: 22, }; var nextComment; if (currentComment !== undefined) { if (currentComment.startsWith('#Q=')) { // Quiz on if (prevQuiz !== undefined && prevQuiz.format().toString() === currentComment) { nextComment = undefined; } else { nextComment = currentComment; prevComment = nextComment; prevQuiz = new _module_exports_$4.Quiz(currentComment); } } else { // Quiz off if (prevQuiz !== undefined && prevQuiz.format().toString() === currentComment) { nextComment = undefined; prevComment = currentComment; prevQuiz = undefined; } else { nextComment = prevComment !== currentComment ? currentComment : undefined; prevComment = prevComment !== currentComment ? nextComment : prevComment; prevQuiz = undefined; } } } else { nextComment = undefined; prevQuiz = undefined; } if (prevQuiz !== undefined && prevQuiz.canOperate() && currentPage.flags.lock) { if ((0, _module_exports_$9.isMinoPiece)(piece.type)) { try { var nextQuiz = prevQuiz.nextIfEnd(); var operation = nextQuiz.getOperation(piece.type); prevQuiz = nextQuiz.operate(operation); } catch (e) { // console.error(e.message); // Not operate prevQuiz = prevQuiz.format(); } } else { prevQuiz = prevQuiz.format(); } } var currentFlags = __assign({ lock: true, colorize: index === 0 }, currentPage.flags); var action = { piece: piece, rise: !!currentFlags.rise, mirror: !!currentFlags.mirror, colorize: !!currentFlags.colorize, lock: !!currentFlags.lock, comment: nextComment !== undefined, }; var actionNumber = actionEncoder.encode(action); buffer.push(actionNumber, 3); // コメントの更新 if (nextComment !== undefined) { var comment = escape(currentPage.comment); var commentLength = Math.min(comment.length, 4095); buffer.push(commentLength, 2); // コメントを符号化 for (var index_1 = 0; index_1 < commentLength; index_1 += 4) { var value = 0; for (var count = 0; count < 4; count += 1) { var newIndex = index_1 + count; if (commentLength <= newIndex) { break; } var ch = comment.charAt(newIndex); value += commentParser.encode(ch, count); } buffer.push(value, 5); } } else if (currentPage.comment === undefined) { prevComment = undefined; } // 地形の更新 if (action.lock) { if ((0, _module_exports_$9.isMinoPiece)(action.piece.type)) { currentField.fill(action.piece); } currentField.clearLine(); if (action.rise) { currentField.riseGarbage(); } if (action.mirror) { currentField.mirror(); } } prevField = currentField; }; for (var index = 0; index < pages.length; index += 1) { innerEncode(index); } // テト譜が短いときはそのまま出力する // 47文字ごとに?が挿入されるが、実際は先頭にv115@が入るため、最初の?は42文字後になる var data = buffer.toString(); if (data.length < 41) { return data; } // ?を挿入する var head = [data.substr(0, 42)]; var tails = data.substring(42); var split = tails.match(/[\S]{1,47}/g) || []; return head.concat(split).join('?'); } _module_exports_$1.encode = encode; // フィールドをエンコードする // 前のフィールドがないときは空のフィールドを指定する // 入力フィールドの高さは23, 幅は10 function encodeField(prev, current) { var FIELD_TOP = 23; var FIELD_MAX_HEIGHT = FIELD_TOP + 1; var FIELD_BLOCKS = FIELD_MAX_HEIGHT * FieldConstants.Width; var buffer = new _module_exports_$7.Buffer(); // 前のフィールドとの差を計算: 0〜16 var getDiff = function (xIndex, yIndex) { var y = FIELD_TOP - yIndex - 1; return current.getNumberAt(xIndex, y) - prev.getNumberAt(xIndex, y) + 8; }; // データの記録 var recordBlockCounts = function (diff, counter) { var value = diff * FIELD_BLOCKS + counter; buffer.push(value, 2); }; // フィールド値から連続したブロック数に変換 var changed = true; var prev_diff = getDiff(0, 0); var counter = -1; for (var yIndex = 0; yIndex < FIELD_MAX_HEIGHT; yIndex += 1) { for (var xIndex = 0; xIndex < FieldConstants.Width; xIndex += 1) { var diff = getDiff(xIndex, yIndex); if (diff !== prev_diff) { recordBlockCounts(prev_diff, counter); counter = 0; prev_diff = diff; } else { counter += 1; } } } // 最後の連続ブロックを処理 recordBlockCounts(prev_diff, counter); if (prev_diff === 8 && counter === FIELD_BLOCKS - 1) { changed = false; } return { changed: changed, values: buffer, }; } const _module_exports_ = {}; Object.defineProperty(_module_exports_, "__esModule", { value: true }); _module_exports_.encoder = _module_exports_.decoder = _module_exports_.Mino = _module_exports_.Field = void 0; Object.defineProperty(_module_exports_, "Field", { enumerable: true, get: function () { return _module_exports_$3.Field; } }); Object.defineProperty(_module_exports_, "Mino", { enumerable: true, get: function () { return _module_exports_$3.Mino; } }); _module_exports_.decoder = { decode: function (data) { return (0, _module_exports_$2.decode)(data); }, }; _module_exports_.encoder = { encode: function (data) { return "v115@".concat((0, _module_exports_$1.encode)(data)); }, }; /*! * escape-html * Copyright(c) 2012-2013 TJ Holowaychuk * Copyright(c) 2015 Andreas Lubbe * Copyright(c) 2015 Tiancheng "Timothy" Gu * MIT Licensed */ /** * Module variables. * @private */ var matchHtmlRegExp = /["'&<>]/; /** * Escape special characters in the given string of html. * * @param {string} string The string to escape for inserting into HTML * @return {string} * @public */ function escapeHtml(string) { var str = '' + string; var match = matchHtmlRegExp.exec(str); if (!match) { return str; } var escape; var html = ''; var index = 0; var lastIndex = 0; for (index = match.index; index < str.length; index++) { switch (str.charCodeAt(index)) { case 34: // " escape = '"'; break; case 38: // & escape = '&'; break; case 39: // ' escape = '''; break; case 60: // < escape = '<'; break; case 62: // > escape = '>'; break; default: continue; } if (lastIndex !== index) { html += str.substring(lastIndex, index); } lastIndex = index + 1; html += escape; } return lastIndex !== index ? html + str.substring(lastIndex, index) : html; } const {decoder} = _module_exports_; const tiles = { _: "#000", X: "#999", Xl: "#ccc", I: "hsl(180, 100%, 35%)", Il: "#0ff", L: "hsl(30, 95%, 47%)", Ll: "hsl(36, 100%, 55%)", O: "hsl(60, 70%, 40%)", Ol: "#ff0", Z: "hsl(0, 70%, 50%)", Zl: "hsl(0, 100%, 63%)", T: "hsl(295, 80%, 47%)", Tl: "hsl(300, 90%, 57%)", J: "hsl(240, 75%, 50%)", Jl: "hsl(240, 100%, 60%)", S: "hsl(120, 100%, 33%)", Sl: "#0f0" }; function createTile(name, size) { const fill = tiles[name]; const stroke = name === "_" ? ' stroke="rgba(255,255,255,0.05)"' : ""; return `<rect id="t${name}" fill="${fill}" width="${size}" height="${size}"${stroke}/>`; } function pageToFrame(page) { const field = page.field.copy(); const filledMino = page.operation && field.fill(page.operation); const output = Array(200); const touchedY = new Set; // extract field data for (let y = 0; y < 20; y++) { for (let x = 0; x < 10; x++) { output[y * 10 + x] = { type: field.at(x, y), light: false }; } } // draw active mino if (filledMino) { for (const {x, y} of filledMino.positions()) { touchedY.add(y); output[y * 10 + x].light = true; } } if (page.flags.lock) { // lighten lines which should be cleared for (const y of touchedY) { if (isLineFilled(field, y)) { for (let x = 0; x < 10; x++) { output[y * 10 + x].light = true; } } } } return output; } function isLineFilled(field, y) { for (let x = 0; x < 10; x++) { if (field.at(x, y) === "_") { return false; } } return true; } function createSVG({ data, pages = decoder.decode(data), index, delay = 500, size = 16, commentSize = 16, animateType = "css", comment = "auto" }) { if (index != null) { pages = pages.slice(index, index + 1); } const frames = pages.map(pageToFrame); const drawComment = comment === "always" ? true : comment === "none" ? false : pages.some(p => p.comment); const commentHeight = Math.round(commentSize * 1.6); const commentOffset = commentSize * 1.2; const commentY = size * 20; const width = size * 10; const height = size * 20 + (drawComment ? commentHeight : 0); // diff frames for (let i = frames.length - 1; i >= 1; i--) { for (let j = 0; j < frames[i].length; j++) { if (isTileEqual(frames[i - 1][j], frames[i][j])) { frames[i][j] = null; } } } // diff comment for (let i = pages.length - 1; i >= 1; i--) { if (pages[i].comment && pages[i].comment === pages[i - 1].comment) { pages[i].comment = null; } } const layers = []; const usedTiles = new Set; for (let i = 0; i < frames.length; i++) { const layer = createLayer(frames[i], size); for (const t of layer.used) { usedTiles.add(t); } const comment = drawComment ? createComment({ text: pages[i].comment, width, height: commentHeight, y: commentY, size: commentSize, offset: commentOffset, index: i }) : ""; layers.push(` <svg viewBox="0 0 ${width} ${height}" id="f${i}"> ${layer.tiles.join("")} ${comment} ${createAnimate(i, frames.length, delay, animateType)} </svg>`); } return ` <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${width} ${height}" width="${width}" height="${height}" style="font-family: sans-serif"> <defs> ${createDefs(usedTiles, size)} </defs> ${layers.join("")} ${createProgress(commentY, frames.length, width, delay, animateType)} </svg>`.trim().replace(/>\s+</g, ">\n<"); } function createProgress(y, total, width, delay, type) { if (total === 1) { return ""; } const attr = `d="M 0,${y} H${width}" stroke="silver" stroke-width="${width / 50}" stroke-dasharray="${width}"`; if (type === "css") { return ` <path ${attr} id="p"/> <style> #p {animation: p ${delay * total}ms steps(${total}, start) infinite} @keyframes p { from { stroke-dashoffset: ${width}; } to { stroke-dashoffset: 0; } } </style>`; } return ` <path ${attr}> <animate attributeName="stroke-dashoffset" values="${createValues()}" calcMode="discrete" dur="${total * delay}ms" repeatCount="indefinite"/> </path>`; function createValues() { const values = []; for (let i = 0; i < total; i++) { values.push((total - i - 1) / total * width); } return values.join(";"); } } function createComment({text, width, height, y, size, offset, index}) { if (!text && index) { return ""; } const bg = index === 0 ? `<rect id="cbg" fill="#333" y="${y}" width="${width}" height="${height}"/>` : '<use href="#cbg"/>'; const textEl = text ? `<text x="${width / 2}" y="${y + offset}" text-anchor="middle" font-size="${size}" fill="white">${escapeHtml(text)}</text>` : ""; return bg + textEl; } function createAnimate(i, total, delay, type) { if (i === 0) { return ""; } if (type === "css") { return `<style> #f${i} { animation: a${i} ${total * delay}ms step-end infinite; } @keyframes a${i} { 0% {visibility: hidden} ${i * 100 / total}% {visibility: visible} } </style>`; } return `<animate attributeName="display" values="none;inline" calcMode="discrete" keyTimes="0;${i/total}" dur="${delay * total}ms" repeatCount="indefinite" />`; } function createDefs(include, size) { const els = []; for (const name of include) { els.push(createTile(name, size)); } return els.join(""); } function createLayer(buffer, size) { const bgTiles = []; const tiles = []; const used = new Set; for (let i = 0; i < buffer.length; i++) { if (!buffer[i]) { continue; } const name = `${buffer[i].type}${buffer[i].light ? "l" : ""}`; used.add(name); const y = Math.floor(i / 10); const x = i % 10; const data = `<use href="#t${name}" x="${x * size}" y="${(20 - y - 1) * size}"/>`; if (name === "_") { bgTiles.push(data); } else { tiles.push(data); } } return { used, tiles: bgTiles.concat(tiles) }; } function isTileEqual(a, b) { return a.type === b.type && a.light === b.light; } var fumen = { name: "Fumen", global: true, getPatterns: function() { return [ /(?:fumen\.zui\.jp|harddrop\.com\/fumen)[^?]*\?(v115@.*)/i ]; }, getEmbedFunction: function() { return function (data, url, text, node) { var image = new Image; image.title = text; image.className = "embed-me-fumen"; image.src = `data:image/svg+xml,${encodeURIComponent(createSVG({data}))}`; node = node.cloneNode(false); node.appendChild(image); return node; }; } }; var image = { name: "Image", global: true, getPatterns: function() { return [ /^[^?#]+\.(?:jpg|png|gif|jpeg)(?:$|[?#])/i ]; }, getEmbedFunction: function() { GM_addStyle(".embed-me-image { max-width: 90%; }"); return function(url, text, node) { var image = new Image; image.title = text; image.className = "embed-me-image"; image.src = url; node = node.cloneNode(false); node.appendChild(image); return node; }; } }; var imgur = { name: "Imgur gifv", domains: ["i.imgur.com", "imgur.com"], getPatterns: function() { return [ /imgur\.com\/(\w+)(\.gifv|$)/i ]; }, getEmbedFunction: function() { GM_addStyle('.imgur-embed-iframe-pub { box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.10); border: 1px solid #ddd; border-radius: 2px; margin: 10px 0; width: 540px; overflow: hidden; }'); window.addEventListener("message", function(e){ if (e.origin.indexOf("imgur.com") < 0) { return; } var data = JSON.parse(e.data), id = data.href.match(/imgur\.com\/(\w+)\//)[1], css = '.imgur-embed-iframe-pub-' + id + '-' + data.context + '-540 { height: ' + data.height + 'px!important; width: 540px!important; }'; GM_addStyle(css); }); return function(id) { var iframe = document.createElement("iframe"); iframe.className = "imgur-embed-iframe-pub imgur-embed-iframe-pub-" + id + "-true-540"; iframe.scrolling = "no"; iframe.src = "//imgur.com/" + id + "/embed?w=540&ref=" + location.href + "#embed-me"; return iframe; }; } }; var soundcloud = { name: "SoundCloud", domains: ["soundcloud.com"], getPatterns: function() { return [ /soundcloud\.com\/[\w-]+\/[\w-]+(?:\?|$)/i ]; }, getEmbedFunction: function(){ return function(url, text, node, replace) { GM_xmlhttpRequest({ method: "GET", url: "https://soundcloud.com/oembed?format=json&url=" + url, onload: function(response) { if (!response.responseText) { return; } var html = JSON.parse(response.responseText).html; var container = document.createElement("div"); container.innerHTML = html; replace(container); } }); }; } }; var twitch = { name: "Twitch", domains: ["www.twitch.tv"], getPatterns: function() { return [ /twitch\.tv\/(\w+)\/(v)\/(\d+)/i, /twitch\.tv\/()(videos)\/(\d+)/i, /twitch\.tv\/(\w+)\/(clip)\/([^/]+)/i, ]; }, getEmbedFunction: function() { return function (user, type, id) { var container = document.createElement("div"); if (type == "v" || type == "videos") { container.innerHTML = `<iframe src="https://player.twitch.tv/?video=${id}&autoplay=false&parent=${location.hostname}" frameborder="0" allowfullscreen="true" scrolling="no" height="378" width="620"></iframe>`; } else if (type == "clip") { container.innerHTML = `<iframe src="https://clips.twitch.tv/embed?clip=${id}&autoplay=false&parent=${location.hostname}" frameborder="0" allowfullscreen="true" scrolling="no" height="378" width="620"></iframe>`; } return container; }; } }; var video = { name: "Video", global: true, getPatterns: function() { return [ /^[^?#]+\.(?:mp4|webm|ogv|mov)(?:$|[?#])/i ]; }, getEmbedFunction: function() { return function (url, text) { var video = document.createElement("video"); video.controls = true; video.title = text; video.src = url; return video; }; } }; var youtube = { name: "Youtube", domains: [ "www.youtube.com", "youtu.be" ], getPatterns: function() { return [ /youtube\.com\/watch\?.*?v=([^&]+)/i, /youtu\.be\/([^?]+)/i, /youtube\.com\/embed\/([^?#]+)/, /youtube\.com\/v\/([^?#]+)/ ]; }, getEmbedFunction: function() { return function(id, url, text, node, replace) { url = "https://www.youtube.com/watch?v=" + id; GM_xmlhttpRequest({ method: "GET", url: "https://www.youtube.com/oembed?format=json&url=" + url, onload: function(response) { var html = JSON.parse(response.responseText).html, container = document.createElement("div"); container.innerHTML = html; replace(container); } }); }; } }; var modules = [fumen,image,imgur,soundcloud,twitch,video,youtube]; /* global GM_webextPref */ const pref = GM_webextPref({ default: { simple: true, excludes: "", ...Object.fromEntries(modules.map(m => [m.name, true])) }, body: [ { label: "Ignore complex anchor", type: "checkbox", key: "simple" }, { label: "Excludes these urls (regexp per line)", type: "textarea", key: "excludes" }, ...modules.map(module => ({ label: module.name, key: module.name, type: "checkbox" })) ], getNewScope: () => location.hostname }); const globalMods = []; const index = {}; let excludedUrl = null; pref.ready() .then(() => pref.setCurrentScope(location.hostname)) .then(init); function init() { pref.on("change", change => { if (change.excludes != null) { updateExclude(); } }); updateExclude(); for (const mod of modules) { if (mod.global) { globalMods.push(mod); } else { var i; for (i = 0; i < mod.domains.length; i++) { index[mod.domains[i]] = mod; } } } observeDocument(function(node){ var links = node.querySelectorAll("a[href]"), i; for (i = 0; i < links.length; i++) { embed(links[i]); } }); } function validParent(node) { var cache = node; while (node != document.documentElement) { if (node.INVALID || node.className.indexOf("embed-me") >= 0) { cache.INVALID = true; return false; } if (!node.parentNode) { return false; } if (node.VALID) { break; } node = node.parentNode; } cache.VALID = true; return true; } function valid(node) { if (!validParent(node)) { return false; } if (node.nodeName != "A" || !node.href) { return false; } if (pref.get("simple") && (node.childNodes.length != 1 || node.childNodes[0].nodeType != 3)) { return false; } if (excludedUrl && excludedUrl.test(node.href)) { return false; } return true; } function getPatterns(mod) { if (!mod.getPatterns) { return []; } if (!mod.patterns) { mod.patterns = mod.getPatterns(); } return mod.patterns; } function getEmbedFunction(mod) { if (!mod.embedFunction) { mod.embedFunction = mod.getEmbedFunction(); } return mod.embedFunction; } function callEmbedFunc(node, params, func) { var replace = function (newNode) { if (!node.parentNode) { // The node was detached from DOM tree return; } newNode.classList.add("embed-me"); node.parentNode.replaceChild(newNode, node); }; params.push(node.href, node.textContent, node, replace); var r###lt = func.apply(null, params); if (r###lt) { replace(r###lt); } } function embed(node) { if (!valid(node)) { return; } // Never process same element twice node.INVALID = true; var mods = [], mod, patterns, match, i, j; if (node.hostname in index) { mods.push(index[node.hostname]); } mods = mods.concat(globalMods).filter(mod => pref.get(mod.name)); for (j = 0; j < mods.length; j++) { mod = mods[j]; patterns = getPatterns(mod); for (i = 0; i < patterns.length; i++) { if ((match = patterns[i].exec(node.href))) { callEmbedFunc(node, Array.prototype.slice.call(match, 1), getEmbedFunction(mod)); return; } } } } function observeDocument(callback) { setTimeout(callback, 0, document.body); new MutationObserver(function(mutations){ var i; for (i = 0; i < mutations.length; i++) { if (!mutations[i].addedNodes.length) { continue; } callback(mutations[i].target); } }).observe(document.body, { childList: true, subtree: true }); } function updateExclude() { const excludes = pref.get("excludes").trim(); excludedUrl = excludes && new RegExp(excludes.split(/\s*\n\s*/).join("|"), "i"); }