vue2-client 1.16.28 → 1.16.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursorrules +19 -19
- package/.env.apply +19 -19
- package/.env.gaslink +19 -19
- package/.env.his +19 -19
- package/.env.liuli +20 -20
- package/.env.scada +19 -19
- package/.eslintrc.js +90 -90
- package/CHANGELOG.md +824 -824
- package/Components.md +60 -60
- package/docs/LowCode/lowcode.md +155 -155
- package/docs/LowCode/lowcodeForDeveloper.md +230 -230
- package/docs/index.md +30 -30
- package/index.js +31 -31
- package/jest-transform-stub.js +8 -8
- package/jest.setup.js +7 -7
- package/jsconfig.json +19 -19
- package/package.json +1 -1
- package/public/his/editor/editor.html +51 -51
- package/public/his/editor/mock/bind_data.html +779 -779
- package/public/his/editor/mock/data_table.html +40 -40
- package/public/his/editor/mock/sign.html +75 -75
- package/public/his/editor/vender/JsBarcode.all.js +3669 -3669
- package/public/his/editor/vender/date97/My97DatePicker.htm +65 -65
- package/public/his/editor/vender/date97/WdatePicker.js +677 -677
- package/public/his/editor/vender/date97/calendar.js +4 -4
- package/public/his/editor/vender/date97/lang/en.js +13 -13
- package/public/his/editor/vender/date97/lang/zh-cn.js +13 -13
- package/public/his/editor/vender/date97/lang/zh-tw.js +13 -13
- package/public/his/editor/vender/date97/skin/WdatePicker.css +10 -10
- package/public/his/editor/vender/date97/skin/default/datepicker.css +328 -328
- package/public/his/editor/vender/date97/skin/ext/datepicker.css +308 -308
- package/public/his/editor/vender/date97/skin/whyGreen/datepicker.css +255 -255
- package/public/his/editor/vender/diff.js +1627 -1627
- package/public/his/editor/vender/editor.js +1 -1
- package/public/his/editor/vender/fabric.js +31187 -31187
- package/public/his/editor/vender/jquery/jquery.base64.js +190 -190
- package/public/his/editor/vender/jquery/jquery.js +10872 -10872
- package/public/his/editor/vender/jquery/jquery.print.js +255 -255
- package/public/his/editor/vender/jquery/zTreeStyle/zTreeStyle.css +96 -96
- package/public/his/editor/vender/mui/mui.min.css +4 -4
- package/public/his/editor/vender/mui/mui.min.js +5 -5
- package/public/his/editor/vender/mui/mui.picker.min.css +6 -6
- package/public/his/editor/vender/mui/mui.picker.min.js +6 -6
- package/public/his/editor/vender/qrcode.js +7 -7
- package/public/his/editor/vender/requirejs/require.js +2145 -2145
- package/public/his/editor/vender/signature/jSignature.CompressorSVG.js +518 -518
- package/public/his/editor/vender/signature/jSignature.UndoButton.js +164 -164
- package/public/his/editor/vender/signature/jSignature.js +1486 -1486
- package/public/his/editor/vender/validator.js +5094 -5094
- package/public/his/editor/vender/weui/weui.css +5659 -5659
- package/public/his/editor/vender/weui/weui.min.css +4 -4
- package/public/his/editor/vender/weui/weui.min.js +11 -11
- package/src/assets/img/querySlotDemo.svg +15 -15
- package/src/assets/svg/badtwo.svg +1 -1
- package/src/assets/svg/goodtwo.svg +1 -1
- package/src/base-client/components/AI/AskAiBtn.vue +136 -136
- package/src/base-client/components/AI/demo.vue +31 -31
- package/src/base-client/components/common/AddressSearchCombobox/IcMapIcon.vue +16 -16
- package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
- package/src/base-client/components/common/AddressSearchCombobox/ic_map.svg +6 -6
- package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
- package/src/base-client/components/common/CitySelect/index.js +3 -3
- package/src/base-client/components/common/CitySelect/index.md +109 -109
- package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
- package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
- package/src/base-client/components/common/CreateQuery/index.js +3 -3
- package/src/base-client/components/common/CreateQuery/index.md +42 -42
- package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
- package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
- package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
- package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
- package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
- package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
- package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
- package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
- package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
- package/src/base-client/components/common/HIS/HForm/HForm.vue +1 -1
- package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
- package/src/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue +108 -108
- package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +413 -413
- package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
- package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +728 -728
- package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
- package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +219 -219
- package/src/base-client/components/common/LowCodeComponent/modal/lowCodeAddPageModal.vue +117 -117
- package/src/base-client/components/common/LowCodeComponent/modal/lowCodeCustomJSModal.vue +80 -80
- package/src/base-client/components/common/LowCodeComponent/modal/lowCodeEventEditorModal.vue +398 -398
- package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLifeCycleModal.vue +65 -65
- package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicCallbackModal.vue +64 -64
- package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicParamModal.vue +73 -73
- package/src/base-client/components/common/LowCodeComponent/modal/lowCodeRunFunctionParamModal.vue +76 -76
- package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
- package/src/base-client/components/common/PersonSetting/index.js +3 -3
- package/src/base-client/components/common/Recording/Recording.vue +243 -243
- package/src/base-client/components/common/Recording/index.js +3 -3
- package/src/base-client/components/common/Tree/Tree.vue +149 -149
- package/src/base-client/components/common/Tree/index.js +2 -2
- package/src/base-client/components/common/Upload/index.js +3 -3
- package/src/base-client/components/common/XAddForm/XAddForm.vue +113 -113
- package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
- package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +303 -303
- package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
- package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
- package/src/base-client/components/common/XAddReport/index.js +3 -3
- package/src/base-client/components/common/XAddReport/index.md +56 -56
- package/src/base-client/components/common/XBadge/XBadge.vue +94 -94
- package/src/base-client/components/common/XButtons/XButtonDemo.vue +28 -28
- package/src/base-client/components/common/XButtons/index.js +3 -3
- package/src/base-client/components/common/XButtons/index.md +61 -61
- package/src/base-client/components/common/XCard/XCard.vue +64 -64
- package/src/base-client/components/common/XCheckList/XCheckList.vue +106 -106
- package/src/base-client/components/common/XCheckList/XCheckListDemo.vue +41 -41
- package/src/base-client/components/common/XDataCard/index.js +3 -3
- package/src/base-client/components/common/XDataCard/index.md +1 -1
- package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
- package/src/base-client/components/common/XDataDrawer/index.js +3 -3
- package/src/base-client/components/common/XDataDrawer/index.md +41 -41
- package/src/base-client/components/common/XDatePicker/demo.vue +153 -153
- package/src/base-client/components/common/XDescriptions/index.js +3 -3
- package/src/base-client/components/common/XDescriptions/index.md +83 -83
- package/src/base-client/components/common/XDetailsView/XDetailsView.vue +238 -238
- package/src/base-client/components/common/XDetailsView/index.js +3 -3
- package/src/base-client/components/common/XForm/XStatusButton.vue +54 -54
- package/src/base-client/components/common/XForm/index.md +178 -178
- package/src/base-client/components/common/XForm/itemComponent/XClickChangeBtn/index.vue +49 -49
- package/src/base-client/components/common/XFormGroup/index.js +3 -3
- package/src/base-client/components/common/XFormGroup/index.md +38 -38
- package/src/base-client/components/common/XFormGroupDetails/XFormGroupDetails.vue +72 -72
- package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
- package/src/base-client/components/common/XFormTable/index.md +92 -92
- package/src/base-client/components/common/XLabelSelect/XLabelSelect.vue +110 -110
- package/src/base-client/components/common/XLabelSelect/XLabelSelectDemo.vue +35 -35
- package/src/base-client/components/common/XLicensePlate/XLicensePlate.vue +193 -193
- package/src/base-client/components/common/XLicensePlate/XLicensePlateDemo.vue +48 -48
- package/src/base-client/components/common/XPrint/OpenInvoice.vue +21 -21
- package/src/base-client/components/common/XPrint/PrintHtml.js +98 -98
- package/src/base-client/components/common/XPrint/css/hiPrintCss.js +359 -359
- package/src/base-client/components/common/XPrint/css/lodopCss.js +26 -26
- package/src/base-client/components/common/XPrint/css/print-lock.css +351 -351
- package/src/base-client/components/common/XPrint/index.vue +97 -97
- package/src/base-client/components/common/XReport/XReportDesign.vue +463 -463
- package/src/base-client/components/common/XReport/XReportJsonRender.vue +381 -381
- package/src/base-client/components/common/XReport/index.js +3 -3
- package/src/base-client/components/common/XReport/print.js +186 -186
- package/src/base-client/components/common/XReportDrawer/index.js +3 -3
- package/src/base-client/components/common/XReportGrid/XReportTrGroup.vue +8 -3
- package/src/base-client/components/common/XReportGrid/index.js +3 -3
- package/src/base-client/components/common/XReportGrid/index.md +44 -44
- package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
- package/src/base-client/components/common/XReportSlot/index.js +3 -3
- package/src/base-client/components/common/XReportSlot/index.md +48 -48
- package/src/base-client/components/common/XSimpleDescriptions/XSimpleDescriptions.vue +166 -166
- package/src/base-client/components/common/XSimpleDescriptions/index.js +3 -3
- package/src/base-client/components/common/XSimpleDescriptions/index.md +7 -7
- package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
- package/src/base-client/components/common/XStepView/index.js +3 -3
- package/src/base-client/components/common/XStepView/index.md +31 -31
- package/src/base-client/components/common/XTab/XTabDemo.vue +22 -22
- package/src/base-client/components/common/XTab/index.js +3 -3
- package/src/base-client/components/common/XTable/CustomFuncCel.vue +51 -51
- package/src/base-client/components/common/XTable/TableCellRenderer.vue +161 -161
- package/src/base-client/components/common/XTable/index.md +255 -255
- package/src/base-client/components/common/XTagGroup/index.vue +52 -52
- package/src/base-client/components/common/XTree/XTree.vue +424 -424
- package/src/base-client/components/common/XTree/index.js +3 -3
- package/src/base-client/components/common/XTree/index.md +36 -36
- package/src/base-client/components/common/XTreeOne/XTreeOne.vue +113 -113
- package/src/base-client/components/common/XTreeOne/XTreeOnePro.vue +128 -128
- package/src/base-client/components/common/richTextModal/index.vue +56 -56
- package/src/base-client/components/common/richTextModal/richDemo.vue +48 -48
- package/src/base-client/components/his/XHisEditor/index.js +3 -3
- package/src/base-client/components/index.js +51 -51
- package/src/base-client/components/layout/XTreeView/XTreeView.vue +130 -130
- package/src/base-client/components/layout/XTreeView/index.js +3 -3
- package/src/base-client/components/layout/XTreeView/index.md +46 -46
- package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
- package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
- package/src/base-client/plugins/Config.js +19 -19
- package/src/base-client/plugins/GetLoginInfoService.js +183 -183
- package/src/base-client/plugins/Recording.js +258 -258
- package/src/base-client/plugins/index.js +23 -23
- package/src/base-client/plugins/tabs-page-plugin.js +39 -39
- package/src/components/Charts/Bar.vue +62 -62
- package/src/components/Charts/ChartCard.vue +134 -134
- package/src/components/Charts/Liquid.vue +67 -67
- package/src/components/Charts/MiniArea.vue +39 -39
- package/src/components/Charts/MiniBar.vue +39 -39
- package/src/components/Charts/MiniProgress.vue +75 -75
- package/src/components/Charts/MiniSmoothArea.vue +40 -40
- package/src/components/Charts/Radar.vue +68 -68
- package/src/components/Charts/RankList.vue +77 -77
- package/src/components/Charts/TagCloud.vue +113 -113
- package/src/components/Charts/TransferBar.vue +64 -64
- package/src/components/Charts/Trend.vue +82 -82
- package/src/components/Charts/chart.less +12 -12
- package/src/components/Charts/smooth.area.less +13 -13
- package/src/components/CodeMirror/inedx.vue +118 -118
- package/src/components/CodeMirror/setting.js +40 -40
- package/src/components/NumberInfo/NumberInfo.vue +54 -54
- package/src/components/NumberInfo/index.js +3 -3
- package/src/components/NumberInfo/index.less +54 -54
- package/src/components/NumberInfo/index.md +43 -43
- package/src/components/card/ChartCard.vue +79 -79
- package/src/components/chart/Bar.vue +60 -60
- package/src/components/chart/MiniArea.vue +67 -67
- package/src/components/chart/MiniBar.vue +59 -59
- package/src/components/chart/MiniProgress.vue +57 -57
- package/src/components/chart/Radar.vue +80 -80
- package/src/components/chart/RankingList.vue +60 -60
- package/src/components/chart/Trend.vue +79 -79
- package/src/components/chart/index.less +9 -9
- package/src/components/checkbox/ColorCheckbox.vue +157 -157
- package/src/components/checkbox/ImgCheckbox.vue +117 -117
- package/src/components/checkbox/ImgCheckboxGroup.vue +76 -76
- package/src/components/checkbox/index.js +9 -9
- package/src/components/exception/ExceptionPage.vue +70 -70
- package/src/components/g2Charts/constants.js +202 -202
- package/src/components/g2Charts/demo.vue +808 -808
- package/src/components/g2Charts/designer.vue +228 -228
- package/src/components/g2Charts/designerBaseConfig.vue +61 -61
- package/src/components/g2Charts/designerDataConfig.vue +259 -259
- package/src/components/g2Charts/designerStyleConfig.vue +16 -16
- package/src/components/g2Charts/index.vue +397 -397
- package/src/components/index.js +36 -36
- package/src/components/input/IInput.vue +66 -66
- package/src/components/menu/SideMenu.vue +75 -75
- package/src/components/menu/menu.js +273 -273
- package/src/components/setting/Setting.vue +234 -234
- package/src/components/tool/AStepItem.vue +60 -60
- package/src/config/CreateQueryConfig.js +325 -325
- package/src/config/default/antd.config.js +89 -89
- package/src/config/default/setting.config.js +55 -55
- package/src/font-style/font.css +60 -60
- package/src/layouts/CommonLayout.vue +56 -56
- package/src/layouts/PageLayout.vue +151 -151
- package/src/layouts/SinglePageView.vue +136 -136
- package/src/layouts/header/AdminHeader.vue +132 -132
- package/src/layouts/header/HeaderNotice.vue +177 -177
- package/src/layouts/header/InstitutionDetail.vue +181 -181
- package/src/layouts/tabs/TabsHead.vue +189 -189
- package/src/lib.js +1 -1
- package/src/mock/extend/index.js +84 -84
- package/src/mock/goods/index.js +108 -108
- package/src/pages/DefaultExample/index.vue +77 -77
- package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
- package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
- package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
- package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
- package/src/pages/DynamicStatistics/FavoriteList.vue +50 -50
- package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
- package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
- package/src/pages/DynamicStatistics/index.vue +282 -282
- package/src/pages/Example/childIndex.vue +15 -15
- package/src/pages/Example/index.vue +30 -30
- package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
- package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
- package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
- package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
- package/src/pages/NewDynamicStatistics/FavoriteList.vue +50 -50
- package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
- package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
- package/src/pages/NewDynamicStatistics/index.vue +258 -258
- package/src/pages/Recording/index.vue +77 -77
- package/src/pages/ServiceReview/index.vue +284 -284
- package/src/pages/SubExample/index.vue +26 -26
- package/src/pages/WorkflowDetail/WorkflowPageDetail/TrimTextTail.vue +23 -23
- package/src/pages/XReportView/index.vue +64 -64
- package/src/pages/XTreeOneProExample/index.vue +67 -67
- package/src/pages/dashboard/workplace/WorkPlace.vue +141 -141
- package/src/pages/login/Login.vue +379 -379
- package/src/pages/login/LoginV3.vue +389 -389
- package/src/pages/lowCode/lowCodeEditor.vue +1219 -1219
- package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
- package/src/pages/report/ReportTable.js +124 -124
- package/src/pages/resourceManage/orgListManage.vue +98 -98
- package/src/pages/system/dictionary/index.vue +44 -44
- package/src/pages/system/monitor/loginInfor/index.vue +37 -37
- package/src/pages/system/monitor/operLog/index.vue +37 -37
- package/src/pages/system/settings/modifyPassword.vue +117 -117
- package/src/pages/system/ticket/index.vue +480 -480
- package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
- package/src/pages/userInfoDetailManage/ChangeMeterRecordQuery/index.vue +64 -64
- package/src/pages/userInfoDetailManage/InfoChangeRecordQuery/index.vue +64 -64
- package/src/pages/userInfoDetailManage/InstructRecordQuery/index.vue +64 -64
- package/src/pages/userInfoDetailManage/MeterParamRecordQuery/index.vue +64 -64
- package/src/pages/userInfoDetailManage/TransferRecordQuery/index.vue +66 -66
- package/src/pages/userInfoDetailManage/WatchCollectionRecordQuery/index.vue +64 -64
- package/src/plugins/EventLogPlugin.js +33 -33
- package/src/plugins/FindParentsData.js +17 -17
- package/src/router/async/config.async.js +35 -35
- package/src/router/index.js +27 -27
- package/src/services/DataModel.js +30 -30
- package/src/services/LodopFuncs.js +137 -137
- package/src/services/api/TicketDetailsViewApi.js +46 -46
- package/src/services/api/cas.js +79 -79
- package/src/services/api/common.js +350 -346
- package/src/services/api/entity.js +18 -18
- package/src/services/api/index.js +17 -17
- package/src/store/modules/account.js +115 -115
- package/src/store/modules/index.js +5 -5
- package/src/store/modules/lowCode.js +33 -33
- package/src/store/modules/setting.js +119 -119
- package/src/theme/default/style.less +58 -58
- package/src/utils/authority-utils.js +85 -85
- package/src/utils/errorCode.js +6 -6
- package/src/utils/formatter.js +74 -74
- package/src/utils/htmlToPDF.js +108 -108
- package/src/utils/htmlToPDFApi.js +5 -5
- package/src/utils/login.js +188 -188
- package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
- package/src/utils/lowcode/lowcodeLog.js +29 -29
- package/src/utils/lowcode/lowcodeUtils.js +373 -373
- package/src/utils/lowcode/registerComponentForEditor.js +1 -1
- package/src/utils/lowcode/registerComponentForRender.js +11 -11
- package/src/utils/map-utils.js +47 -47
- package/src/utils/reg.js +95 -95
- package/src/utils/runEvalFunction.js +14 -14
- package/src/utils/theme-color-replacer-extend.js +92 -92
- package/src/utils/util.js +329 -329
- package/src/utils/waterMark.js +31 -31
- package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
@@ -1,519 +1,519 @@
|
|
1
|
-
/** @license
|
2
|
-
jSignature v2 SVG export plugin.
|
3
|
-
|
4
|
-
*/
|
5
|
-
/**
|
6
|
-
Copyright (c) 2012 Willow Systems Corp http://willow-systems.com
|
7
|
-
MIT License <http://www.opensource.org/licenses/mit-license.php>
|
8
|
-
*/
|
9
|
-
|
10
|
-
;(function(){
|
11
|
-
'use strict'
|
12
|
-
|
13
|
-
/** @preserve
|
14
|
-
Simplify.js BSD
|
15
|
-
(c) 2012, Vladimir Agafonkin
|
16
|
-
mourner.github.com/simplify-js
|
17
|
-
|
18
|
-
*/
|
19
|
-
;(function(a,b){function c(a,b){var c=a.x-b.x,d=a.y-b.y;return c*c+d*d}function d(a,b,c){var d=b.x,e=b.y,f=c.x-d,g=c.y-e,h;if(f!==0||g!==0)h=((a.x-d)*f+(a.y-e)*g)/(f*f+g*g),h>1?(d=c.x,e=c.y):h>0&&(d+=f*h,e+=g*h);return f=a.x-d,g=a.y-e,f*f+g*g}function e(a,b){var d,e=a.length,f,g=a[0],h=[g];for(d=1;d<e;d++)f=a[d],c(f,g)>b&&(h.push(f),g=f);return g!==f&&h.push(f),h}function f(a,c){var e=a.length,f=typeof Uint8Array!=b+""?Uint8Array:Array,g=new f(e),h=0,i=e-1,j,k,l,m,n=[],o=[],p=[];g[h]=g[i]=1;while(i){k=0;for(j=h+1;j<i;j++)l=d(a[j],a[h],a[i]),l>k&&(m=j,k=l);k>c&&(g[m]=1,n.push(h),o.push(m),n.push(m),o.push(i)),h=n.pop(),i=o.pop()}for(j=0;j<e;j++)g[j]&&p.push(a[j]);return p}"use strict";var g=a;g.simplify=function(a,c,d){var g=c!==b?c*c:1;return d||(a=e(a,g)),a=f(a,g),a}})(window);
|
20
|
-
|
21
|
-
|
22
|
-
/**
|
23
|
-
Vector class. Allows us to simplify representation and manipulation of coordinate-pair
|
24
|
-
representing shift against (0, 0)
|
25
|
-
|
26
|
-
@public
|
27
|
-
@class
|
28
|
-
@param
|
29
|
-
@returns {Type}
|
30
|
-
*/
|
31
|
-
function Vector(x,y){
|
32
|
-
this.x = x
|
33
|
-
this.y = y
|
34
|
-
this.reverse = function(){
|
35
|
-
return new this.constructor(
|
36
|
-
this.x * -1
|
37
|
-
, this.y * -1
|
38
|
-
)
|
39
|
-
}
|
40
|
-
this._length = null
|
41
|
-
this.getLength = function(){
|
42
|
-
if (!this._length){
|
43
|
-
this._length = Math.sqrt( Math.pow(this.x, 2) + Math.pow(this.y, 2) )
|
44
|
-
}
|
45
|
-
return this._length
|
46
|
-
}
|
47
|
-
|
48
|
-
var polarity = function (e){
|
49
|
-
return Math.round(e / Math.abs(e))
|
50
|
-
}
|
51
|
-
this.resizeTo = function(length){
|
52
|
-
// proportionally changes x,y such that the hypotenuse (vector length) is = new length
|
53
|
-
if (this.x === 0 && this.y === 0){
|
54
|
-
this._length = 0
|
55
|
-
} else if (this.x === 0){
|
56
|
-
this._length = length
|
57
|
-
this.y = length * polarity(this.y)
|
58
|
-
} else if(this.y === 0){
|
59
|
-
this._length = length
|
60
|
-
this.x = length * polarity(this.x)
|
61
|
-
} else {
|
62
|
-
var proportion = Math.abs(this.y / this.x)
|
63
|
-
, x = Math.sqrt(Math.pow(length, 2) / (1 + Math.pow(proportion, 2)))
|
64
|
-
, y = proportion * x
|
65
|
-
this._length = length
|
66
|
-
this.x = x * polarity(this.x)
|
67
|
-
this.y = y * polarity(this.y)
|
68
|
-
}
|
69
|
-
return this
|
70
|
-
}
|
71
|
-
|
72
|
-
/**
|
73
|
-
* Calculates the angle between 'this' vector and another.
|
74
|
-
* @public
|
75
|
-
* @function
|
76
|
-
* @returns {Number} The angle between the two vectors as measured in PI.
|
77
|
-
*/
|
78
|
-
this.angleTo = function(vectorB) {
|
79
|
-
var divisor = this.getLength() * vectorB.getLength()
|
80
|
-
if (divisor === 0) {
|
81
|
-
return 0
|
82
|
-
} else {
|
83
|
-
// JavaScript floating point math is screwed up.
|
84
|
-
// because of it, the core of the formula can, on occasion, have values
|
85
|
-
// over 1.0 and below -1.0.
|
86
|
-
return Math.acos(
|
87
|
-
Math.min(
|
88
|
-
Math.max(
|
89
|
-
( this.x * vectorB.x + this.y * vectorB.y ) / divisor
|
90
|
-
, -1.0
|
91
|
-
)
|
92
|
-
, 1.0
|
93
|
-
)
|
94
|
-
) / Math.PI
|
95
|
-
}
|
96
|
-
}
|
97
|
-
}
|
98
|
-
|
99
|
-
function Point(x,y){
|
100
|
-
this.x = x
|
101
|
-
this.y = y
|
102
|
-
|
103
|
-
this.getVectorToCoordinates = function (x, y) {
|
104
|
-
return new Vector(x - this.x, y - this.y)
|
105
|
-
}
|
106
|
-
this.getVectorFromCoordinates = function (x, y) {
|
107
|
-
return this.getVectorToCoordinates(x, y).reverse()
|
108
|
-
}
|
109
|
-
this.getVectorToPoint = function (point) {
|
110
|
-
return new Vector(point.x - this.x, point.y - this.y)
|
111
|
-
}
|
112
|
-
this.getVectorFromPoint = function (point) {
|
113
|
-
return this.getVectorToPoint(point).reverse()
|
114
|
-
}
|
115
|
-
}
|
116
|
-
|
117
|
-
/**
|
118
|
-
Allows one to round a number to arbitrary precision.
|
119
|
-
Math.round() rounds to whole only.
|
120
|
-
Number.toFixed(precision) returns a string.
|
121
|
-
I need float to float, but with arbitrary precision, hence:
|
122
|
-
|
123
|
-
@public
|
124
|
-
@function
|
125
|
-
@param number {Number}
|
126
|
-
@param position {Number} number of digits right of decimal point to keep. If negative, rounding to the left of decimal.
|
127
|
-
@returns {Type}
|
128
|
-
*/
|
129
|
-
function round (number, position){
|
130
|
-
var tmp = Math.pow(10, position)
|
131
|
-
return Math.round( number * tmp ) / tmp
|
132
|
-
}
|
133
|
-
|
134
|
-
// /**
|
135
|
-
// * This is a simple, points-to-lines (not curves) renderer.
|
136
|
-
// * Keeping it around so we can activate it from time to time and see
|
137
|
-
// * if smoothing logic is off much.
|
138
|
-
// * @public
|
139
|
-
// * @function
|
140
|
-
// * @returns {String} Like so "l 1 2 3 5' with stroke as long line chain.
|
141
|
-
// */
|
142
|
-
// function compressstroke(stroke, shiftx, shifty){
|
143
|
-
// // we combine strokes data into string like this:
|
144
|
-
// // 'M 53 7 l 1 2 3 4 -5 -6 5 -6'
|
145
|
-
// // see SVG documentation for Path element's 'd' argument.
|
146
|
-
// var lastx = stroke.x[0]
|
147
|
-
// , lasty = stroke.y[0]
|
148
|
-
// , i
|
149
|
-
// , l = stroke.x.length
|
150
|
-
// , answer = ['M', lastx - shiftx, lasty - shifty, 'l']
|
151
|
-
//
|
152
|
-
// if (l === 1){
|
153
|
-
// // meaning this was just a DOT, not a stroke.
|
154
|
-
// // instead of creating a circle, we just create a short line
|
155
|
-
// answer.concat(1, -1)
|
156
|
-
// } else {
|
157
|
-
// for(i = 1; i < l; i++){
|
158
|
-
// answer = answer.concat(stroke.x[i] - lastx, stroke.y[i] - lasty)
|
159
|
-
// lastx = stroke.x[i]
|
160
|
-
// lasty = stroke.y[i]
|
161
|
-
// }
|
162
|
-
// }
|
163
|
-
// return answer.join(' ')
|
164
|
-
// }
|
165
|
-
|
166
|
-
function segmentToCurve(stroke, positionInStroke, lineCurveThreshold){
|
167
|
-
'use strict'
|
168
|
-
// long lines (ones with many pixels between them) do not look good when they are part of a large curvy stroke.
|
169
|
-
// You know, the jaggedy crocodile spine instead of a pretty, smooth curve. Yuck!
|
170
|
-
// We want to approximate pretty curves in-place of those ugly lines.
|
171
|
-
// To approximate a very nice curve we need to know the direction of line before and after.
|
172
|
-
// Hence, on long lines we actually wait for another point beyond it to come back from
|
173
|
-
// mousemoved before we draw this curve.
|
174
|
-
|
175
|
-
// So for "prior curve" to be calc'ed we need 4 points
|
176
|
-
// A, B, C, D (we are on D now, A is 3 points in the past.)
|
177
|
-
// and 3 lines:
|
178
|
-
// pre-line (from points A to B),
|
179
|
-
// this line (from points B to C), (we call it "this" because if it was not yet, it's the only one we can draw for sure.)
|
180
|
-
// post-line (from points C to D) (even through D point is 'current' we don't know how we can draw it yet)
|
181
|
-
//
|
182
|
-
// Well, actually, we don't need to *know* the point A, just the vector A->B
|
183
|
-
|
184
|
-
// Again, we can only derive curve between points positionInStroke-1 and positionInStroke
|
185
|
-
// Thus, since we can only draw a line if we know one point ahead of it, we need to shift our focus one point ahead.
|
186
|
-
positionInStroke += 1
|
187
|
-
// Let's hope the code that calls us knows we do that and does not call us with positionInStroke = index of last point.
|
188
|
-
|
189
|
-
var Cpoint = new Point(stroke.x[positionInStroke-1], stroke.y[positionInStroke-1])
|
190
|
-
, Dpoint = new Point(stroke.x[positionInStroke], stroke.y[positionInStroke])
|
191
|
-
, CDvector = Cpoint.getVectorToPoint(Dpoint)
|
192
|
-
// Again, we have a chance here to draw only PREVIOUS line segment - BC
|
193
|
-
|
194
|
-
// So, let's start with BC curve.
|
195
|
-
// if there is only 2 points in stroke array (C, D), we don't have "history" long enough to have point B, let alone point A.
|
196
|
-
// so positionInStroke should start with 2, ie
|
197
|
-
// we are here when there are at least 3 points in stroke array.
|
198
|
-
var Bpoint = new Point(stroke.x[positionInStroke-2], stroke.y[positionInStroke-2])
|
199
|
-
, BCvector = Bpoint.getVectorToPoint(Cpoint)
|
200
|
-
, ABvector
|
201
|
-
, rounding = 2
|
202
|
-
|
203
|
-
if ( BCvector.getLength() > lineCurveThreshold ){
|
204
|
-
// Yey! Pretty curves, here we come!
|
205
|
-
if(positionInStroke > 2) {
|
206
|
-
ABvector = (new Point(stroke.x[positionInStroke-3], stroke.y[positionInStroke-3])).getVectorToPoint(Bpoint)
|
207
|
-
} else {
|
208
|
-
ABvector = new Vector(0,0)
|
209
|
-
}
|
210
|
-
var minlenfraction = 0.05
|
211
|
-
, maxlen = BCvector.getLength() * 0.35
|
212
|
-
, ABCangle = BCvector.angleTo(ABvector.reverse())
|
213
|
-
, BCDangle = CDvector.angleTo(BCvector.reverse())
|
214
|
-
, BtoCP1vector = new Vector(ABvector.x + BCvector.x, ABvector.y + BCvector.y).resizeTo(
|
215
|
-
Math.max(minlenfraction, ABCangle) * maxlen
|
216
|
-
)
|
217
|
-
, CtoCP2vector = (new Vector(BCvector.x + CDvector.x, BCvector.y + CDvector.y)).reverse().resizeTo(
|
218
|
-
Math.max(minlenfraction, BCDangle) * maxlen
|
219
|
-
)
|
220
|
-
, BtoCP2vector = new Vector(BCvector.x + CtoCP2vector.x, BCvector.y + CtoCP2vector.y)
|
221
|
-
|
222
|
-
// returing curve for BC segment
|
223
|
-
// all coords are vectors against Bpoint
|
224
|
-
return [
|
225
|
-
'c' // bezier curve
|
226
|
-
, round( BtoCP1vector.x, rounding )
|
227
|
-
, round( BtoCP1vector.y, rounding )
|
228
|
-
, round( BtoCP2vector.x, rounding )
|
229
|
-
, round( BtoCP2vector.y, rounding )
|
230
|
-
, round( BCvector.x, rounding )
|
231
|
-
, round( BCvector.y, rounding )
|
232
|
-
]
|
233
|
-
} else {
|
234
|
-
return [
|
235
|
-
'l' // line
|
236
|
-
, round( BCvector.x, rounding )
|
237
|
-
, round( BCvector.y, rounding )
|
238
|
-
]
|
239
|
-
}
|
240
|
-
}
|
241
|
-
|
242
|
-
function lastSegmentToCurve(stroke, lineCurveThreshold){
|
243
|
-
'use strict'
|
244
|
-
// Here we tidy up things left unfinished
|
245
|
-
|
246
|
-
// What's left unfinished there is the curve between the last points
|
247
|
-
// in the stroke
|
248
|
-
// We can also be called when there is only one point in the stroke (meaning, the
|
249
|
-
// stroke was just a dot), in which case there is nothing for us to do.
|
250
|
-
|
251
|
-
// So for "this curve" to be calc'ed we need 3 points
|
252
|
-
// A, B, C
|
253
|
-
// and 2 lines:
|
254
|
-
// pre-line (from points A to B),
|
255
|
-
// this line (from points B to C)
|
256
|
-
// Well, actually, we don't need to *know* the point A, just the vector A->B
|
257
|
-
// so, we really need points B, C and AB vector.
|
258
|
-
var positionInStroke = stroke.x.length - 1
|
259
|
-
|
260
|
-
// there must be at least 2 points in the stroke.for us to work. Hope calling code checks for that.
|
261
|
-
var Cpoint = new Point(stroke.x[positionInStroke], stroke.y[positionInStroke])
|
262
|
-
, Bpoint = new Point(stroke.x[positionInStroke-1], stroke.y[positionInStroke-1])
|
263
|
-
, BCvector = Bpoint.getVectorToPoint(Cpoint)
|
264
|
-
, rounding = 2
|
265
|
-
|
266
|
-
if (positionInStroke > 1 && BCvector.getLength() > lineCurveThreshold){
|
267
|
-
// we have at least 3 elems in stroke
|
268
|
-
var ABvector = (new Point(stroke.x[positionInStroke-2], stroke.y[positionInStroke-2])).getVectorToPoint(Bpoint)
|
269
|
-
, ABCangle = BCvector.angleTo(ABvector.reverse())
|
270
|
-
, minlenfraction = 0.05
|
271
|
-
, maxlen = BCvector.getLength() * 0.35
|
272
|
-
, BtoCP1vector = new Vector(ABvector.x + BCvector.x, ABvector.y + BCvector.y).resizeTo(
|
273
|
-
Math.max(minlenfraction, ABCangle) * maxlen
|
274
|
-
)
|
275
|
-
|
276
|
-
return [
|
277
|
-
'c' // bezier curve
|
278
|
-
, round( BtoCP1vector.x, rounding )
|
279
|
-
, round( BtoCP1vector.y, rounding )
|
280
|
-
, round( BCvector.x, rounding ) // CP2 is same as Cpoint
|
281
|
-
, round( BCvector.y, rounding ) // CP2 is same as Cpoint
|
282
|
-
, round( BCvector.x, rounding )
|
283
|
-
, round( BCvector.y, rounding )
|
284
|
-
]
|
285
|
-
} else {
|
286
|
-
// Since there is no AB leg, there is no curve to draw. This is just line
|
287
|
-
return [
|
288
|
-
'l' // simple line
|
289
|
-
, round( BCvector.x, rounding )
|
290
|
-
, round( BCvector.y, rounding )
|
291
|
-
]
|
292
|
-
}
|
293
|
-
}
|
294
|
-
|
295
|
-
function addstroke(stroke, shiftx, shifty){
|
296
|
-
'use strict'
|
297
|
-
// we combine strokes data into string like this:
|
298
|
-
// 'M 53 7 l 1 2 c 3 4 -5 -6 5 -6'
|
299
|
-
// see SVG documentation for Path element's 'd' argument.
|
300
|
-
var lines = [
|
301
|
-
'M' // move to
|
302
|
-
, round( (stroke.x[0] - shiftx), 2)
|
303
|
-
, round( (stroke.y[0] - shifty), 2)
|
304
|
-
]
|
305
|
-
// processing all points but first and last.
|
306
|
-
, i = 1 // index zero item in there is STARTING point. we already extracted it.
|
307
|
-
, l = stroke.x.length - 1 // this is a trick. We are leaving last point coordinates for separate processing.
|
308
|
-
, lineCurveThreshold = 1
|
309
|
-
|
310
|
-
for(; i < l; i++){
|
311
|
-
lines.push.apply(lines, segmentToCurve(stroke, i, lineCurveThreshold))
|
312
|
-
}
|
313
|
-
if (l > 0 /* effectively more than 1, since we "-1" above */){
|
314
|
-
lines.push.apply(lines, lastSegmentToCurve(stroke, i, lineCurveThreshold))
|
315
|
-
} else if (l === 0){
|
316
|
-
// meaning we only have ONE point in the stroke (and otherwise refer to the stroke as "dot")
|
317
|
-
lines.push.apply(lines, ['l' , 1, 1])
|
318
|
-
}
|
319
|
-
return lines.join(' ')
|
320
|
-
}
|
321
|
-
|
322
|
-
function simplifystroke(stroke){
|
323
|
-
var d = []
|
324
|
-
, newstroke = {'x':[], 'y':[]}
|
325
|
-
, i, l
|
326
|
-
|
327
|
-
for (i = 0, l = stroke.x.length; i < l; i++){
|
328
|
-
d.push({'x':stroke.x[i], 'y':stroke.y[i]})
|
329
|
-
}
|
330
|
-
d = simplify(d, 0.7, true)
|
331
|
-
for (i = 0, l = d.length; i < l; i++){
|
332
|
-
newstroke.x.push(d[i].x)
|
333
|
-
newstroke.y.push(d[i].y)
|
334
|
-
}
|
335
|
-
return newstroke
|
336
|
-
}
|
337
|
-
|
338
|
-
// generate SVG style from settings
|
339
|
-
function styleFromSettings(settings){
|
340
|
-
var styles = [];
|
341
|
-
var meta = [
|
342
|
-
// ["style attr", "key in settings", "default value"]
|
343
|
-
["fill", undefined, "none"],
|
344
|
-
["stroke", "color", "#000000"],
|
345
|
-
["stroke-width", "lineWidth", 2],
|
346
|
-
["stroke-linecap", undefined, "round"],
|
347
|
-
["stroke-linejoin", undefined, "round"]
|
348
|
-
];
|
349
|
-
for (var i = meta.length - 1; i >= 0; i--){
|
350
|
-
var attr = meta[i][0]
|
351
|
-
, key = meta[i][1]
|
352
|
-
, defaultVal = meta[i][2];
|
353
|
-
styles.push(attr + '="' + (key in settings && settings[key] ? settings[key] : defaultVal) + '"');
|
354
|
-
}
|
355
|
-
return styles.join(' ');
|
356
|
-
}
|
357
|
-
|
358
|
-
function compressstrokes(data, settings){
|
359
|
-
'use strict'
|
360
|
-
var answer = [
|
361
|
-
'<?xml version="1.0" encoding="UTF-8" standalone="no"?>'
|
362
|
-
, '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">'
|
363
|
-
]
|
364
|
-
, i , l = data.length
|
365
|
-
, stroke
|
366
|
-
, xlimits = []
|
367
|
-
, ylimits = []
|
368
|
-
, sizex = 0
|
369
|
-
, sizey = 0
|
370
|
-
, shiftx = 0
|
371
|
-
, shifty = 0
|
372
|
-
, minx, maxx, miny, maxy, padding = 1
|
373
|
-
, simplifieddata = []
|
374
|
-
|
375
|
-
if(l !== 0){
|
376
|
-
for(i = 0; i < l; i++){
|
377
|
-
stroke = simplifystroke( data[i] )
|
378
|
-
simplifieddata.push(stroke)
|
379
|
-
xlimits = xlimits.concat(stroke.x)
|
380
|
-
ylimits = ylimits.concat(stroke.y)
|
381
|
-
}
|
382
|
-
|
383
|
-
minx = Math.min.apply(null, xlimits) - padding
|
384
|
-
maxx = Math.max.apply(null, xlimits) + padding
|
385
|
-
miny = Math.min.apply(null, ylimits) - padding
|
386
|
-
maxy = Math.max.apply(null, ylimits) + padding
|
387
|
-
shiftx = minx < 0? 0 : minx
|
388
|
-
shifty = miny < 0? 0 : miny
|
389
|
-
sizex = maxx - minx
|
390
|
-
sizey = maxy - miny
|
391
|
-
}
|
392
|
-
|
393
|
-
answer.push(
|
394
|
-
'<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="'+
|
395
|
-
sizex.toString() +
|
396
|
-
'" height="'+
|
397
|
-
sizey.toString() +
|
398
|
-
'">'
|
399
|
-
)
|
400
|
-
|
401
|
-
// // This is a nice idea: use style declaration on top, and mark the lines with 'class="f"'
|
402
|
-
// // thus saving space in svg...
|
403
|
-
// // alas, many SVG renderers don't understand "class" and render the strokes in default "fill = black, no stroke" style. Ugh!!!
|
404
|
-
// // TODO: Rewrite ImageMagic / GraphicsMagic, InkScape, http://svg.codeplex.com/ to support style + class. until then, we hardcode the stroke style within the path.
|
405
|
-
// answer.push(
|
406
|
-
// '<style type="text/css"><![CDATA[.f {fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}]]></style>'
|
407
|
-
// )
|
408
|
-
|
409
|
-
// // This set is accompaniment to "simple line renderer" - compressstroke
|
410
|
-
// answer.push(
|
411
|
-
// '<style type="text/css"><![CDATA[.t {fill:none;stroke:#FF0000;stroke-width:2}]]></style>'
|
412
|
-
// )
|
413
|
-
// for(i = 0; i < l; i++){
|
414
|
-
// stroke = data[i]
|
415
|
-
// // This one is accompaniment to "simple line renderer"
|
416
|
-
// answer.push('<path class="t" d="'+ compressstroke(stroke, shiftx, shifty) +'"/>')
|
417
|
-
// }
|
418
|
-
|
419
|
-
for(i = 0, l = simplifieddata.length; i < l; i++){
|
420
|
-
stroke = simplifieddata[i]
|
421
|
-
answer.push('<path ' + styleFromSettings(settings) + ' d="'+ addstroke(stroke, shiftx, shifty) + '"/>')
|
422
|
-
}
|
423
|
-
answer.push('</svg>')
|
424
|
-
return answer.join('')
|
425
|
-
}
|
426
|
-
|
427
|
-
if (typeof btoa !== 'function')
|
428
|
-
{
|
429
|
-
var btoa = function(data) {
|
430
|
-
/** @preserve
|
431
|
-
base64 encoder
|
432
|
-
MIT, GPL
|
433
|
-
http://phpjs.org/functions/base64_encode
|
434
|
-
+ original by: Tyler Akins (http://rumkin.com)
|
435
|
-
+ improved by: Bayron Guevara
|
436
|
-
+ improved by: Thunder.m
|
437
|
-
+ improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
|
438
|
-
+ bugfixed by: Pellentesque Malesuada
|
439
|
-
+ improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
|
440
|
-
+ improved by: Rafal Kukawski (http://kukawski.pl)
|
441
|
-
|
442
|
-
*/
|
443
|
-
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
|
444
|
-
, b64a = b64.split('')
|
445
|
-
, o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
|
446
|
-
ac = 0,
|
447
|
-
enc = "",
|
448
|
-
tmp_arr = [];
|
449
|
-
|
450
|
-
do { // pack three octets into four hexets
|
451
|
-
o1 = data.charCodeAt(i++);
|
452
|
-
o2 = data.charCodeAt(i++);
|
453
|
-
o3 = data.charCodeAt(i++);
|
454
|
-
|
455
|
-
bits = o1 << 16 | o2 << 8 | o3;
|
456
|
-
|
457
|
-
h1 = bits >> 18 & 0x3f;
|
458
|
-
h2 = bits >> 12 & 0x3f;
|
459
|
-
h3 = bits >> 6 & 0x3f;
|
460
|
-
h4 = bits & 0x3f;
|
461
|
-
|
462
|
-
// use hexets to index into b64, and append result to encoded string
|
463
|
-
tmp_arr[ac++] = b64a[h1] + b64a[h2] + b64a[h3] + b64a[h4];
|
464
|
-
} while (i < data.length);
|
465
|
-
|
466
|
-
enc = tmp_arr.join('');
|
467
|
-
var r = data.length % 3;
|
468
|
-
return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);
|
469
|
-
|
470
|
-
// end of base64 encoder MIT, GPL
|
471
|
-
}
|
472
|
-
}
|
473
|
-
|
474
|
-
var unencodedmime = 'image/svg+xml'
|
475
|
-
function getUnencodedSVG(data, settings){
|
476
|
-
return [unencodedmime , compressstrokes(data, settings)];
|
477
|
-
}
|
478
|
-
|
479
|
-
var base64encodedmime = 'image/svg+xml;base64'
|
480
|
-
function getBase64encodedSVG(data, settings){
|
481
|
-
|
482
|
-
return [base64encodedmime , btoa( compressstrokes(data, settings) )];
|
483
|
-
}
|
484
|
-
|
485
|
-
function Initializer($){
|
486
|
-
var mothership = $.fn['jSignature']
|
487
|
-
mothership(
|
488
|
-
'addPlugin'
|
489
|
-
,'export'
|
490
|
-
,'svg' // alias
|
491
|
-
,getUnencodedSVG
|
492
|
-
)
|
493
|
-
mothership(
|
494
|
-
'addPlugin'
|
495
|
-
,'export'
|
496
|
-
,unencodedmime // full name
|
497
|
-
,getUnencodedSVG
|
498
|
-
)
|
499
|
-
mothership(
|
500
|
-
'addPlugin'
|
501
|
-
,'export'
|
502
|
-
,'svgbase64' // alias
|
503
|
-
,getBase64encodedSVG
|
504
|
-
)
|
505
|
-
mothership(
|
506
|
-
'addPlugin'
|
507
|
-
,'export'
|
508
|
-
,base64encodedmime // full name
|
509
|
-
,getBase64encodedSVG
|
510
|
-
)
|
511
|
-
}
|
512
|
-
|
513
|
-
// //Because plugins are minified together with jSignature, multiple defines per (minified) file blow up and dont make sense
|
514
|
-
// //Need to revisit this later.
|
515
|
-
|
516
|
-
if(typeof $ === 'undefined') {throw new Error("We need jQuery for some of the functionality. jQuery is not detected. Failing to initialize...")}
|
517
|
-
Initializer($)
|
518
|
-
|
1
|
+
/** @license
|
2
|
+
jSignature v2 SVG export plugin.
|
3
|
+
|
4
|
+
*/
|
5
|
+
/**
|
6
|
+
Copyright (c) 2012 Willow Systems Corp http://willow-systems.com
|
7
|
+
MIT License <http://www.opensource.org/licenses/mit-license.php>
|
8
|
+
*/
|
9
|
+
|
10
|
+
;(function(){
|
11
|
+
'use strict'
|
12
|
+
|
13
|
+
/** @preserve
|
14
|
+
Simplify.js BSD
|
15
|
+
(c) 2012, Vladimir Agafonkin
|
16
|
+
mourner.github.com/simplify-js
|
17
|
+
|
18
|
+
*/
|
19
|
+
;(function(a,b){function c(a,b){var c=a.x-b.x,d=a.y-b.y;return c*c+d*d}function d(a,b,c){var d=b.x,e=b.y,f=c.x-d,g=c.y-e,h;if(f!==0||g!==0)h=((a.x-d)*f+(a.y-e)*g)/(f*f+g*g),h>1?(d=c.x,e=c.y):h>0&&(d+=f*h,e+=g*h);return f=a.x-d,g=a.y-e,f*f+g*g}function e(a,b){var d,e=a.length,f,g=a[0],h=[g];for(d=1;d<e;d++)f=a[d],c(f,g)>b&&(h.push(f),g=f);return g!==f&&h.push(f),h}function f(a,c){var e=a.length,f=typeof Uint8Array!=b+""?Uint8Array:Array,g=new f(e),h=0,i=e-1,j,k,l,m,n=[],o=[],p=[];g[h]=g[i]=1;while(i){k=0;for(j=h+1;j<i;j++)l=d(a[j],a[h],a[i]),l>k&&(m=j,k=l);k>c&&(g[m]=1,n.push(h),o.push(m),n.push(m),o.push(i)),h=n.pop(),i=o.pop()}for(j=0;j<e;j++)g[j]&&p.push(a[j]);return p}"use strict";var g=a;g.simplify=function(a,c,d){var g=c!==b?c*c:1;return d||(a=e(a,g)),a=f(a,g),a}})(window);
|
20
|
+
|
21
|
+
|
22
|
+
/**
|
23
|
+
Vector class. Allows us to simplify representation and manipulation of coordinate-pair
|
24
|
+
representing shift against (0, 0)
|
25
|
+
|
26
|
+
@public
|
27
|
+
@class
|
28
|
+
@param
|
29
|
+
@returns {Type}
|
30
|
+
*/
|
31
|
+
function Vector(x,y){
|
32
|
+
this.x = x
|
33
|
+
this.y = y
|
34
|
+
this.reverse = function(){
|
35
|
+
return new this.constructor(
|
36
|
+
this.x * -1
|
37
|
+
, this.y * -1
|
38
|
+
)
|
39
|
+
}
|
40
|
+
this._length = null
|
41
|
+
this.getLength = function(){
|
42
|
+
if (!this._length){
|
43
|
+
this._length = Math.sqrt( Math.pow(this.x, 2) + Math.pow(this.y, 2) )
|
44
|
+
}
|
45
|
+
return this._length
|
46
|
+
}
|
47
|
+
|
48
|
+
var polarity = function (e){
|
49
|
+
return Math.round(e / Math.abs(e))
|
50
|
+
}
|
51
|
+
this.resizeTo = function(length){
|
52
|
+
// proportionally changes x,y such that the hypotenuse (vector length) is = new length
|
53
|
+
if (this.x === 0 && this.y === 0){
|
54
|
+
this._length = 0
|
55
|
+
} else if (this.x === 0){
|
56
|
+
this._length = length
|
57
|
+
this.y = length * polarity(this.y)
|
58
|
+
} else if(this.y === 0){
|
59
|
+
this._length = length
|
60
|
+
this.x = length * polarity(this.x)
|
61
|
+
} else {
|
62
|
+
var proportion = Math.abs(this.y / this.x)
|
63
|
+
, x = Math.sqrt(Math.pow(length, 2) / (1 + Math.pow(proportion, 2)))
|
64
|
+
, y = proportion * x
|
65
|
+
this._length = length
|
66
|
+
this.x = x * polarity(this.x)
|
67
|
+
this.y = y * polarity(this.y)
|
68
|
+
}
|
69
|
+
return this
|
70
|
+
}
|
71
|
+
|
72
|
+
/**
|
73
|
+
* Calculates the angle between 'this' vector and another.
|
74
|
+
* @public
|
75
|
+
* @function
|
76
|
+
* @returns {Number} The angle between the two vectors as measured in PI.
|
77
|
+
*/
|
78
|
+
this.angleTo = function(vectorB) {
|
79
|
+
var divisor = this.getLength() * vectorB.getLength()
|
80
|
+
if (divisor === 0) {
|
81
|
+
return 0
|
82
|
+
} else {
|
83
|
+
// JavaScript floating point math is screwed up.
|
84
|
+
// because of it, the core of the formula can, on occasion, have values
|
85
|
+
// over 1.0 and below -1.0.
|
86
|
+
return Math.acos(
|
87
|
+
Math.min(
|
88
|
+
Math.max(
|
89
|
+
( this.x * vectorB.x + this.y * vectorB.y ) / divisor
|
90
|
+
, -1.0
|
91
|
+
)
|
92
|
+
, 1.0
|
93
|
+
)
|
94
|
+
) / Math.PI
|
95
|
+
}
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
99
|
+
function Point(x,y){
|
100
|
+
this.x = x
|
101
|
+
this.y = y
|
102
|
+
|
103
|
+
this.getVectorToCoordinates = function (x, y) {
|
104
|
+
return new Vector(x - this.x, y - this.y)
|
105
|
+
}
|
106
|
+
this.getVectorFromCoordinates = function (x, y) {
|
107
|
+
return this.getVectorToCoordinates(x, y).reverse()
|
108
|
+
}
|
109
|
+
this.getVectorToPoint = function (point) {
|
110
|
+
return new Vector(point.x - this.x, point.y - this.y)
|
111
|
+
}
|
112
|
+
this.getVectorFromPoint = function (point) {
|
113
|
+
return this.getVectorToPoint(point).reverse()
|
114
|
+
}
|
115
|
+
}
|
116
|
+
|
117
|
+
/**
|
118
|
+
Allows one to round a number to arbitrary precision.
|
119
|
+
Math.round() rounds to whole only.
|
120
|
+
Number.toFixed(precision) returns a string.
|
121
|
+
I need float to float, but with arbitrary precision, hence:
|
122
|
+
|
123
|
+
@public
|
124
|
+
@function
|
125
|
+
@param number {Number}
|
126
|
+
@param position {Number} number of digits right of decimal point to keep. If negative, rounding to the left of decimal.
|
127
|
+
@returns {Type}
|
128
|
+
*/
|
129
|
+
function round (number, position){
|
130
|
+
var tmp = Math.pow(10, position)
|
131
|
+
return Math.round( number * tmp ) / tmp
|
132
|
+
}
|
133
|
+
|
134
|
+
// /**
|
135
|
+
// * This is a simple, points-to-lines (not curves) renderer.
|
136
|
+
// * Keeping it around so we can activate it from time to time and see
|
137
|
+
// * if smoothing logic is off much.
|
138
|
+
// * @public
|
139
|
+
// * @function
|
140
|
+
// * @returns {String} Like so "l 1 2 3 5' with stroke as long line chain.
|
141
|
+
// */
|
142
|
+
// function compressstroke(stroke, shiftx, shifty){
|
143
|
+
// // we combine strokes data into string like this:
|
144
|
+
// // 'M 53 7 l 1 2 3 4 -5 -6 5 -6'
|
145
|
+
// // see SVG documentation for Path element's 'd' argument.
|
146
|
+
// var lastx = stroke.x[0]
|
147
|
+
// , lasty = stroke.y[0]
|
148
|
+
// , i
|
149
|
+
// , l = stroke.x.length
|
150
|
+
// , answer = ['M', lastx - shiftx, lasty - shifty, 'l']
|
151
|
+
//
|
152
|
+
// if (l === 1){
|
153
|
+
// // meaning this was just a DOT, not a stroke.
|
154
|
+
// // instead of creating a circle, we just create a short line
|
155
|
+
// answer.concat(1, -1)
|
156
|
+
// } else {
|
157
|
+
// for(i = 1; i < l; i++){
|
158
|
+
// answer = answer.concat(stroke.x[i] - lastx, stroke.y[i] - lasty)
|
159
|
+
// lastx = stroke.x[i]
|
160
|
+
// lasty = stroke.y[i]
|
161
|
+
// }
|
162
|
+
// }
|
163
|
+
// return answer.join(' ')
|
164
|
+
// }
|
165
|
+
|
166
|
+
function segmentToCurve(stroke, positionInStroke, lineCurveThreshold){
|
167
|
+
'use strict'
|
168
|
+
// long lines (ones with many pixels between them) do not look good when they are part of a large curvy stroke.
|
169
|
+
// You know, the jaggedy crocodile spine instead of a pretty, smooth curve. Yuck!
|
170
|
+
// We want to approximate pretty curves in-place of those ugly lines.
|
171
|
+
// To approximate a very nice curve we need to know the direction of line before and after.
|
172
|
+
// Hence, on long lines we actually wait for another point beyond it to come back from
|
173
|
+
// mousemoved before we draw this curve.
|
174
|
+
|
175
|
+
// So for "prior curve" to be calc'ed we need 4 points
|
176
|
+
// A, B, C, D (we are on D now, A is 3 points in the past.)
|
177
|
+
// and 3 lines:
|
178
|
+
// pre-line (from points A to B),
|
179
|
+
// this line (from points B to C), (we call it "this" because if it was not yet, it's the only one we can draw for sure.)
|
180
|
+
// post-line (from points C to D) (even through D point is 'current' we don't know how we can draw it yet)
|
181
|
+
//
|
182
|
+
// Well, actually, we don't need to *know* the point A, just the vector A->B
|
183
|
+
|
184
|
+
// Again, we can only derive curve between points positionInStroke-1 and positionInStroke
|
185
|
+
// Thus, since we can only draw a line if we know one point ahead of it, we need to shift our focus one point ahead.
|
186
|
+
positionInStroke += 1
|
187
|
+
// Let's hope the code that calls us knows we do that and does not call us with positionInStroke = index of last point.
|
188
|
+
|
189
|
+
var Cpoint = new Point(stroke.x[positionInStroke-1], stroke.y[positionInStroke-1])
|
190
|
+
, Dpoint = new Point(stroke.x[positionInStroke], stroke.y[positionInStroke])
|
191
|
+
, CDvector = Cpoint.getVectorToPoint(Dpoint)
|
192
|
+
// Again, we have a chance here to draw only PREVIOUS line segment - BC
|
193
|
+
|
194
|
+
// So, let's start with BC curve.
|
195
|
+
// if there is only 2 points in stroke array (C, D), we don't have "history" long enough to have point B, let alone point A.
|
196
|
+
// so positionInStroke should start with 2, ie
|
197
|
+
// we are here when there are at least 3 points in stroke array.
|
198
|
+
var Bpoint = new Point(stroke.x[positionInStroke-2], stroke.y[positionInStroke-2])
|
199
|
+
, BCvector = Bpoint.getVectorToPoint(Cpoint)
|
200
|
+
, ABvector
|
201
|
+
, rounding = 2
|
202
|
+
|
203
|
+
if ( BCvector.getLength() > lineCurveThreshold ){
|
204
|
+
// Yey! Pretty curves, here we come!
|
205
|
+
if(positionInStroke > 2) {
|
206
|
+
ABvector = (new Point(stroke.x[positionInStroke-3], stroke.y[positionInStroke-3])).getVectorToPoint(Bpoint)
|
207
|
+
} else {
|
208
|
+
ABvector = new Vector(0,0)
|
209
|
+
}
|
210
|
+
var minlenfraction = 0.05
|
211
|
+
, maxlen = BCvector.getLength() * 0.35
|
212
|
+
, ABCangle = BCvector.angleTo(ABvector.reverse())
|
213
|
+
, BCDangle = CDvector.angleTo(BCvector.reverse())
|
214
|
+
, BtoCP1vector = new Vector(ABvector.x + BCvector.x, ABvector.y + BCvector.y).resizeTo(
|
215
|
+
Math.max(minlenfraction, ABCangle) * maxlen
|
216
|
+
)
|
217
|
+
, CtoCP2vector = (new Vector(BCvector.x + CDvector.x, BCvector.y + CDvector.y)).reverse().resizeTo(
|
218
|
+
Math.max(minlenfraction, BCDangle) * maxlen
|
219
|
+
)
|
220
|
+
, BtoCP2vector = new Vector(BCvector.x + CtoCP2vector.x, BCvector.y + CtoCP2vector.y)
|
221
|
+
|
222
|
+
// returing curve for BC segment
|
223
|
+
// all coords are vectors against Bpoint
|
224
|
+
return [
|
225
|
+
'c' // bezier curve
|
226
|
+
, round( BtoCP1vector.x, rounding )
|
227
|
+
, round( BtoCP1vector.y, rounding )
|
228
|
+
, round( BtoCP2vector.x, rounding )
|
229
|
+
, round( BtoCP2vector.y, rounding )
|
230
|
+
, round( BCvector.x, rounding )
|
231
|
+
, round( BCvector.y, rounding )
|
232
|
+
]
|
233
|
+
} else {
|
234
|
+
return [
|
235
|
+
'l' // line
|
236
|
+
, round( BCvector.x, rounding )
|
237
|
+
, round( BCvector.y, rounding )
|
238
|
+
]
|
239
|
+
}
|
240
|
+
}
|
241
|
+
|
242
|
+
function lastSegmentToCurve(stroke, lineCurveThreshold){
|
243
|
+
'use strict'
|
244
|
+
// Here we tidy up things left unfinished
|
245
|
+
|
246
|
+
// What's left unfinished there is the curve between the last points
|
247
|
+
// in the stroke
|
248
|
+
// We can also be called when there is only one point in the stroke (meaning, the
|
249
|
+
// stroke was just a dot), in which case there is nothing for us to do.
|
250
|
+
|
251
|
+
// So for "this curve" to be calc'ed we need 3 points
|
252
|
+
// A, B, C
|
253
|
+
// and 2 lines:
|
254
|
+
// pre-line (from points A to B),
|
255
|
+
// this line (from points B to C)
|
256
|
+
// Well, actually, we don't need to *know* the point A, just the vector A->B
|
257
|
+
// so, we really need points B, C and AB vector.
|
258
|
+
var positionInStroke = stroke.x.length - 1
|
259
|
+
|
260
|
+
// there must be at least 2 points in the stroke.for us to work. Hope calling code checks for that.
|
261
|
+
var Cpoint = new Point(stroke.x[positionInStroke], stroke.y[positionInStroke])
|
262
|
+
, Bpoint = new Point(stroke.x[positionInStroke-1], stroke.y[positionInStroke-1])
|
263
|
+
, BCvector = Bpoint.getVectorToPoint(Cpoint)
|
264
|
+
, rounding = 2
|
265
|
+
|
266
|
+
if (positionInStroke > 1 && BCvector.getLength() > lineCurveThreshold){
|
267
|
+
// we have at least 3 elems in stroke
|
268
|
+
var ABvector = (new Point(stroke.x[positionInStroke-2], stroke.y[positionInStroke-2])).getVectorToPoint(Bpoint)
|
269
|
+
, ABCangle = BCvector.angleTo(ABvector.reverse())
|
270
|
+
, minlenfraction = 0.05
|
271
|
+
, maxlen = BCvector.getLength() * 0.35
|
272
|
+
, BtoCP1vector = new Vector(ABvector.x + BCvector.x, ABvector.y + BCvector.y).resizeTo(
|
273
|
+
Math.max(minlenfraction, ABCangle) * maxlen
|
274
|
+
)
|
275
|
+
|
276
|
+
return [
|
277
|
+
'c' // bezier curve
|
278
|
+
, round( BtoCP1vector.x, rounding )
|
279
|
+
, round( BtoCP1vector.y, rounding )
|
280
|
+
, round( BCvector.x, rounding ) // CP2 is same as Cpoint
|
281
|
+
, round( BCvector.y, rounding ) // CP2 is same as Cpoint
|
282
|
+
, round( BCvector.x, rounding )
|
283
|
+
, round( BCvector.y, rounding )
|
284
|
+
]
|
285
|
+
} else {
|
286
|
+
// Since there is no AB leg, there is no curve to draw. This is just line
|
287
|
+
return [
|
288
|
+
'l' // simple line
|
289
|
+
, round( BCvector.x, rounding )
|
290
|
+
, round( BCvector.y, rounding )
|
291
|
+
]
|
292
|
+
}
|
293
|
+
}
|
294
|
+
|
295
|
+
function addstroke(stroke, shiftx, shifty){
|
296
|
+
'use strict'
|
297
|
+
// we combine strokes data into string like this:
|
298
|
+
// 'M 53 7 l 1 2 c 3 4 -5 -6 5 -6'
|
299
|
+
// see SVG documentation for Path element's 'd' argument.
|
300
|
+
var lines = [
|
301
|
+
'M' // move to
|
302
|
+
, round( (stroke.x[0] - shiftx), 2)
|
303
|
+
, round( (stroke.y[0] - shifty), 2)
|
304
|
+
]
|
305
|
+
// processing all points but first and last.
|
306
|
+
, i = 1 // index zero item in there is STARTING point. we already extracted it.
|
307
|
+
, l = stroke.x.length - 1 // this is a trick. We are leaving last point coordinates for separate processing.
|
308
|
+
, lineCurveThreshold = 1
|
309
|
+
|
310
|
+
for(; i < l; i++){
|
311
|
+
lines.push.apply(lines, segmentToCurve(stroke, i, lineCurveThreshold))
|
312
|
+
}
|
313
|
+
if (l > 0 /* effectively more than 1, since we "-1" above */){
|
314
|
+
lines.push.apply(lines, lastSegmentToCurve(stroke, i, lineCurveThreshold))
|
315
|
+
} else if (l === 0){
|
316
|
+
// meaning we only have ONE point in the stroke (and otherwise refer to the stroke as "dot")
|
317
|
+
lines.push.apply(lines, ['l' , 1, 1])
|
318
|
+
}
|
319
|
+
return lines.join(' ')
|
320
|
+
}
|
321
|
+
|
322
|
+
function simplifystroke(stroke){
|
323
|
+
var d = []
|
324
|
+
, newstroke = {'x':[], 'y':[]}
|
325
|
+
, i, l
|
326
|
+
|
327
|
+
for (i = 0, l = stroke.x.length; i < l; i++){
|
328
|
+
d.push({'x':stroke.x[i], 'y':stroke.y[i]})
|
329
|
+
}
|
330
|
+
d = simplify(d, 0.7, true)
|
331
|
+
for (i = 0, l = d.length; i < l; i++){
|
332
|
+
newstroke.x.push(d[i].x)
|
333
|
+
newstroke.y.push(d[i].y)
|
334
|
+
}
|
335
|
+
return newstroke
|
336
|
+
}
|
337
|
+
|
338
|
+
// generate SVG style from settings
|
339
|
+
function styleFromSettings(settings){
|
340
|
+
var styles = [];
|
341
|
+
var meta = [
|
342
|
+
// ["style attr", "key in settings", "default value"]
|
343
|
+
["fill", undefined, "none"],
|
344
|
+
["stroke", "color", "#000000"],
|
345
|
+
["stroke-width", "lineWidth", 2],
|
346
|
+
["stroke-linecap", undefined, "round"],
|
347
|
+
["stroke-linejoin", undefined, "round"]
|
348
|
+
];
|
349
|
+
for (var i = meta.length - 1; i >= 0; i--){
|
350
|
+
var attr = meta[i][0]
|
351
|
+
, key = meta[i][1]
|
352
|
+
, defaultVal = meta[i][2];
|
353
|
+
styles.push(attr + '="' + (key in settings && settings[key] ? settings[key] : defaultVal) + '"');
|
354
|
+
}
|
355
|
+
return styles.join(' ');
|
356
|
+
}
|
357
|
+
|
358
|
+
function compressstrokes(data, settings){
|
359
|
+
'use strict'
|
360
|
+
var answer = [
|
361
|
+
'<?xml version="1.0" encoding="UTF-8" standalone="no"?>'
|
362
|
+
, '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">'
|
363
|
+
]
|
364
|
+
, i , l = data.length
|
365
|
+
, stroke
|
366
|
+
, xlimits = []
|
367
|
+
, ylimits = []
|
368
|
+
, sizex = 0
|
369
|
+
, sizey = 0
|
370
|
+
, shiftx = 0
|
371
|
+
, shifty = 0
|
372
|
+
, minx, maxx, miny, maxy, padding = 1
|
373
|
+
, simplifieddata = []
|
374
|
+
|
375
|
+
if(l !== 0){
|
376
|
+
for(i = 0; i < l; i++){
|
377
|
+
stroke = simplifystroke( data[i] )
|
378
|
+
simplifieddata.push(stroke)
|
379
|
+
xlimits = xlimits.concat(stroke.x)
|
380
|
+
ylimits = ylimits.concat(stroke.y)
|
381
|
+
}
|
382
|
+
|
383
|
+
minx = Math.min.apply(null, xlimits) - padding
|
384
|
+
maxx = Math.max.apply(null, xlimits) + padding
|
385
|
+
miny = Math.min.apply(null, ylimits) - padding
|
386
|
+
maxy = Math.max.apply(null, ylimits) + padding
|
387
|
+
shiftx = minx < 0? 0 : minx
|
388
|
+
shifty = miny < 0? 0 : miny
|
389
|
+
sizex = maxx - minx
|
390
|
+
sizey = maxy - miny
|
391
|
+
}
|
392
|
+
|
393
|
+
answer.push(
|
394
|
+
'<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="'+
|
395
|
+
sizex.toString() +
|
396
|
+
'" height="'+
|
397
|
+
sizey.toString() +
|
398
|
+
'">'
|
399
|
+
)
|
400
|
+
|
401
|
+
// // This is a nice idea: use style declaration on top, and mark the lines with 'class="f"'
|
402
|
+
// // thus saving space in svg...
|
403
|
+
// // alas, many SVG renderers don't understand "class" and render the strokes in default "fill = black, no stroke" style. Ugh!!!
|
404
|
+
// // TODO: Rewrite ImageMagic / GraphicsMagic, InkScape, http://svg.codeplex.com/ to support style + class. until then, we hardcode the stroke style within the path.
|
405
|
+
// answer.push(
|
406
|
+
// '<style type="text/css"><![CDATA[.f {fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}]]></style>'
|
407
|
+
// )
|
408
|
+
|
409
|
+
// // This set is accompaniment to "simple line renderer" - compressstroke
|
410
|
+
// answer.push(
|
411
|
+
// '<style type="text/css"><![CDATA[.t {fill:none;stroke:#FF0000;stroke-width:2}]]></style>'
|
412
|
+
// )
|
413
|
+
// for(i = 0; i < l; i++){
|
414
|
+
// stroke = data[i]
|
415
|
+
// // This one is accompaniment to "simple line renderer"
|
416
|
+
// answer.push('<path class="t" d="'+ compressstroke(stroke, shiftx, shifty) +'"/>')
|
417
|
+
// }
|
418
|
+
|
419
|
+
for(i = 0, l = simplifieddata.length; i < l; i++){
|
420
|
+
stroke = simplifieddata[i]
|
421
|
+
answer.push('<path ' + styleFromSettings(settings) + ' d="'+ addstroke(stroke, shiftx, shifty) + '"/>')
|
422
|
+
}
|
423
|
+
answer.push('</svg>')
|
424
|
+
return answer.join('')
|
425
|
+
}
|
426
|
+
|
427
|
+
if (typeof btoa !== 'function')
|
428
|
+
{
|
429
|
+
var btoa = function(data) {
|
430
|
+
/** @preserve
|
431
|
+
base64 encoder
|
432
|
+
MIT, GPL
|
433
|
+
http://phpjs.org/functions/base64_encode
|
434
|
+
+ original by: Tyler Akins (http://rumkin.com)
|
435
|
+
+ improved by: Bayron Guevara
|
436
|
+
+ improved by: Thunder.m
|
437
|
+
+ improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
|
438
|
+
+ bugfixed by: Pellentesque Malesuada
|
439
|
+
+ improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
|
440
|
+
+ improved by: Rafal Kukawski (http://kukawski.pl)
|
441
|
+
|
442
|
+
*/
|
443
|
+
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
|
444
|
+
, b64a = b64.split('')
|
445
|
+
, o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
|
446
|
+
ac = 0,
|
447
|
+
enc = "",
|
448
|
+
tmp_arr = [];
|
449
|
+
|
450
|
+
do { // pack three octets into four hexets
|
451
|
+
o1 = data.charCodeAt(i++);
|
452
|
+
o2 = data.charCodeAt(i++);
|
453
|
+
o3 = data.charCodeAt(i++);
|
454
|
+
|
455
|
+
bits = o1 << 16 | o2 << 8 | o3;
|
456
|
+
|
457
|
+
h1 = bits >> 18 & 0x3f;
|
458
|
+
h2 = bits >> 12 & 0x3f;
|
459
|
+
h3 = bits >> 6 & 0x3f;
|
460
|
+
h4 = bits & 0x3f;
|
461
|
+
|
462
|
+
// use hexets to index into b64, and append result to encoded string
|
463
|
+
tmp_arr[ac++] = b64a[h1] + b64a[h2] + b64a[h3] + b64a[h4];
|
464
|
+
} while (i < data.length);
|
465
|
+
|
466
|
+
enc = tmp_arr.join('');
|
467
|
+
var r = data.length % 3;
|
468
|
+
return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);
|
469
|
+
|
470
|
+
// end of base64 encoder MIT, GPL
|
471
|
+
}
|
472
|
+
}
|
473
|
+
|
474
|
+
var unencodedmime = 'image/svg+xml'
|
475
|
+
function getUnencodedSVG(data, settings){
|
476
|
+
return [unencodedmime , compressstrokes(data, settings)];
|
477
|
+
}
|
478
|
+
|
479
|
+
var base64encodedmime = 'image/svg+xml;base64'
|
480
|
+
function getBase64encodedSVG(data, settings){
|
481
|
+
|
482
|
+
return [base64encodedmime , btoa( compressstrokes(data, settings) )];
|
483
|
+
}
|
484
|
+
|
485
|
+
function Initializer($){
|
486
|
+
var mothership = $.fn['jSignature']
|
487
|
+
mothership(
|
488
|
+
'addPlugin'
|
489
|
+
,'export'
|
490
|
+
,'svg' // alias
|
491
|
+
,getUnencodedSVG
|
492
|
+
)
|
493
|
+
mothership(
|
494
|
+
'addPlugin'
|
495
|
+
,'export'
|
496
|
+
,unencodedmime // full name
|
497
|
+
,getUnencodedSVG
|
498
|
+
)
|
499
|
+
mothership(
|
500
|
+
'addPlugin'
|
501
|
+
,'export'
|
502
|
+
,'svgbase64' // alias
|
503
|
+
,getBase64encodedSVG
|
504
|
+
)
|
505
|
+
mothership(
|
506
|
+
'addPlugin'
|
507
|
+
,'export'
|
508
|
+
,base64encodedmime // full name
|
509
|
+
,getBase64encodedSVG
|
510
|
+
)
|
511
|
+
}
|
512
|
+
|
513
|
+
// //Because plugins are minified together with jSignature, multiple defines per (minified) file blow up and dont make sense
|
514
|
+
// //Need to revisit this later.
|
515
|
+
|
516
|
+
if(typeof $ === 'undefined') {throw new Error("We need jQuery for some of the functionality. jQuery is not detected. Failing to initialize...")}
|
517
|
+
Initializer($)
|
518
|
+
|
519
519
|
})();
|