diff --git a/README.md b/README.md index 5fc57cb..6560fcd 100644 --- a/README.md +++ b/README.md @@ -96,3 +96,5 @@ sh build.sh 25. 2016-3-20 增加字体同步的拉取和推送,增加自动更新同步版本. 26. 2016-3-22 增加字形旋转吸附,调整配色. + +27. 2016-4-18 更新新lib库,优化错误提示体验. diff --git a/src/fonteditor/controller/actions.js b/src/fonteditor/controller/actions.js index 28d18a5..e7ff203 100644 --- a/src/fonteditor/controller/actions.js +++ b/src/fonteditor/controller/actions.js @@ -50,6 +50,7 @@ define( // 延迟同步函数 var fontDelaySync = lang.debounce(function (options) { program.loading.show(i18n.lang.msg_syncing, 4000); + program.sync.addTask(options).then(function (data) { if (options.newProject && data && data.newData) { actions['new']({ @@ -120,20 +121,12 @@ define( }, 'export': function (e) { - if (!e.target.getAttribute('download')) { - e.preventDefault(); - } - }, - - 'export-file': function (e) { if (program.ttfManager.get()) { var target = $(e.target); program.exporter.export(program.ttfManager.get(), { type: target.attr('data-type'), - target: target, - originEvent: e, - error: function () { - e.preventDefault(); + error: function (ev) { + program.fire('font-error', ev); } }); } @@ -310,6 +303,12 @@ define( if (program.ttfManager.get()) { var result = program.ttfManager.optimize(); if (true !== result) { + if (result.repeat) { + program.fire('font-error', { + number: 10200, + data: result.repeat + }); + } alert(result.message); } } diff --git a/src/fonteditor/controller/default.js b/src/fonteditor/controller/default.js index a9148ee..0217c3c 100644 --- a/src/fonteditor/controller/default.js +++ b/src/fonteditor/controller/default.js @@ -12,6 +12,24 @@ define( var actions = require('./actions'); var program; + /** + * 通知错误信息 + * + * @param {Object} options 参数 + * @param {number} options.number 错误号 + * @param {Object} options.data 错误数据 + */ + function notifyError(options) { + // 重复的代码点 + if (options.number === 10200 && options.data) { + var glyfList = Array.isArray(options.data) ? options.data : [options.data]; + var pageSize = program.setting.get('editor').viewer.pageSize; + var page = Math.ceil(glyfList[0] / pageSize); + showTTF(program.ttfManager.get(), page, glyfList); + } + } + + /** * 获取ttf的编辑选项 * @@ -602,6 +620,9 @@ define( program.previewer.load(ttf, e.keyCode === 114 ? 'ttf' : 'woff'); } } + }) + .on('font-error', function (e) { + notifyError(e); }); } diff --git a/src/fonteditor/dialog/glyf-download.js b/src/fonteditor/dialog/glyf-download.js index eb74e85..1ca1b93 100644 --- a/src/fonteditor/dialog/glyf-download.js +++ b/src/fonteditor/dialog/glyf-download.js @@ -5,12 +5,13 @@ define( function (require) { + var pixelRatio = require('common/getPixelRatio'); var i18n = require('../i18n/i18n'); var glyf2svgfile = require('../widget/util/glyf2svgfile'); + var download = require('../widget/util/download'); var svg2base64 = require('fonteditor-core/ttf/svg2base64'); var bytes2base64 = require('fonteditor-core/ttf/util/bytes2base64'); var colorpicker = require('./colorpicker'); - var pixelRatio = require('common/getPixelRatio'); function getSvg(setting) { var opt = { @@ -55,19 +56,17 @@ define( $('#glyf-download-color').on('change', onChange); $('#glyf-download-size').on('change', onChange); colorpicker.show('#glyf-download-color'); - $('#glyf-download-svg').on('mousedown', $.proxy(function (e) { + $('#glyf-download-svg').on('click', $.proxy(function (e) { var svgText = getSvg(this.setting); var target = $(e.target); - target.attr('download', (this.setting.glyf.name || 'svg')+ '.svg'); - target.attr('href', svg2base64(svgText)); + download((this.setting.glyf.name || 'svg') + '.svg', svg2base64(svgText)); }, this)); - $('#glyf-download-png').on('mousedown', $.proxy(function (e) { + $('#glyf-download-png').on('click', $.proxy(function (e) { var canvas = $('#glyf-download-preview canvas').get(0); var imgData = canvas.toDataURL(); var target = $(e.target); - target.attr('download', (this.setting.glyf.name || 'png')+ '.png'); - target.attr('href', imgData); + download((this.setting.glyf.name || 'png') + '.png', imgData); }, this)); $('#glyf-download-name').html(setting.glyf.name); @@ -77,8 +76,8 @@ define( onDispose: function () { $('#glyf-download-color').off('change'); $('#glyf-download-size').off('change'); - $('#glyf-download-svg').off('mousedown'); - $('#glyf-download-png').off('mousedown'); + $('#glyf-download-svg').off('click'); + $('#glyf-download-png').off('click'); this.setting = null; } }); diff --git a/src/fonteditor/main.js b/src/fonteditor/main.js index c1baef4..7ae443b 100644 --- a/src/fonteditor/main.js +++ b/src/fonteditor/main.js @@ -71,12 +71,6 @@ define( } }); - $('#export-btn').on('mouseup', actions['export-file']); - $('#export-btn-woff').on('mouseup', actions['export-file']); - $('#export-btn-svg').on('mouseup', actions['export-file']); - $('#export-btn-eot').on('mouseup', actions['export-file']); - $('#export-btn-zip').on('mouseup', actions['export-file']); - document.getElementById('font-import').addEventListener('change', onUpFile); } diff --git a/src/fonteditor/widget/TTFManager.js b/src/fonteditor/widget/TTFManager.js index d12a0f9..f7e175a 100644 --- a/src/fonteditor/widget/TTFManager.js +++ b/src/fonteditor/widget/TTFManager.js @@ -445,6 +445,7 @@ define( } return { + repeat: result.repeat, message: message }; }; diff --git a/src/fonteditor/widget/exporter.js b/src/fonteditor/widget/exporter.js index 3fa4c12..3c4ffd6 100644 --- a/src/fonteditor/widget/exporter.js +++ b/src/fonteditor/widget/exporter.js @@ -11,6 +11,7 @@ define( var ttf2icon = require('fonteditor-core/ttf/ttf2icon'); var config = require('fonteditor-core/ttf/data/default'); var exportRender = require('../template/export-render'); + var download = require('./util/download'); var JSZip = require('JSZip'); /** @@ -106,16 +107,12 @@ define( + base64Str; } - var target = $(options.target); - target.attr('download', fileName + '.' + options.type); - - target.attr('href', base64Str); + download(fileName + '.' + options.type, base64Str); if (options.success) { options.success(base64Str); } } catch (e) { - $(options.target).removeAttr('download'); if (options.error) { options.error(e); } @@ -123,8 +120,6 @@ define( throw e; } } - - return options.target; } diff --git a/src/fonteditor/widget/previewer.js b/src/fonteditor/widget/previewer.js index ed9293a..7956aa2 100644 --- a/src/fonteditor/widget/previewer.js +++ b/src/fonteditor/widget/previewer.js @@ -10,7 +10,7 @@ define( var resolvettf = require('./util/resolvettf'); var ttf2icon = require('fonteditor-core/ttf/ttf2icon'); var font = require('fonteditor-core/ttf/font'); - + var program = require('./program'); var previewRender = require('../template/preview-render'); // 模板渲染函数 var extend = require('common/lang').extend; var isIE = !!window.ActiveXObject || 'ActiveXObject' in window; @@ -28,7 +28,14 @@ define( }; ttf = resolvettf(ttf); - var fontData = font.create(ttf).toBase64(options); + try { + var fontData = font.create(ttf).toBase64(options); + } + catch(e) { + program.fire('font-error', e); + throw e; + } + var data = extend( { fontData: fontData, diff --git a/src/fonteditor/widget/sync.js b/src/fonteditor/widget/sync.js index 5e8dbe7..5c77017 100644 --- a/src/fonteditor/widget/sync.js +++ b/src/fonteditor/widget/sync.js @@ -10,7 +10,7 @@ define( var Resolver = require('common/promise'); var string = require('common/string'); var project = require('./project'); - + var program = require('./program'); var resolvettf = require('./util/resolvettf'); var font = require('fonteditor-core/ttf/font'); var ttf2woff = require('fonteditor-core/ttf/ttf2woff'); @@ -154,6 +154,7 @@ define( }); } catch (e) { + program.fire('font-error', e); alert(e.message); throw e; } diff --git a/src/fonteditor/widget/util/download.js b/src/fonteditor/widget/util/download.js new file mode 100644 index 0000000..70329cd --- /dev/null +++ b/src/fonteditor/widget/util/download.js @@ -0,0 +1,41 @@ +/** + * @file chrome下载 + * 由于浏览器限制,需要注意调用的时候需要在一次交互内,例如`click`等 + * + * @author mengke01(kekee000@gmail.com) + */ + + +define(function (require) { + + /** + * chrome下载 + * + * @param {string} fileName 文件名 + * @param {string} base64Str base64字符串 + */ + function download(fileName, base64Str) { + var a = document.createElement('a'); + a.download = fileName; + a.href = base64Str; + a.addEventListener('click', function () { + a.remove(); + }); + document.body.appendChild(a); + if (a.click) { + a.click(); + } + else { +   var event = document.createEvent('MouseEvents'); +   event.initMouseEvent('click', + true, true, document.defaultView, + 0, 0, 0, 0, 0, + false, false, false, false, + 0, null + ); + a.dispatchEvent(event); + } + } + + return download; +});