<commit_before>if (!window.Emoji) {
	var Emoji = {
		emojiCharSeq: /[0-9\uD83D\uD83C]/,
		emojiRegEx: /((?:[\uE000-\uF8FF\u270A-\u2764\u2122\u231B\u25C0\u25FB-\u25FE\u2615\u263a\u2648-\u2653\u2660-\u2668\u267B\u267F\u2693\u261d\u26A0-\u26FA\u2708\u2702\u2601\u260E]|[\u2600\u26C4\u26BE\u23F3\u2705\u2764]|[\uD83D\uD83C][\uDC00-\uDFFF]|\uD83C[\uDDE6-\uDDFF]\uD83C[\uDDE6-\uDDFF]|[0-9]\u20e3|[\u200C\u200D])+)/g,
		pathToEmojisImages: 'https://vk.com/images/emoji/',

		getEmojiHTML: function (code, symbol) {
			return '<img class="emoji" ' + (symbol ? 'alt="' + symbol + '"' : '') + ' src="' + this.pathToEmojisImages + code+'.png" />';
		},

		emojiToHTML: function (str) {
			str = str.replace(/&nbsp;/g, ' ').replace(/<br>/g, "\n");
			var regs = {
				'D83DDE07': /(\s|^)([0OО]:\))([\s\.,]|$)/g,
				'D83DDE09': /(\s|^)(;-\)+)([\s\.,]|$)/g,
				'D83DDE06': /(\s|^)([XХxх]-?D)([\s\.,]|$)/g,
				'D83DDE0E': /(\s|^)(B-\))([\s\.,]|$)/g,
				'D83DDE0C': /(\s|^)(3-\))([\s\.,]|$)/g,
				'D83DDE20': /(\s|^)(&gt;\()([\s\.,]|$)/g,
				'D83DDE30': /(\s|^)(;[oоOО])([\s\.,]|$)/g,
				'D83DDE33': /(\s|^)(8\|)([\s\.,]|$)/g,
				'D83DDE32': /(\s|^)(8-?[oоOО])([\s\.,]|$)/g,
				'D83DDE0D': /(\s|^)(8-\))([\s\.,]|$)/g,
				'D83DDE37': /(\s|^)(:[XХ])([\s\.,]|$)/g,
				'D83DDE28': /(\s|^)(:[oоOО])([\s\.,]|$)/g,
				'2764': /(\s|^)(&lt;3)([\s\.,]|$)/g
			};
			for (var code in regs) {
				str = str.replace(regs[code], function (match, pre, smile, space) {
					return (pre || '') + Emoji.getEmojiHTML(code)+(space || '');
				});
			}
			var regs = {
				'D83DDE0A': /(:-\))([\s\.,]|$)/g,
				'D83DDE03': /(:-D)([\s\.,]|$)/g,
				'D83DDE1C': /(;-[PР])([\s\.,]|$)/g,
				'D83DDE0B': /(:-[pр])([\s\.,]|$)/g,
				'D83DDE12': /(:-\()([\s\.,]|$)/g,
				'263A': /(:-?\])([\s\.,]|$)/g,
				'D83DDE0F': /(;-\])([\s\.,]|$)/g,
				'D83DDE14': /(3-?\()([\s\.,]|$)/g,
				'D83DDE22': /(:&#039;\()([\s\.,]|$)/g,
				'D83DDE2D': /(:_\()([\s\.,]|$)/g,
				'D83DDE29': /(:\(\()([\s\.,]|$)/g,
				//'D83DDE15': /(:\\)([\s\.,]|$)/g,
				'D83DDE10': /(:\|)([\s\.,]|$)/g,
				'D83DDE21': /(&gt;\(\()([\s\.,]|$)/g,
				'D83DDE1A': /(:-\*)([\s\.,]|$)/g,
				'D83DDE08': /(\}:\))([\s\.,]|$)/g,
				'D83DDC4D': /(:like:)([\s\.,]|$)/g,
				'D83DDC4E': /(:dislike:)([\s\.,]|$)/g,
				'261D': /(:up:)([\s\.,]|$)/g,
				'270C': /(:v:)([\s\.,]|$)/g,
				'D83DDC4C': /(:ok:|:ок:)([\s\.,]|$)/g
			};
			for (var code in regs) {
				str = str.replace(regs[code], function (match, smile, space) {
					return Emoji.getEmojiHTML(code)+(space || '');
				});
			}

			str = str.replace(/\n/g, '<br>');
			str = str.replace(Emoji.emojiRegEx, Emoji.emojiReplace).replace(/\uFE0F/g, '');
			return str;
		},

		emojiReplace: function (symbolstr) {
			var i = 0;
			var buffer = '', altBuffer = '', num;
			var symbols = [];
			var codes = [];
			while(num = symbolstr.charCodeAt(i++)) {
				var code = num.toString(16).toUpperCase();
				var symbol = symbolstr.charAt(i - 1);<commit_msg>Add comments<commit_after>if (!window.Emoji) {
	/**
	 * Class для смайликов
	 * @class
	 * @type {Object}
	 */
	var Emoji = {
		/**
		 * @type {RegExp}
		 */
		emojiCharSeq: /[0-9\uD83D\uD83C]/,
		/**
		 * @type {RegExp}
		 */
		emojiRegEx: /((?:[\uE000-\uF8FF\u270A-\u2764\u2122\u231B\u25C0\u25FB-\u25FE\u2615\u263a\u2648-\u2653\u2660-\u2668\u267B\u267F\u2693\u261d\u26A0-\u26FA\u2708\u2702\u2601\u260E]|[\u2600\u26C4\u26BE\u23F3\u2705\u2764]|[\uD83D\uD83C][\uDC00-\uDFFF]|\uD83C[\uDDE6-\uDDFF]\uD83C[\uDDE6-\uDDFF]|[0-9]\u20e3|[\u200C\u200D])+)/g,
		/**
		 * Path до директории с изображениями смайликов
		 * @type {String}
		 */
		pathToEmojisImages: 'https://vk.com/images/emoji/',

		/**
		 * @param  {String} code   Код символа
		 * @param  {String} symbol Сам символ
		 * @return {String}        HTML код картинки
		 */
		getEmojiHTML: function (code, symbol) {
			return '<img class="emoji" ' + (symbol ? 'alt="' + symbol + '"' : '') + ' src="' + this.pathToEmojisImages + code+'.png" />';
		},

		/**
		 * Преобразует символы смайликов в строке в соотведствующие изображения
		 * @param  {String} str Строка для преобразования
		 * @return {String}     Изменённая строка
		 */
		emojiToHTML: function (str) {
			str = str.replace(/&nbsp;/g, ' ').replace(/<br>/g, "\n");
			var regs = {
				'D83DDE07': /(\s|^)([0OО]:\))([\s\.,]|$)/g,
				'D83DDE09': /(\s|^)(;-\)+)([\s\.,]|$)/g,
				'D83DDE06': /(\s|^)([XХxх]-?D)([\s\.,]|$)/g,
				'D83DDE0E': /(\s|^)(B-\))([\s\.,]|$)/g,
				'D83DDE0C': /(\s|^)(3-\))([\s\.,]|$)/g,
				'D83DDE20': /(\s|^)(&gt;\()([\s\.,]|$)/g,
				'D83DDE30': /(\s|^)(;[oоOО])([\s\.,]|$)/g,
				'D83DDE33': /(\s|^)(8\|)([\s\.,]|$)/g,
				'D83DDE32': /(\s|^)(8-?[oоOО])([\s\.,]|$)/g,
				'D83DDE0D': /(\s|^)(8-\))([\s\.,]|$)/g,
				'D83DDE37': /(\s|^)(:[XХ])([\s\.,]|$)/g,
				'D83DDE28': /(\s|^)(:[oоOО])([\s\.,]|$)/g,
				'2764': /(\s|^)(&lt;3)([\s\.,]|$)/g
			};
			for (var code in regs) {
				str = str.replace(regs[code], function (match, pre, smile, space) {
					return (pre || '') + Emoji.getEmojiHTML(code)+(space || '');
				});
			}
			var regs = {
				'D83DDE0A': /(:-\))([\s\.,]|$)/g,
				'D83DDE03': /(:-D)([\s\.,]|$)/g,
				'D83DDE1C': /(;-[PР])([\s\.,]|$)/g,
				'D83DDE0B': /(:-[pр])([\s\.,]|$)/g,
				'D83DDE12': /(:-\()([\s\.,]|$)/g,
				'263A': /(:-?\])([\s\.,]|$)/g,
				'D83DDE0F': /(;-\])([\s\.,]|$)/g,
				'D83DDE14': /(3-?\()([\s\.,]|$)/g,
				'D83DDE22': /(:&#039;\()([\s\.,]|$)/g,
				'D83DDE2D': /(:_\()([\s\.,]|$)/g,
				'D83DDE29': /(:\(\()([\s\.,]|$)/g,
				//'D83DDE15': /(:\\)([\s\.,]|$)/g,
				'D83DDE10': /(:\|)([\s\.,]|$)/g,
				'D83DDE21': /(&gt;\(\()([\s\.,]|$)/g,
				'D83DDE1A': /(:-\*)([\s\.,]|$)/g,
				'D83DDE08': /(\}:\))([\s\.,]|$)/g,
				'D83DDC4D': /(:like:)([\s\.,]|$)/g,
				'D83DDC4E': /(:dislike:)([\s\.,]|$)/g,
				'261D': /(:up:)([\s\.,]|$)/g,
				'270C': /(:v:)([\s\.,]|$)/g,
				'D83DDC4C': /(:ok:|:ок:)([\s\.,]|$)/g
			};
			for (var code in regs) {
				str = str.replace(regs[code], function (match, smile, space) {
					return Emoji.getEmojiHTML(code)+(space || '');
				});
			}

			str = str.replace(/\n/g, '<br>');
			str = str.replace(Emoji.emojiRegEx, Emoji.emojiReplace).replace(/\uFE0F/g, '');
			return str;
		},

		/**
		 * Подбирает коды к найденным символам
		 * @param  {String} symbolstr Символ для замены
		 */
		emojiReplace: function (symbolstr) {
			var i = 0;
			var buffer = '', altBuffer = '', num;
			var symbols = [];
			var codes = [];
			while(num = symbolstr.charCodeAt(i++)) {
				var code = num.toString(16).toUpperCase();
				var symbol = symbolstr.charAt(i - 1);
{'fraction_non_alphanumeric': 0.36253451979134704, 'fraction_numerical': 0.0816201288738877, 'mean_word_length': 2.6644182124789206, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 9, 'https://': 2, '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': '5761344', 'n_tokens_mistral': 4079, 'n_tokens_neox': 3392, 'n_words': 384}