| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 | // #ifdef APP-NVUEimport {	sleep,	getImageInfo,	isBase64,	networkReg} from './utils';const dom = weex.requireModule('dom')import {	version} from '../../package.json'export default {	data() {		return {			tempFilePath: [],			isInitFile: false,			osName: uni.getSystemInfoSync().osName		}	},	methods: {		getParentWeith() {			return new Promise(resolve => {				dom.getComponentRect(this.$refs.limepainter, (res) => {					this.parentWidth = Math.ceil(res.size.width)					this.canvasWidth = this.canvasWidth || this.parentWidth || 300					this.canvasHeight = res.size.height || this.canvasHeight || 150					resolve(res.size)				})			})		},		onPageFinish() {			this.webview = this.$refs.webview			this.webview.evalJS(`init(${this.dpr})`)		},		onMessage(e) {			const res = e.detail.data[0] || null;			if (res.event) {				if (res.event == 'inited') {					this.inited = true				}				if (res.event == 'fail') {					this.$emit('fail', res)				}				if (res.event == 'layoutChange') {					const data = typeof res.data == 'string' ? JSON.parse(res.data) : res.data					this.canvasWidth = Math.ceil(data.width);					this.canvasHeight = Math.ceil(data.height);				}				if (res.event == 'progressChange') {					this.progress = res.data * 1				}				if (res.event == 'file') {					this.tempFilePath.push(res.data)					if (this.tempFilePath.length > 7) {						this.tempFilePath.shift()					}					return				}				if (res.event == 'success') {					if (res.data) {						this.tempFilePath.push(res.data)						if (this.tempFilePath.length > 8) {							this.tempFilePath.shift()						}						if (this.isCanvasToTempFilePath) {							this.setFilePath(this.tempFilePath.join(''), {								isEmit: true							})						}					} else {						this.$emit('fail', 'canvas no data')					}					return				}				this.$emit(res.event, JSON.parse(res.data));			} else if (res.file) {				this.file = res.data;			} else {				console.info(res[0])			}		},		getWebViewInited() {			if (this.inited) return Promise.resolve(this.inited);			return new Promise((resolve) => {				this.$watch(					'inited',					async val => {						if (val) {							resolve(val)						}					}, {						immediate: true					}				);			})		},		getTempFilePath() {			if (this.tempFilePath.length == 8) return Promise.resolve(this.tempFilePath)			return new Promise((resolve) => {				this.$watch(					'tempFilePath',					async val => {						if (val.length == 8) {							resolve(val.join(''))						}					}, {						deep: true					}				);			})		},		getWebViewDone() {			if (this.progress == 1) return Promise.resolve(this.progress);			return new Promise((resolve) => {				this.$watch(					'progress',					async val => {						if (val == 1) {							this.$emit('done')							this.done = true							this.runTask()							resolve(val)						}					}, {						immediate: true					}				);			})		},		async render(args) {			try {				await this.getSize(args)				const {					width				} = args.css || args				if (!width && this.parentWidth) {					Object.assign(args, {						width: this.parentWidth					})				}				const newNode = await this.calcImage(args);				await this.getWebViewInited()				this.webview.evalJS(`source(${JSON.stringify(newNode)})`)				await this.getWebViewDone()				await sleep(this.afterDelay)				if (this.isCanvasToTempFilePath) {					const params = {						fileType: this.fileType,						quality: this.quality					}					this.webview.evalJS(`save(${JSON.stringify(params)})`)				}				return Promise.resolve()			} catch (e) {				this.$emit('fail', e)			}		},		async calcImage(args) {			let node = JSON.parse(JSON.stringify(args))			const urlReg = /url\((.+)\)/			const {				backgroundImage			} = node.css || {}			const isBG = backgroundImage && urlReg.exec(backgroundImage)[1]			const url = node.url || node.src || isBG			if (['text', 'qrcode'].includes(node.type)) {				return node			}			if ((node.type === "image" || isBG) && url && !isBase64(url) && (this.osName == 'ios' || !networkReg					.test(url))) {				let {					path				} = await getImageInfo(url, true)				if (isBG) {					node.css.backgroundImage = `url(${path})`				} else {					node.src = path				}			} else if (node.views && node.views.length) {				for (let i = 0; i < node.views.length; i++) {					node.views[i] = await this.calcImage(node.views[i])				}			}			return node		},		async canvasToTempFilePath(args = {}) {			if (!this.inited) {				return this.$emit('fail', 'no init')			}			this.tempFilePath = []			if (args.fileType == 'jpg') {				args.fileType = 'jpeg'			}			this.webview.evalJS(`save(${JSON.stringify(args)})`)			try {				let tempFilePath = await this.getTempFilePath()				tempFilePath = await this.setFilePath(tempFilePath, args)				args.success({					errMsg: "canvasToTempFilePath:ok",					tempFilePath				})			} catch (e) {				console.log('e', e)				args.fail({					error: e				})			}		}	}}// #endif
 |