{"size": 4496, "ext": "js", "max_stars_repo_path": "Frontend/app/editor/pasteproxy/model/ImgProxy.js", "max_stars_repo_name": "Litres/FB3Editor", "max_stars_repo_stars_event_min_datetime": "2015-04-30T07:13:41.000Z", "max_stars_repo_stars_event_max_datetime": "2021-07-08T10:31:57.000Z", "max_issues_repo_path": "Frontend/app/editor/pasteproxy/model/ImgProxy.js", "max_issues_repo_name": "Litres/FB3Editor", "max_issues_repo_issues_event_min_datetime": null, "max_issues_repo_issues_event_max_datetime": null, "max_forks_repo_path": "Frontend/app/editor/pasteproxy/model/ImgProxy.js", "max_forks_repo_name": "Litres/FB3Editor", "max_forks_repo_forks_event_min_datetime": "2017-05-28T08:56:40.000Z", "max_forks_repo_forks_event_max_datetime": "2021-04-06T02:06:26.000Z"}
{"max_stars_count": 20, "max_issues_count": null, "max_forks_count": 7, "avg_line_length": 24.5683060109, "max_line_length": 105, "alphanum_fraction": 0.5097864769}
/**
 * Прокси элемента изображения.
 *
 * @author dew1983@mail.ru <Suvorov Andrey M.>
 */

Ext.define(
	'FBEditor.editor.pasteproxy.model.ImgProxy',
	{
		extend: 'FBEditor.editor.pasteproxy.model.AbstractProxy',

		normalize: function ()
		{
			var me = this,
				el = me.el,
				resourceManager = FBEditor.resource.Manager,
				paste = resourceManager.getPaste(),
				modelProxy = me.modelProxy,
				pasteProxy = modelProxy.pasteProxy,
				existRes,
				fileId,
				src,
				blob,
				data,
				image,
				res;

			if (el.normalized)
			{
				// элемент уже нормализован
				return false;
			}

			el.normalized = true;


			// нормализуем аттрибуты
			me.normalizeAttributes();

			src = el.attributes.src;

			// айди ресурса
			fileId = el.attributes.id || null;

			// ищем существующий ресурс
            res = fileId ? resourceManager.getResource(fileId) : null;

			//console.log('res', res);

			if (!res)
			{
                if (/^data:(image\/.*?);base64,/i.test(src))
                {
                    // получаем данные для ресурса из атрибута src
                    blob = FBEditor.util.Img.urlDataToBlob(src);
                    data = Ext.create('FBEditor.resource.data.PasteData', {blob: blob});
                    res = Ext.create('FBEditor.resource.Resource', data.getData());
                }

                if (/^(http|https):/i.test(src))
                {
                    // создаем внешний ресурс
                    data = Ext.create('FBEditor.resource.data.ExternalData', {url: src});
                    res = Ext.create('FBEditor.resource.ExternalResource', data.getData());
                }

                if (/^file:/i.test(src))
                {
                    // создаем ресурс из RTF (для Word)

                    // получаем данные изображения из буфера формата RTF
                    image = pasteProxy.getImageFromRtf(src);

                    //console.log('file', src, image);

                    if (image)
                    {
                        data = Ext.create('FBEditor.resource.data.PasteData', {blob: image.blob});
                        res = Ext.create('FBEditor.resource.Resource', data.getData());
                    }
                }
			}

            if (res)
            {
                //console.log('add el', el, res);

                // связываем ресурс с элементом изображения
                res.addElement(el);

                // указываем элемент, который вставлен в текст после копипаста
                res.setPasteElement(el);

                // добавляем ресурс в очередь вставщика для последующего его сохранения
                paste.add(res);

                if (!el.parent.isStyleType)
                {
                    // помещаем изображение в абзац, если оно находится не в стилевом элементе или абзаце
                    me.moveElsToNewHolder(el);
                }
            }
            else
            {
                el.attributes.src = 'undefined';
                Ext.log({level: 'warn', msg: 'Невозможно создать ресурс из буфера ' + src});
            }

			return true;
		},

		/**
		 * Нормализует аттрибуты элемента.
		 */
		normalizeAttributes: function ()
		{
			var me = this,
				el = me.el,
				modelProxy = me.modelProxy,
				pasteProxy = modelProxy.pasteProxy,
				manager = pasteProxy.manager,
				schema = manager.getSchema(),
				attributes;

			// получаем все разрешенные аттрибуты
			attributes = schema.getAttributes('img');

			// нормализуем аттрибуты
			Ext.Object.each(
				attributes,
				function (name, item)
				{
					var pattern,
						attr,
						reg;

					if (el.attributes[name])
					{
						attr = el.attributes[name];
						pattern = item.type.pattern;

						if (/width/i.test(name))
						{
							// нормализуем ширину

							// исправляем паттерн
							//pattern = pattern.replace(/d\+/g, '\\d+');

							reg = new RegExp(pattern);

							if (!reg.test(attr))
							{
								// некорректный аттрибут

								if (/(\d+)(.\d+)?/.test(attr))
								{
									// исправляем аттрибут

									attr = FBEditor.util.Format.pixelsToMillimeters(attr);

									if (Ext.isNumber(attr))
									{
										el.attributes[name] = attr.toFixed(2) + 'mm';
									}
									else
									{
										// удаляем аттрибут
										delete el.attributes[name];
									}
								}
								else
								{
									// удаляем аттрибут
									delete el.attributes[name];
								}
							}
						}
					}
				}
			);
		}
	}
);