parent
940ec616d7
commit
de2d5fb1fa
@ -0,0 +1,79 @@
|
||||
const html5Entities = require('../vendors/html5-entities')
|
||||
const { windowWidth } = wx.getSystemInfoSync()
|
||||
|
||||
module.exports = item => {
|
||||
// decode html entities
|
||||
if (item.type === 'Text') {
|
||||
item.content = html5Entities.decode(item.content)
|
||||
return
|
||||
}
|
||||
|
||||
// <video> and <audio>
|
||||
if (item.tagName === 'video' || item.tagName === 'audio') {
|
||||
item.wxTag = item.tagName
|
||||
|
||||
if (!item.attributes.src) {
|
||||
item.children.some(child => {
|
||||
if (child.tagName === 'source') {
|
||||
item.attributes.src = child.attributes.src
|
||||
return true
|
||||
}
|
||||
return false
|
||||
})
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// <br>
|
||||
if (item.tagName === 'br') {
|
||||
item.wxTag = 'text'
|
||||
item.children = [{ type: 'Text', content: '\n' }]
|
||||
return
|
||||
}
|
||||
|
||||
// other tags
|
||||
if (['b', 'big', 'i', 'small', 'tt', 'abbr', 'acronym', 'cite', 'code', 'dfn', 'em', 'kbd', 'strong', 'samp', 'time', 'var', 'a', 'bdo', 'map', 'object', 'q', 'script', 'span', 'sub', 'sup', 'button', 'input', 'label', 'select', 'textarea'].indexOf(item.tagName) !== -1) {
|
||||
item.wxTag = 'text'
|
||||
} else {
|
||||
item.wxTag = 'view'
|
||||
}
|
||||
|
||||
// <img>
|
||||
if (item.tagName === 'img') {
|
||||
item.wxTag = 'image'
|
||||
|
||||
let width, height
|
||||
|
||||
if (!item.attributes.style) item.attributes.style = {}
|
||||
|
||||
if (item.attributes.style.width && item.attributes.style.width.indexOf('px')) {
|
||||
width = item.attributes.style.width.slice(0, -2)
|
||||
} else if (item.attributes.width) {
|
||||
width = item.attributes.width
|
||||
}
|
||||
|
||||
if (item.attributes.style.height && item.attributes.style.height.indexOf('px')) {
|
||||
height = item.attributes.style.height.slice(0, -2)
|
||||
} else if (item.attributes.height) {
|
||||
height = item.attributes.height
|
||||
}
|
||||
|
||||
if (item.attributes.style) {
|
||||
delete item.attributes.style.width
|
||||
delete item.attributes.style.height
|
||||
}
|
||||
|
||||
delete item.attributes.width
|
||||
delete item.attributes.height
|
||||
|
||||
if (width && width < windowWidth) {
|
||||
item.attributes.style.width = width + 'px'
|
||||
if (height) item.attributes.style.height = height + 'px'
|
||||
}
|
||||
}
|
||||
|
||||
// generate inline style string
|
||||
if (item.attributes && item.attributes.style) {
|
||||
item.attributes.styleString = Object.keys(item.attributes.style).map(key => key + ': ' + item.attributes.style[key]).join(';')
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
// 七牛图片裁剪
|
||||
|
||||
const { pixelRatio, windowWidth } = wx.getSystemInfoSync()
|
||||
const width = pixelRatio * windowWidth
|
||||
|
||||
module.exports = (domain, quality) =>
|
||||
item => {
|
||||
if (item.tagName === 'img' && item.attributes.src.indexOf(domain) !== -1 && item.attributes.src.indexOf('?') === -1) {
|
||||
item.attributes.src += '?imageView2/2/w/' + width
|
||||
if (quality) item.attributes.src += '/q/' + quality
|
||||
}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
// <a> to <navigator>
|
||||
|
||||
const url = require('../vendors/url')
|
||||
const Router = require('../vendors/Router')
|
||||
|
||||
module.exports = (domain, routes) =>
|
||||
item => {
|
||||
if (item.tagName === 'a') {
|
||||
const u = url.parse(item.attributes.href)
|
||||
if (u.hostname === domain) {
|
||||
const router = new Router(routes)
|
||||
const route = router.match(u.pathname)
|
||||
if (route) {
|
||||
item.wxTag = 'navigator'
|
||||
item.url = url.format({ pathname: route.path, query: Object.assign(u.query, route.params, route.options) })
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
const { resolve } = require('../vendors/url')
|
||||
|
||||
module.exports = baseUrl =>
|
||||
item => {
|
||||
if (['img', 'video', 'audio', 'source'].indexOf(item.tagName) !== -1) {
|
||||
if (item.attributes.src) item.attributes.src = resolve(baseUrl, item.attributes.src)
|
||||
} else if (item.tagName === 'a') {
|
||||
item.attributes.href = resolve(baseUrl, item.attributes.href)
|
||||
}
|
||||
}
|
@ -0,0 +1,52 @@
|
||||
const himalaya = require('./vendors/himalaya')
|
||||
const defaultEachFn = require('./each/default')
|
||||
const resolveUrl = require('./each/resolveUrl')
|
||||
|
||||
class HtmlParser {
|
||||
constructor(html, { baseUrl } = {}) {
|
||||
this.nodes = himalaya.parse(html)
|
||||
if (baseUrl) this.each(resolveUrl(baseUrl))
|
||||
this.each(defaultEachFn)
|
||||
}
|
||||
|
||||
each(fn) {
|
||||
this._each(fn, this.nodes)
|
||||
return this
|
||||
}
|
||||
|
||||
_each(fn, nodes) {
|
||||
nodes.forEach((item, ...args) => {
|
||||
fn(item, ...args)
|
||||
|
||||
if (item.children) this._each(fn, item.children)
|
||||
})
|
||||
}
|
||||
|
||||
filter(fn) {
|
||||
this.nodes = this._filter(fn, this.nodes)
|
||||
return this
|
||||
}
|
||||
|
||||
_filter(fn, nodes) {
|
||||
return nodes.filter((item, ...args) => {
|
||||
const result = fn(item, ...args)
|
||||
if (result && item.children) item.children = this._filter(fn, item.children)
|
||||
return result
|
||||
})
|
||||
}
|
||||
|
||||
map(fn) {
|
||||
this.nodes = this._map(fn, this.nodes)
|
||||
return this
|
||||
}
|
||||
|
||||
_map(fn, nodes) {
|
||||
return nodes.map((item, ...args) => {
|
||||
item = fn(item, ...args)
|
||||
if (item.children) item.children = this._map(fn, item.children)
|
||||
return item
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = HtmlParser
|
@ -0,0 +1,7 @@
|
||||
<import src="nodes.wxml" />
|
||||
|
||||
<template name="html-view">
|
||||
<view class="html-view">
|
||||
<template is="html-view-nodes" data="{{nodes: data}}" />
|
||||
</view>
|
||||
</template>
|
@ -0,0 +1,21 @@
|
||||
@import "reset.wxss";
|
||||
|
||||
.html-view {
|
||||
font-size: 36rpx;
|
||||
color: #333;
|
||||
line-height: 1.6;
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
.img, .video {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.table {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.th, .td {
|
||||
border: 1rpx solid #333;
|
||||
padding: 10rpx;
|
||||
}
|
@ -0,0 +1,241 @@
|
||||
<template name="html-view-nodes">
|
||||
<block wx:for="{{nodes}}" wx:key="">
|
||||
<block wx:if="{{item.type === 'Text'}}">{{item.content}}</block>
|
||||
<block wx:elif="{{item.type === 'Element'}}">
|
||||
<view wx:if="{{item.wxTag === 'view'}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-1" data="{{nodes: item.children}}" />
|
||||
</view>
|
||||
|
||||
<text wx:elif="{{item.wxTag === 'text'}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-1" data="{{nodes: item.children}}" />
|
||||
</text>
|
||||
|
||||
<navigator wx:elif="{{item.wxTag === 'navigator'}}" url="{{item.url}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-1" data="{{nodes: item.children}}" />
|
||||
</navigator>
|
||||
|
||||
<image wx:if="{{item.wxTag === 'image'}}" src="{{item.attributes.src}}" class="img" mode="widthFix" style="{{item.attributes.styleString}}" />
|
||||
|
||||
<video wx:elif="{{item.wxTag === 'video'}}" src="{{item.attributes.src}}" class="video"></video>
|
||||
|
||||
<audio wx:elif="{{item.wxTag === 'audio'}}" src="{{item.attributes.src}}" class="audio" controls></audio>
|
||||
</block>
|
||||
</block>
|
||||
</template>
|
||||
<template name="html-view-nodes-1">
|
||||
<block wx:for="{{nodes}}" wx:key="">
|
||||
<block wx:if="{{item.type === 'Text'}}">{{item.content}}</block>
|
||||
<block wx:elif="{{item.type === 'Element'}}">
|
||||
<view wx:if="{{item.wxTag === 'view'}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-2" data="{{nodes: item.children}}" />
|
||||
</view>
|
||||
|
||||
<text wx:elif="{{item.wxTag === 'text'}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-2" data="{{nodes: item.children}}" />
|
||||
</text>
|
||||
|
||||
<navigator wx:elif="{{item.wxTag === 'navigator'}}" url="{{item.url}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-2" data="{{nodes: item.children}}" />
|
||||
</navigator>
|
||||
|
||||
<image wx:if="{{item.wxTag === 'image'}}" src="{{item.attributes.src}}" class="img" mode="widthFix" style="{{item.attributes.styleString}}" />
|
||||
|
||||
<video wx:elif="{{item.wxTag === 'video'}}" src="{{item.attributes.src}}" class="video"></video>
|
||||
|
||||
<audio wx:elif="{{item.wxTag === 'audio'}}" src="{{item.attributes.src}}" class="audio" controls></audio>
|
||||
</block>
|
||||
</block>
|
||||
</template>
|
||||
<template name="html-view-nodes-2">
|
||||
<block wx:for="{{nodes}}" wx:key="">
|
||||
<block wx:if="{{item.type === 'Text'}}">{{item.content}}</block>
|
||||
<block wx:elif="{{item.type === 'Element'}}">
|
||||
<view wx:if="{{item.wxTag === 'view'}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-3" data="{{nodes: item.children}}" />
|
||||
</view>
|
||||
|
||||
<text wx:elif="{{item.wxTag === 'text'}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-3" data="{{nodes: item.children}}" />
|
||||
</text>
|
||||
|
||||
<navigator wx:elif="{{item.wxTag === 'navigator'}}" url="{{item.url}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-3" data="{{nodes: item.children}}" />
|
||||
</navigator>
|
||||
|
||||
<image wx:if="{{item.wxTag === 'image'}}" src="{{item.attributes.src}}" class="img" mode="widthFix" style="{{item.attributes.styleString}}" />
|
||||
|
||||
<video wx:elif="{{item.wxTag === 'video'}}" src="{{item.attributes.src}}" class="video"></video>
|
||||
|
||||
<audio wx:elif="{{item.wxTag === 'audio'}}" src="{{item.attributes.src}}" class="audio" controls></audio>
|
||||
</block>
|
||||
</block>
|
||||
</template>
|
||||
<template name="html-view-nodes-3">
|
||||
<block wx:for="{{nodes}}" wx:key="">
|
||||
<block wx:if="{{item.type === 'Text'}}">{{item.content}}</block>
|
||||
<block wx:elif="{{item.type === 'Element'}}">
|
||||
<view wx:if="{{item.wxTag === 'view'}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-4" data="{{nodes: item.children}}" />
|
||||
</view>
|
||||
|
||||
<text wx:elif="{{item.wxTag === 'text'}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-4" data="{{nodes: item.children}}" />
|
||||
</text>
|
||||
|
||||
<navigator wx:elif="{{item.wxTag === 'navigator'}}" url="{{item.url}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-4" data="{{nodes: item.children}}" />
|
||||
</navigator>
|
||||
|
||||
<image wx:if="{{item.wxTag === 'image'}}" src="{{item.attributes.src}}" class="img" mode="widthFix" style="{{item.attributes.styleString}}" />
|
||||
|
||||
<video wx:elif="{{item.wxTag === 'video'}}" src="{{item.attributes.src}}" class="video"></video>
|
||||
|
||||
<audio wx:elif="{{item.wxTag === 'audio'}}" src="{{item.attributes.src}}" class="audio" controls></audio>
|
||||
</block>
|
||||
</block>
|
||||
</template>
|
||||
<template name="html-view-nodes-4">
|
||||
<block wx:for="{{nodes}}" wx:key="">
|
||||
<block wx:if="{{item.type === 'Text'}}">{{item.content}}</block>
|
||||
<block wx:elif="{{item.type === 'Element'}}">
|
||||
<view wx:if="{{item.wxTag === 'view'}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-5" data="{{nodes: item.children}}" />
|
||||
</view>
|
||||
|
||||
<text wx:elif="{{item.wxTag === 'text'}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-5" data="{{nodes: item.children}}" />
|
||||
</text>
|
||||
|
||||
<navigator wx:elif="{{item.wxTag === 'navigator'}}" url="{{item.url}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-5" data="{{nodes: item.children}}" />
|
||||
</navigator>
|
||||
|
||||
<image wx:if="{{item.wxTag === 'image'}}" src="{{item.attributes.src}}" class="img" mode="widthFix" style="{{item.attributes.styleString}}" />
|
||||
|
||||
<video wx:elif="{{item.wxTag === 'video'}}" src="{{item.attributes.src}}" class="video"></video>
|
||||
|
||||
<audio wx:elif="{{item.wxTag === 'audio'}}" src="{{item.attributes.src}}" class="audio" controls></audio>
|
||||
</block>
|
||||
</block>
|
||||
</template>
|
||||
<template name="html-view-nodes-5">
|
||||
<block wx:for="{{nodes}}" wx:key="">
|
||||
<block wx:if="{{item.type === 'Text'}}">{{item.content}}</block>
|
||||
<block wx:elif="{{item.type === 'Element'}}">
|
||||
<view wx:if="{{item.wxTag === 'view'}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-6" data="{{nodes: item.children}}" />
|
||||
</view>
|
||||
|
||||
<text wx:elif="{{item.wxTag === 'text'}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-6" data="{{nodes: item.children}}" />
|
||||
</text>
|
||||
|
||||
<navigator wx:elif="{{item.wxTag === 'navigator'}}" url="{{item.url}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-6" data="{{nodes: item.children}}" />
|
||||
</navigator>
|
||||
|
||||
<image wx:if="{{item.wxTag === 'image'}}" src="{{item.attributes.src}}" class="img" mode="widthFix" style="{{item.attributes.styleString}}" />
|
||||
|
||||
<video wx:elif="{{item.wxTag === 'video'}}" src="{{item.attributes.src}}" class="video"></video>
|
||||
|
||||
<audio wx:elif="{{item.wxTag === 'audio'}}" src="{{item.attributes.src}}" class="audio" controls></audio>
|
||||
</block>
|
||||
</block>
|
||||
</template>
|
||||
<template name="html-view-nodes-6">
|
||||
<block wx:for="{{nodes}}" wx:key="">
|
||||
<block wx:if="{{item.type === 'Text'}}">{{item.content}}</block>
|
||||
<block wx:elif="{{item.type === 'Element'}}">
|
||||
<view wx:if="{{item.wxTag === 'view'}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-7" data="{{nodes: item.children}}" />
|
||||
</view>
|
||||
|
||||
<text wx:elif="{{item.wxTag === 'text'}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-7" data="{{nodes: item.children}}" />
|
||||
</text>
|
||||
|
||||
<navigator wx:elif="{{item.wxTag === 'navigator'}}" url="{{item.url}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-7" data="{{nodes: item.children}}" />
|
||||
</navigator>
|
||||
|
||||
<image wx:if="{{item.wxTag === 'image'}}" src="{{item.attributes.src}}" class="img" mode="widthFix" style="{{item.attributes.styleString}}" />
|
||||
|
||||
<video wx:elif="{{item.wxTag === 'video'}}" src="{{item.attributes.src}}" class="video"></video>
|
||||
|
||||
<audio wx:elif="{{item.wxTag === 'audio'}}" src="{{item.attributes.src}}" class="audio" controls></audio>
|
||||
</block>
|
||||
</block>
|
||||
</template>
|
||||
<template name="html-view-nodes-7">
|
||||
<block wx:for="{{nodes}}" wx:key="">
|
||||
<block wx:if="{{item.type === 'Text'}}">{{item.content}}</block>
|
||||
<block wx:elif="{{item.type === 'Element'}}">
|
||||
<view wx:if="{{item.wxTag === 'view'}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-8" data="{{nodes: item.children}}" />
|
||||
</view>
|
||||
|
||||
<text wx:elif="{{item.wxTag === 'text'}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-8" data="{{nodes: item.children}}" />
|
||||
</text>
|
||||
|
||||
<navigator wx:elif="{{item.wxTag === 'navigator'}}" url="{{item.url}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-8" data="{{nodes: item.children}}" />
|
||||
</navigator>
|
||||
|
||||
<image wx:if="{{item.wxTag === 'image'}}" src="{{item.attributes.src}}" class="img" mode="widthFix" style="{{item.attributes.styleString}}" />
|
||||
|
||||
<video wx:elif="{{item.wxTag === 'video'}}" src="{{item.attributes.src}}" class="video"></video>
|
||||
|
||||
<audio wx:elif="{{item.wxTag === 'audio'}}" src="{{item.attributes.src}}" class="audio" controls></audio>
|
||||
</block>
|
||||
</block>
|
||||
</template>
|
||||
<template name="html-view-nodes-8">
|
||||
<block wx:for="{{nodes}}" wx:key="">
|
||||
<block wx:if="{{item.type === 'Text'}}">{{item.content}}</block>
|
||||
<block wx:elif="{{item.type === 'Element'}}">
|
||||
<view wx:if="{{item.wxTag === 'view'}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-9" data="{{nodes: item.children}}" />
|
||||
</view>
|
||||
|
||||
<text wx:elif="{{item.wxTag === 'text'}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-9" data="{{nodes: item.children}}" />
|
||||
</text>
|
||||
|
||||
<navigator wx:elif="{{item.wxTag === 'navigator'}}" url="{{item.url}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-9" data="{{nodes: item.children}}" />
|
||||
</navigator>
|
||||
|
||||
<image wx:if="{{item.wxTag === 'image'}}" src="{{item.attributes.src}}" class="img" mode="widthFix" style="{{item.attributes.styleString}}" />
|
||||
|
||||
<video wx:elif="{{item.wxTag === 'video'}}" src="{{item.attributes.src}}" class="video"></video>
|
||||
|
||||
<audio wx:elif="{{item.wxTag === 'audio'}}" src="{{item.attributes.src}}" class="audio" controls></audio>
|
||||
</block>
|
||||
</block>
|
||||
</template>
|
||||
<template name="html-view-nodes-9">
|
||||
<block wx:for="{{nodes}}" wx:key="">
|
||||
<block wx:if="{{item.type === 'Text'}}">{{item.content}}</block>
|
||||
<block wx:elif="{{item.type === 'Element'}}">
|
||||
<view wx:if="{{item.wxTag === 'view'}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-10" data="{{nodes: item.children}}" />
|
||||
</view>
|
||||
|
||||
<text wx:elif="{{item.wxTag === 'text'}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-10" data="{{nodes: item.children}}" />
|
||||
</text>
|
||||
|
||||
<navigator wx:elif="{{item.wxTag === 'navigator'}}" url="{{item.url}}" class="{{item.tagName}} {{item.attributes.className}}" style="{{item.attributes.styleString}}">
|
||||
<template is="html-view-nodes-10" data="{{nodes: item.children}}" />
|
||||
</navigator>
|
||||
|
||||
<image wx:if="{{item.wxTag === 'image'}}" src="{{item.attributes.src}}" class="img" mode="widthFix" style="{{item.attributes.styleString}}" />
|
||||
|
||||
<video wx:elif="{{item.wxTag === 'video'}}" src="{{item.attributes.src}}" class="video"></video>
|
||||
|
||||
<audio wx:elif="{{item.wxTag === 'audio'}}" src="{{item.attributes.src}}" class="audio" controls></audio>
|
||||
</block>
|
||||
</block>
|
||||
</template>
|
||||
<template name="html-view-nodes-10"></template>
|
@ -0,0 +1,306 @@
|
||||
/*
|
||||
css reset
|
||||
based on https://chromium.googlesource.com/chromium/blink/+/master/Source/core/css/html.css
|
||||
*/
|
||||
|
||||
.html {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* children of the <head> element all have display:none */
|
||||
.head {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.meta {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.title {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.style {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.script {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* generic block-level elements */
|
||||
|
||||
.body {
|
||||
display: block;
|
||||
margin: 8rpx;
|
||||
}
|
||||
|
||||
.p {
|
||||
display: block;
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
.div {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.layer {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.article, .aside, .footer, .header, .hgroup, .main, .nav, .section {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.marquee {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.address {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.blockquote {
|
||||
display: block;
|
||||
margin: 1em 40rpx;
|
||||
}
|
||||
|
||||
.figcaption {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.figure {
|
||||
display: block;
|
||||
margin: 1em 40rpx;
|
||||
}
|
||||
|
||||
.q {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.q:before {
|
||||
content: open-quote;
|
||||
}
|
||||
|
||||
.q:after {
|
||||
content: close-quote;
|
||||
}
|
||||
|
||||
.center {
|
||||
display: block;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.hr {
|
||||
display: block;
|
||||
margin: 0.5em 0;
|
||||
border: 1rpx inset;
|
||||
}
|
||||
|
||||
.map {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
/* heading elements */
|
||||
|
||||
.h1 {
|
||||
display: block;
|
||||
font-size: 2em;
|
||||
font-weight: bold;
|
||||
margin: 0.67em 0;
|
||||
}
|
||||
|
||||
.h2 {
|
||||
display: block;
|
||||
font-size: 1.5em;
|
||||
font-weight: bold;
|
||||
margin: 0.83em 0;
|
||||
}
|
||||
|
||||
.h3 {
|
||||
display: block;
|
||||
font-size: 1.17em;
|
||||
font-weight: bold;
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
.h4 {
|
||||
display: block;
|
||||
font-weight: bold;
|
||||
margin: 1.33em 0;
|
||||
}
|
||||
|
||||
.h5 {
|
||||
display: block;
|
||||
font-size: 0.83em;
|
||||
font-weight: bold;
|
||||
margin: 1.67em 0;
|
||||
}
|
||||
|
||||
.h6 {
|
||||
display: block;
|
||||
font-size: 0.67em;
|
||||
font-weight: bold;
|
||||
margin: 2.33em 0;
|
||||
}
|
||||
|
||||
/* tables */
|
||||
|
||||
.table {
|
||||
display: table;
|
||||
border-collapse: separate;
|
||||
border-spacing: 2px;
|
||||
border-color: gray;
|
||||
}
|
||||
|
||||
.thead {
|
||||
display: table-header-group;
|
||||
vertical-align: middle;
|
||||
border-color: inherit;
|
||||
}
|
||||
|
||||
.tbody {
|
||||
display: table-row-group;
|
||||
vertical-align: middle;
|
||||
border-color: inherit;
|
||||
}
|
||||
|
||||
.tfoot {
|
||||
display: table-footer-group;
|
||||
vertical-align: middle;
|
||||
border-color: inherit;
|
||||
}
|
||||
|
||||
.col {
|
||||
display: table-column;
|
||||
}
|
||||
|
||||
.colgroup {
|
||||
display: table-column-group;
|
||||
}
|
||||
|
||||
.tr {
|
||||
display: table-row;
|
||||
vertical-align: inherit;
|
||||
border-color: inherit
|
||||
}
|
||||
|
||||
.td, .th {
|
||||
display: table-cell;
|
||||
vertical-align: inherit;
|
||||
}
|
||||
|
||||
.th {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.caption {
|
||||
display: table-caption;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* lists */
|
||||
|
||||
.ul, .menu, .dir {
|
||||
list-style-type: disc;
|
||||
margin: 1em 0;
|
||||
padding-left: 40rpx;
|
||||
}
|
||||
|
||||
.ol {
|
||||
display: block;
|
||||
list-style-type: decimal;
|
||||
margin: 1em 0;
|
||||
padding-left: 40rpx;
|
||||
}
|
||||
|
||||
.li {
|
||||
display: list-item;
|
||||
text-align: match-parent;
|
||||
}
|
||||
|
||||
.ul .ul, .ol .ul {
|
||||
list-style-type: circle
|
||||
}
|
||||
|
||||
.ol .ol .ul, .ol .ul .ul, .ul .ol .ul, .ul .ul .ul {
|
||||
list-style-type: square;
|
||||
}
|
||||
|
||||
.dd {
|
||||
display: block;
|
||||
margin-left: 40rpx;
|
||||
}
|
||||
|
||||
.dl {
|
||||
display: block;
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
.dt {
|
||||
display: block
|
||||
}
|
||||
|
||||
.ol .ul, .ul .ol, .ul .ul, .ol .ol {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* inline elements */
|
||||
|
||||
.u, .ins {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.strong, .b {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.i, .cite, .em, .var, .address, .dfn {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.tt, .code, .kbd, .samp {
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
.pre, .xmp, .plaintext, .listing {
|
||||
display: block;
|
||||
font-family: monospace;
|
||||
white-space: pre;
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
.mark {
|
||||
background-color: yellow;
|
||||
color: black;
|
||||
}
|
||||
|
||||
.big {
|
||||
font-size: larger;
|
||||
}
|
||||
|
||||
.small {
|
||||
font-size: smaller;
|
||||
}
|
||||
|
||||
.s, .strike, .del {
|
||||
text-decoration: line-through;
|
||||
}
|
||||
|
||||
.sub {
|
||||
vertical-align: sub;
|
||||
font-size: smaller;
|
||||
}
|
||||
|
||||
.sup {
|
||||
vertical-align: super;
|
||||
font-size: smaller;
|
||||
}
|
||||
|
||||
.nobr {
|
||||
white-space: nowrap;
|
||||
}
|
@ -0,0 +1,198 @@
|
||||
(function (global, factory) {
|
||||
if (typeof define === "function" && define.amd) {
|
||||
define(['module', 'exports'], factory);
|
||||
} else if (typeof exports !== "undefined") {
|
||||
factory(module, exports);
|
||||
} else {
|
||||
var mod = {
|
||||
exports: {}
|
||||
};
|
||||
factory(mod, mod.exports);
|
||||
global.Router = mod.exports;
|
||||
}
|
||||
})(this, function (module, exports) {
|
||||
'use strict';
|
||||
|
||||
exports.__esModule = true;
|
||||
|
||||
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
|
||||
return typeof obj;
|
||||
} : function (obj) {
|
||||
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
|
||||
};
|
||||
|
||||
function _classCallCheck(instance, Constructor) {
|
||||
if (!(instance instanceof Constructor)) {
|
||||
throw new TypeError("Cannot call a class as a function");
|
||||
}
|
||||
}
|
||||
|
||||
var Router = function () {
|
||||
function Router(conf) {
|
||||
_classCallCheck(this, Router);
|
||||
|
||||
this.routes = {};
|
||||
|
||||
if (conf.constructor === Array) conf = { ALL: conf };
|
||||
|
||||
for (var method in conf) {
|
||||
var routes = conf[method];
|
||||
var rts = this.routes[method] = {
|
||||
string: {},
|
||||
regex: []
|
||||
};
|
||||
|
||||
var _loop = function _loop() {
|
||||
if (_isArray) {
|
||||
if (_i >= _iterator.length) return 'break';
|
||||
_ref = _iterator[_i++];
|
||||
} else {
|
||||
_i = _iterator.next();
|
||||
if (_i.done) return 'break';
|
||||
_ref = _i.value;
|
||||
}
|
||||
|
||||
var _rt = _ref;
|
||||
|
||||
var pattern = void 0,
|
||||
replacement = void 0,
|
||||
params = void 0,
|
||||
options = void 0;
|
||||
|
||||
if (_rt.constructor === String) {
|
||||
pattern = _rt;
|
||||
replacement = '$&';
|
||||
params = [];
|
||||
options = {};
|
||||
} else {
|
||||
var rt = _rt.concat();
|
||||
pattern = rt.shift();
|
||||
replacement = rt.shift() || '$&';
|
||||
options = _typeof(rt[rt.length - 1]) == 'object' ? rt.pop() : {};
|
||||
params = rt;
|
||||
}
|
||||
|
||||
if (pattern.constructor === RegExp) {
|
||||
rts.regex.push({
|
||||
pattern: pattern,
|
||||
replacement: replacement,
|
||||
params: params,
|
||||
options: options,
|
||||
origin: _rt
|
||||
});
|
||||
} else {
|
||||
if (!/:|\*|\$/.test(pattern)) {
|
||||
rts.string[pattern] = {
|
||||
replacement: replacement === '$&' ? pattern : replacement,
|
||||
options: options,
|
||||
origin: _rt
|
||||
};
|
||||
} else {
|
||||
params = [];
|
||||
|
||||
pattern = pattern.replace(/[\\&()+.[?^{|]/g, '\\$&').replace(/:(\w+)/g, function (str, key) {
|
||||
params.push(key);
|
||||
return '([^/]+)';
|
||||
}).replace(/\*/g, '.*');
|
||||
|
||||
rts.regex.push({
|
||||
pattern: new RegExp('^' + pattern + '$'),
|
||||
replacement: replacement,
|
||||
params: params,
|
||||
options: options,
|
||||
origin: _rt
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
for (var _iterator = routes, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
|
||||
var _ref;
|
||||
|
||||
var _ret = _loop();
|
||||
|
||||
if (_ret === 'break') break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Router.prototype.match = function match(path) {
|
||||
var method = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'ALL';
|
||||
|
||||
var rts = this.routes[method];
|
||||
|
||||
if (rts) {
|
||||
if (rts.string[path]) {
|
||||
var match = {
|
||||
path: rts.string[path].replacement,
|
||||
params: {},
|
||||
options: rts.string[path].options,
|
||||
origin: rts.string[path].origin
|
||||
};
|
||||
|
||||
if (Router.log) {
|
||||
console.log('path:', path, '\n', 'method:', method, '\n', 'match:', match); // eslint-disable-line
|
||||
}
|
||||
|
||||
return match;
|
||||
}
|
||||
|
||||
var _replacement = void 0;
|
||||
var _params = {};
|
||||
for (var _iterator2 = rts.regex, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
|
||||
var _ref2;
|
||||
|
||||
if (_isArray2) {
|
||||
if (_i2 >= _iterator2.length) break;
|
||||
_ref2 = _iterator2[_i2++];
|
||||
} else {
|
||||
_i2 = _iterator2.next();
|
||||
if (_i2.done) break;
|
||||
_ref2 = _i2.value;
|
||||
}
|
||||
|
||||
var rt = _ref2;
|
||||
|
||||
var matches = path.match(rt.pattern);
|
||||
if (matches) {
|
||||
_replacement = rt.replacement;
|
||||
if (_replacement.indexOf('$') !== -1) {
|
||||
_replacement = _replacement === '$&' ? path : path.replace(rt.pattern, _replacement);
|
||||
}
|
||||
|
||||
matches.shift();
|
||||
for (var j = 0; j < rt.params.length; j++) {
|
||||
if (rt.params[j]) {
|
||||
_params[rt.params[j]] = matches[j];
|
||||
}
|
||||
}
|
||||
|
||||
var _match = {
|
||||
path: _replacement,
|
||||
params: _params,
|
||||
options: rt.options,
|
||||
origin: rt.origin
|
||||
};
|
||||
|
||||
if (Router.log) {
|
||||
console.log('path:', path, '\n', 'method:', method, '\n', 'match:', _match); // eslint-disable-line
|
||||
}
|
||||
|
||||
return _match;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Router.log) {
|
||||
console.log('path:', path, '\n', 'method:', method, '\n', 'match:', null); // eslint-disable-line
|
||||
}
|
||||
|
||||
return method === 'ALL' ? null : this.match(path);
|
||||
};
|
||||
|
||||
return Router;
|
||||
}();
|
||||
|
||||
exports.default = Router;
|
||||
module.exports = exports['default'];
|
||||
});
|
@ -0,0 +1,317 @@
|
||||
(function() {
|
||||
var root = this;
|
||||
|
||||
var tagStart = '<';
|
||||
var tagEnd = '>';
|
||||
var commentStart = '<!--';
|
||||
var commentEnd = '-->';
|
||||
|
||||
var voidTags = [
|
||||
"!doctype", "area", "base", "br", "col", "command",
|
||||
"embed", "hr", "img", "input", "keygen", "link",
|
||||
"meta", "param", "source", "track", "wbr"
|
||||
];
|
||||
var closingTags = [
|
||||
"colgroup", "dd", "dt", "li", "options", "p",
|
||||
"td", "tfoot", "th", "thead", "tr"
|
||||
];
|
||||
var childlessTags = ['style', 'script', 'template'];
|
||||
|
||||
function parse(str) {
|
||||
return parseUntil(str + '</root>', ['root']).nodes;
|
||||
}
|
||||
|
||||
function parseUntil(str, stack) {
|
||||
var nodes = [];
|
||||
|
||||
while (str.length) {
|
||||
var nextTag = str.indexOf(tagStart);
|
||||
if (nextTag === -1) {
|
||||
// only text left
|
||||
nodes.push({
|
||||
type: 'Text',
|
||||
content: str
|
||||
});
|
||||
str = '';
|
||||
break;
|
||||
}
|
||||
|
||||
if (nextTag) {
|
||||
// text before tag
|
||||
nodes.push({
|
||||
type: 'Text',
|
||||
content: str.slice(0, nextTag)
|
||||
});
|
||||
str = str.slice(nextTag);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (startsWithCommentStart(str)) {
|
||||
// comment
|
||||
var end = str.indexOf(commentEnd);
|
||||
nodes.push({
|
||||
type: 'Comment',
|
||||
content: str.slice(commentStart.length, end)
|
||||
});
|
||||
str = str.slice(end + commentEnd.length);
|
||||
continue;
|
||||
}
|
||||
|
||||
var isClosingTag = str.charAt(nextTag + 1) === '/';
|
||||
if (isClosingTag) {
|
||||
var endTagEnd = str.indexOf(tagEnd);
|
||||
var innerTag = str.slice(2, endTagEnd);
|
||||
var tagName = innerTag.trim().split(' ')[0];
|
||||
str = str.slice(endTagEnd + 1);
|
||||
var loc = stack.lastIndexOf(tagName);
|
||||
if (~loc) {
|
||||
stack = stack.slice(0, loc);
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// open tag
|
||||
var results = parseTag(str, stack);
|
||||
if (results.tag) {
|
||||
results.tag.type = 'Element';
|
||||
nodes.push(results.tag);
|
||||
str = results.str;
|
||||
}
|
||||
if (results.stack.length !== stack.length) {
|
||||
stack = results.stack;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
nodes: nodes,
|
||||
stack: stack,
|
||||
str: str
|
||||
};
|
||||
}
|
||||
|
||||
function parseTag(str, stack) {
|
||||
var idxTagEnd = str.indexOf(tagEnd);
|
||||
var idxSpace = str.indexOf(' ');
|
||||
var tagNameEnd = ~idxSpace ?
|
||||
Math.min(idxTagEnd, idxSpace) :
|
||||
idxTagEnd;
|
||||
var tagName = str.slice(1, tagNameEnd);
|
||||
var lowTagName = tagName.toLowerCase();
|
||||
|
||||
if (stack[stack.length - 1] === tagName && ~closingTags.indexOf(lowTagName)) {
|
||||
return {
|
||||
stack: stack.slice(0, -1)
|
||||
};
|
||||
}
|
||||
|
||||
var attrs = parseAttrs(str.slice(tagNameEnd));
|
||||
var tag = {
|
||||
tagName: tagName,
|
||||
attributes: attrs.attributes
|
||||
};
|
||||
str = attrs.str;
|
||||
|
||||
if (startsWithSelfClose(str)) {
|
||||
str = str.slice(2);
|
||||
} else {
|
||||
str = str.slice(1);
|
||||
|
||||
if (~childlessTags.indexOf(lowTagName)) {
|
||||
var end = '</' + tagName + '>';
|
||||
var idx = str.indexOf(end);
|
||||
if (!~idx) idx = Infinity;
|
||||
tag.content = str.slice(0, idx);
|
||||
str = str.slice(idx);
|
||||
} else if (!~voidTags.indexOf(lowTagName)) {
|
||||
var results = parseUntil(str, stack.concat(tagName));
|
||||
tag.children = results.nodes;
|
||||
str = results.str;
|
||||
stack = results.stack;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
tag: tag,
|
||||
str: str,
|
||||
stack: stack
|
||||
};
|
||||
}
|
||||
|
||||
function parseAttrs(str) {
|
||||
str = str.trim();
|
||||
var results = tagPairs(str, 0);
|
||||
str = str.slice(results.cursor);
|
||||
var attributes = results.kvs.map(function(pair) {
|
||||
var kv = splitHead(pair.trim(), '=');
|
||||
kv[1] = kv[1] ? unquote(kv[1]) : kv[0];
|
||||
return kv;
|
||||
}).reduce(function(attrs, kv) {
|
||||
var property = kv[0];
|
||||
var value = kv[1];
|
||||
if (property === 'class') {
|
||||
attrs.className = value.split(' ');
|
||||
} else if (property === 'style') {
|
||||
attrs.style = parseStyle(value);
|
||||
} else if (startsWithDataDash(property)) {
|
||||
attrs.dataset = attrs.dataset || {};
|
||||
var key = camelCase(property.slice(5));
|
||||
attrs.dataset[key] = castValue(value);
|
||||
} else {
|
||||
attrs[camelCase(property)] = castValue(value);
|
||||
}
|
||||
return attrs;
|
||||
}, {});
|
||||
return {
|
||||
str: str,
|
||||
attributes: attributes
|
||||
};
|
||||
}
|
||||
|
||||
function splitHead(str, sep) {
|
||||
var idx = str.indexOf(sep);
|
||||
if (idx === -1) return [str];
|
||||
return [str.slice(0, idx), str.slice(idx + sep.length)];
|
||||
}
|
||||
|
||||
function tagPairs(str, index) {
|
||||
var words = []; // "key", "key=value", "key='value'", etc
|
||||
var quote = null; // null, single-, or double-quote
|
||||
var cursor = index; // index of parse into str
|
||||
var wordBegin = cursor; // index of word start
|
||||
var len = str.length;
|
||||
while(cursor < len) {
|
||||
var char = str.charAt(cursor);
|
||||
var isTagEnd = !quote && (char === '/' || char === tagEnd);
|
||||
if (isTagEnd) {
|
||||
if (cursor !== wordBegin) {
|
||||
words.push(str.slice(wordBegin, cursor));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
var isWordEnd = !quote && char === ' ';
|
||||
if (isWordEnd) {
|
||||
if (cursor !== wordBegin) {
|
||||
words.push(str.slice(wordBegin, cursor));
|
||||
}
|
||||
wordBegin = cursor + 1;
|
||||
cursor++;
|
||||
continue;
|
||||
}
|
||||
|
||||
var isQuoteEnd = char === quote;
|
||||
if (isQuoteEnd) {
|
||||
quote = null;
|
||||
cursor++;
|
||||
continue;
|
||||
}
|
||||
|
||||
var isQuoteStart = !quote && (char === '\'' || char === '"');
|
||||
if (isQuoteStart) {
|
||||
quote = char;
|
||||
cursor++;
|
||||
continue;
|
||||
}
|
||||
|
||||
cursor++;
|
||||
}
|
||||
|
||||
var attrs = [];
|
||||
var wLen = words.length;
|
||||
for (var i = 0; i < wLen; i++) {
|
||||
var word = words[i];
|
||||
if (!(word && word.length)) continue;
|
||||
var isNotPair = word.indexOf('=') === -1;
|
||||
if (isNotPair) {
|
||||
var secondWord = words[i + 1];
|
||||
var thirdWord = words[i + 2];
|
||||
var isSpacedPair = secondWord === '=' && thirdWord;
|
||||
if (isSpacedPair) {
|
||||
var newWord = word + '=' + thirdWord;
|
||||
attrs.push(newWord);
|
||||
i += 2;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
attrs.push(word);
|
||||
}
|
||||
|
||||
return {
|
||||
cursor: cursor,
|
||||
kvs: attrs
|
||||
};
|
||||
}
|
||||
|
||||
function unquote(str) {
|
||||
var car = str.charAt(0);
|
||||
var end = str.length - 1;
|
||||
if (car === '"' || car === "'" && car === str.charAt(end)) {
|
||||
return str.slice(1, end);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
function parseStyle(str) {
|
||||
return str.trim().split(';').map(function(statement) {
|
||||
return statement.trim().split(':');
|
||||
}).reduce(function(styles, kv) {
|
||||
if (kv[1]) styles[camelCase(kv[0].trim())] = castValue(kv[1].trim());
|
||||
return styles;
|
||||
}, {});
|
||||
}
|
||||
|
||||
function camelCase(str) {
|
||||
return str.split('-').reduce(function(str, word) {
|
||||
return str + word.charAt(0).toUpperCase() + word.slice(1);
|
||||
});
|
||||
}
|
||||
|
||||
function castValue(str) {
|
||||
if (typeof str !== 'string') return str;
|
||||
var num = +str;
|
||||
if (!isNaN(num)) return num;
|
||||
return str;
|
||||
}
|
||||
|
||||
function startsWithCommentStart(s) {
|
||||
return (
|
||||
s.charAt(0) === '<' &&
|
||||
s.charAt(1) === '!' &&
|
||||
s.charAt(2) === '-' &&
|
||||
s.charAt(3) === '-');
|
||||
}
|
||||
|
||||
function startsWithSelfClose(s) {
|
||||
return (
|
||||
s.charAt(0) === '/' &&
|
||||
s.charAt(1) === '>');
|
||||
}
|
||||
|
||||
function startsWithDataDash(s) {
|
||||
return (
|
||||
s.charAt(0) === 'd' &&
|
||||
s.charAt(1) === 'a' &&
|
||||
s.charAt(2) === 't' &&
|
||||
s.charAt(3) === 'a' &&
|
||||
s.charAt(4) === '-');
|
||||
}
|
||||
|
||||
var himalaya = {
|
||||
parse: parse,
|
||||
parseTag: parseTag,
|
||||
parseUntil: parseUntil,
|
||||
parseAttrs: parseAttrs,
|
||||
parseStyle: parseStyle
|
||||
};
|
||||
|
||||
if (typeof exports !== 'undefined') {
|
||||
if (typeof module !== 'undefined' && module.exports) {
|
||||
exports = module.exports = himalaya;
|
||||
}
|
||||
exports.himalaya = himalaya;
|
||||
} else {
|
||||
root.himalaya = himalaya;
|
||||
}
|
||||
}).call(this);
|
File diff suppressed because one or more lines are too long
@ -0,0 +1,186 @@
|
||||
(function (global, factory) {
|
||||
if (typeof define === "function" && define.amd) {
|
||||
define(['module', 'exports'], factory);
|
||||
} else if (typeof exports !== "undefined") {
|
||||
factory(module, exports);
|
||||
} else {
|
||||
var mod = {
|
||||
exports: {}
|
||||
};
|
||||
factory(mod, mod.exports);
|
||||
global.url = mod.exports;
|
||||
}
|
||||
})(this, function (module, exports) {
|
||||
'use strict';
|
||||
|
||||
exports.__esModule = true;
|
||||
function parseQuery(str) {
|
||||
var query = {};
|
||||
if (str.length) {
|
||||
str.replace(/\+/g, ' ').split('&').forEach(function (s) {
|
||||
var pair = s.split('=');
|
||||
var key = decodeURIComponent(pair[0]);
|
||||
var val = pair.length === 1 ? '' : decodeURIComponent(pair[1]);
|
||||
if (query[key] == null) {
|
||||
query[key] = val;
|
||||
} else {
|
||||
if (query[key].constructor !== Array) query[key] = [query[key]];
|
||||
query[key].push(val);
|
||||
}
|
||||
});
|
||||
}
|
||||
return query;
|
||||
}
|
||||
|
||||
function formatQuery(obj) {
|
||||
var str = '';
|
||||
|
||||
var _loop = function _loop(p) {
|
||||
var key = encodeURIComponent(p);
|
||||
[].concat(obj[p]).forEach(function (val) {
|
||||
if (val == null) return;
|
||||
str += '&' + key;
|
||||
if (val !== '') str += '=' + encodeURIComponent(val);
|
||||
});
|
||||
};
|
||||
|
||||
for (var p in obj) {
|
||||
_loop(p);
|
||||
}
|
||||
return str.slice(1);
|
||||
}
|
||||
|
||||
function parse(str) {
|
||||
var m = /^(?:([^:/?#]+:))?(?:\/\/(?:(([^:@]*)(?::([^:@]*))?)?@)?(([^:/?#]*)(?::(\d*))?))?(((?:[^?#/]*\/)*[^?#]*)(?:(\?[^#]*))?)(?:(#.*))?/.exec(str);
|
||||
var url = {};['href', 'protocol', 'auth', 'username', 'password', 'host', 'hostname', 'port', 'path', 'pathname', 'search', 'hash'].forEach(function (key, i) {
|
||||
return url[key] = m[i] || '';
|
||||
});
|
||||
if (!url.path && !url.pathname) url.path = url.pathname = '/';
|
||||
url.query = parseQuery(url.search.slice(1));
|
||||
return url;
|
||||
}
|
||||
|
||||
function format() {
|
||||
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
||||
_ref$protocol = _ref.protocol,
|
||||
protocol = _ref$protocol === undefined ? '' : _ref$protocol,
|
||||
_ref$auth = _ref.auth,
|
||||
auth = _ref$auth === undefined ? '' : _ref$auth,
|
||||
_ref$username = _ref.username,
|
||||
username = _ref$username === undefined ? '' : _ref$username,
|
||||
_ref$password = _ref.password,
|
||||
password = _ref$password === undefined ? '' : _ref$password,
|
||||
_ref$host = _ref.host,
|
||||
host = _ref$host === undefined ? '' : _ref$host,
|
||||
_ref$hostname = _ref.hostname,
|
||||
hostname = _ref$hostname === undefined ? '' : _ref$hostname,
|
||||
_ref$port = _ref.port,
|
||||
port = _ref$port === undefined ? '' : _ref$port,
|
||||
_ref$path = _ref.path,
|
||||
path = _ref$path === undefined ? '' : _ref$path,
|
||||
_ref$pathname = _ref.pathname,
|
||||
pathname = _ref$pathname === undefined ? '' : _ref$pathname,
|
||||
_ref$search = _ref.search,
|
||||
search = _ref$search === undefined ? '' : _ref$search,
|
||||
_ref$query = _ref.query,
|
||||
query = _ref$query === undefined ? null : _ref$query,
|
||||
_ref$hash = _ref.hash,
|
||||
hash = _ref$hash === undefined ? '' : _ref$hash;
|
||||
|
||||
var str = '';
|
||||
|
||||
if (protocol) {
|
||||
str += protocol;
|
||||
if (protocol.slice(-1) !== ':') str += ':';
|
||||
}
|
||||
|
||||
if (protocol || host || hostname) str += '//';
|
||||
|
||||
if (host || hostname) {
|
||||
if (auth) {
|
||||
str += auth + '@';
|
||||
} else if (username) {
|
||||
str += username;
|
||||
if (password) str += ':' + password;
|
||||
str += '@';
|
||||
}
|
||||
|
||||
if (host) {
|
||||
str += host;
|
||||
} else {
|
||||
str += hostname;
|
||||
if (port) str += ':' + port;
|
||||
}
|
||||
}
|
||||
|
||||
if (path) {
|
||||
str += path;
|
||||
} else {
|
||||
str += pathname || '/';
|
||||
|
||||
if (search) {
|
||||
str += search;
|
||||
} else if (query) {
|
||||
var q = formatQuery(query);
|
||||
if (q) str += '?' + q;
|
||||
}
|
||||
}
|
||||
|
||||
str += hash;
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
function resolve(from, to) {
|
||||
from = parse(from);
|
||||
to = parse(to);
|
||||
|
||||
// 'to' is an absolute URL
|
||||
if (to.protocol) return to.href;
|
||||
|
||||
// 'to' only need to complete the protocol
|
||||
if (to.host) {
|
||||
to.protocol = from.protocol;
|
||||
return format(to);
|
||||
}
|
||||
|
||||
// 'to' has aboslute path
|
||||
if (to.path[0] === '/') {
|
||||
from.path = to.path;
|
||||
from.pathname = from.search = '';
|
||||
from.query = null;
|
||||
from.hash = to.hash;
|
||||
return format(from);
|
||||
}
|
||||
|
||||
if (to.pathname) {
|
||||
(function () {
|
||||
var dirFrom = from.pathname.split('/');
|
||||
// pop the filename
|
||||
dirFrom.pop();
|
||||
|
||||
to.pathname.split('/').forEach(function (d) {
|
||||
switch (d) {
|
||||
case '.':
|
||||
return;
|
||||
case '..':
|
||||
return dirFrom.length > 1 ? dirFrom.pop() : null;
|
||||
default:
|
||||
dirFrom.push(d);
|
||||
}
|
||||
});
|
||||
|
||||
from.pathname = dirFrom.join('/');
|
||||
})();
|
||||
}
|
||||
|
||||
from.path = '';
|
||||
from.search = to.search;
|
||||
from.query = null;
|
||||
from.hash = to.hash;
|
||||
return format(from);
|
||||
}
|
||||
|
||||
exports.default = { parse: parse, format: format, resolve: resolve, parseQuery: parseQuery, formatQuery: formatQuery };
|
||||
module.exports = exports['default'];
|
||||
});
|
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 44 KiB |
@ -1,66 +1,112 @@
|
||||
// pages/shouye/shouye.js
|
||||
Page({
|
||||
//index.js
|
||||
//获取应用实例
|
||||
const app = getApp()
|
||||
const api = require('../../utils/api.js');
|
||||
|
||||
/**
|
||||
* 页面的初始数据
|
||||
*/
|
||||
Page({
|
||||
data: {
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* 生命周期函数--监听页面加载
|
||||
*/
|
||||
onLoad: function (options) {
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* 生命周期函数--监听页面初次渲染完成
|
||||
*/
|
||||
onReady: function () {
|
||||
|
||||
motto: 'Hello World',
|
||||
userInfo: {},
|
||||
hasUserInfo: false,
|
||||
canIUse: wx.canIUse('button.open-type.getUserInfo'),
|
||||
imgUrls: [
|
||||
'../index/image/banner/banner1.jpg',
|
||||
'../index/image/banner/banner2.jpg',
|
||||
'../index/image/banner/banner3.jpg'
|
||||
],
|
||||
indicatorDots: true,
|
||||
autoplay: true,
|
||||
interval: 5000,
|
||||
duration: 1000,
|
||||
forumList: [],
|
||||
},
|
||||
|
||||
/**
|
||||
* 生命周期函数--监听页面显示
|
||||
*/
|
||||
onShow: function () {
|
||||
//事件处理函数
|
||||
// bindViewTap: function () {
|
||||
// wx.navigateTo({
|
||||
// url: '../logs/logs'
|
||||
// })
|
||||
//},
|
||||
onShow() {
|
||||
|
||||
},
|
||||
onLoad: function () {
|
||||
let that = this;
|
||||
wx.getStorage({
|
||||
key: 'bbsProfile',
|
||||
fail: function (res) {
|
||||
that.login();
|
||||
}
|
||||
})
|
||||
this.getForum();
|
||||
if (app.globalData.userInfo) {
|
||||
this.setData({
|
||||
userInfo: app.globalData.userInfo,
|
||||
hasUserInfo: true
|
||||
})
|
||||
} else if (this.data.canIUse) {
|
||||
// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
|
||||
// 所以此处加入 callback 以防止这种情况
|
||||
app.userInfoReadyCallback = res => {
|
||||
this.setData({
|
||||
userInfo: res.userInfo,
|
||||
hasUserInfo: true
|
||||
})
|
||||
}
|
||||
} else {
|
||||
// 在没有 open-type=getUserInfo 版本的兼容处理
|
||||
wx.getUserInfo({
|
||||
success: res => {
|
||||
app.globalData.userInfo = res.userInfo
|
||||
this.setData({
|
||||
userInfo: res.userInfo,
|
||||
hasUserInfo: true
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 生命周期函数--监听页面隐藏
|
||||
*/
|
||||
onHide: function () {
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* 生命周期函数--监听页面卸载
|
||||
*/
|
||||
onUnload: function () {
|
||||
|
||||
getUserInfo: function (e) {
|
||||
console.log(e)
|
||||
app.globalData.userInfo = e.detail.userInfo
|
||||
this.setData({
|
||||
userInfo: e.detail.userInfo,
|
||||
hasUserInfo: true
|
||||
})
|
||||
},
|
||||
|
||||
/**
|
||||
* 页面相关事件处理函数--监听用户下拉动作
|
||||
*/
|
||||
onPullDownRefresh: function () {
|
||||
|
||||
getForum() {
|
||||
let data = {
|
||||
pageNo: "0",
|
||||
pageSize: "5"
|
||||
};
|
||||
api.getForum({
|
||||
data,
|
||||
success: (res) => {
|
||||
this.setData({
|
||||
forumList: res.data.content
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
/**
|
||||
* 页面上拉触底事件的处理函数
|
||||
*/
|
||||
onReachBottom: function () {
|
||||
|
||||
login() {
|
||||
let data = {
|
||||
"username": "3f8bbbfaafda4d3e83e06b689d785e52",
|
||||
"password": "3f8bbbfaafda4d3e83e06b689d785e52"
|
||||
}
|
||||
api.login({
|
||||
data,
|
||||
success: (res) => {
|
||||
wx.setStorage({
|
||||
key: 'bbsProfile',
|
||||
data: res.data.item
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
/**
|
||||
* 用户点击右上角分享
|
||||
*/
|
||||
onShareAppMessage: function () {
|
||||
|
||||
toList(e) {
|
||||
wx.navigateTo({
|
||||
url: '../logs/logs?id=0',
|
||||
})
|
||||
}
|
||||
})
|
@ -1,3 +1,3 @@
|
||||
{
|
||||
"usingComponents": {}
|
||||
"navigationBarTitleText": "首页"
|
||||
}
|
@ -1,2 +1,55 @@
|
||||
<!--pages/shouye/shouye.wxml-->
|
||||
<text>pages/shouye/shouye.wxml</text>
|
||||
<view class="containers">
|
||||
<!--<view class="userinfo">
|
||||
<button wx:if="{{!hasUserInfo && canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button>
|
||||
<block wx:else>
|
||||
<image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" background-size="cover"></image>
|
||||
<text class="userinfo-nickname">{{userInfo.nickName}}</text>
|
||||
</block>
|
||||
</view>
|
||||
<view class="usermotto">
|
||||
<text class="user-motto">{{motto}}</text>
|
||||
</view>-->
|
||||
<view class="swiper-ai">
|
||||
<swiper indicator-dots="{{indicatorDots}}" autoplay="{{autoplay}}" interval="{{interval}}" duration="{{duration}}">
|
||||
<block wx:for="{{imgUrls}}">
|
||||
<swiper-item>
|
||||
<image src="{{item}}" class="slide-image" width="355" height="240" />
|
||||
</swiper-item>
|
||||
</block>
|
||||
</swiper>
|
||||
</view>
|
||||
<!--<view>
|
||||
<label class="weui-search-bar__label" hidden="{{inputShowed}}" bindtap="showInput">
|
||||
<icon class="weui-icon-search" type="search" size="14"></icon>
|
||||
<view class="weui-search-bar__text">搜索</view>
|
||||
</label>
|
||||
</view>-->
|
||||
<view class="weui-search-bar__form">
|
||||
<view class="weui-search-bar__box">
|
||||
<icon class="weui-icon-search_in-box" type="search" size="14"></icon>
|
||||
<form bindsubmit="formSubmit">
|
||||
<input type="text" bindconfirm="bindKeyFirm" class="weui-search-bar__input" placeholder="搜索" value="{{inputVal}}" focus="{{inputShowed}}" bindinput="inputTyping" />
|
||||
</form>
|
||||
</view>
|
||||
</view>
|
||||
<view class="weui-panel weui-panel_access" style="margin-top:0;">
|
||||
<view class="weui-panel__hd">推荐模块</view>
|
||||
<view class="weui-panel__bd">
|
||||
<navigator wx:for="{{forumList}}" url="../logs/logs?id={{item.id}}" data-id="{{item.id}}" class="weui-media-box weui-media-box_appmsg" hover-class="weui-cell_active">
|
||||
<view class="weui-media-box__hd weui-media-box__hd_in-appmsg" style="width:120px;height:80px;">
|
||||
<image class="weui-media-box__thumb" src='../index/image/banner/img{{index}}.jpeg' />
|
||||
</view>
|
||||
<view class="weui-media-box__bd weui-media-box__bd_in-appmsg">
|
||||
<view class="weui-media-box__title">{{item.forum_name}}</view>
|
||||
<view class="weui-media-box__desc">{{item.forum_description}}</view>
|
||||
</view>
|
||||
</navigator>
|
||||
</view>
|
||||
<view class="weui-panel__ft">
|
||||
<view class="weui-cell weui-cell_access weui-cell_link">
|
||||
<view class="weui-cell__bd" bindtap="toList">查看更多</view>
|
||||
<view class="weui-cell__ft weui-cell__ft_in-access"></view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
@ -1 +1,26 @@
|
||||
/* pages/shouye/shouye.wxss */
|
||||
/**index.wxss**/
|
||||
.userinfo {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.userinfo-avatar {
|
||||
width: 128rpx;
|
||||
height: 128rpx;
|
||||
margin: 20rpx;
|
||||
border-radius: 50%;
|
||||
}
|
||||
.swiper-ai image{
|
||||
width: 100%;
|
||||
}
|
||||
.swiper-ai swiper{
|
||||
height:240px;
|
||||
}
|
||||
.userinfo-nickname {
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
.usermotto {
|
||||
margin-top: 200px;
|
||||
}
|
@ -0,0 +1,62 @@
|
||||
const apiURL = 'http://47.104.244.32:8100';
|
||||
let headerData= {
|
||||
|
||||
}
|
||||
headerData['Content-Type']= 'application/json';
|
||||
let userData ={};
|
||||
wx.getStorage({
|
||||
key: 'bbsProfile',
|
||||
success: function(res) {
|
||||
userData = res.data;
|
||||
if(userData.token){
|
||||
headerData['Authorization']=userData.token;
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
const wxRequest = (params, url) => {
|
||||
wx.request({
|
||||
url,
|
||||
method: params.method || 'POST',
|
||||
data: params.data || {},
|
||||
header:headerData, /*{
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
},*/
|
||||
success(res) {
|
||||
if (params.success) {
|
||||
params.success(res);
|
||||
}
|
||||
},
|
||||
fail(res) {
|
||||
if (params.fail) {
|
||||
params.fail(res);
|
||||
}
|
||||
},
|
||||
complete(res) {
|
||||
if (params.complete) {
|
||||
params.complete(res);
|
||||
}
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
const getForum = (params) => {
|
||||
wxRequest(params, `${apiURL}/forumManagement/getForum`);
|
||||
};
|
||||
const getQuestion = (params) => {
|
||||
wxRequest(params, `${apiURL}/question/getQuestion`);
|
||||
};
|
||||
const login = (params) => {
|
||||
wxRequest(params, `${apiURL}/session`);
|
||||
};
|
||||
const newAdmin = (params) => {
|
||||
wxRequest(params, `${apiURL}/user/newAdmin`);
|
||||
};
|
||||
module.exports = {
|
||||
getForum,
|
||||
getQuestion,
|
||||
login,
|
||||
newAdmin
|
||||
};
|
File diff suppressed because one or more lines are too long
Loading…
Reference in new issue