From 55f2322ab003cada202e84dd8de9c19dedc6b751 Mon Sep 17 00:00:00 2001 From: chenbo Date: Sat, 30 Nov 2019 20:01:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8B=86=E5=8D=95=E5=B0=8F=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE | 3 +- wx-mini-program/app.js | 31 + wx-mini-program/app.json | 99 + wx-mini-program/app.wxss | 83 + wx-mini-program/config/api.js | 104 + wx-mini-program/lib/coupon-window/index.js | 48 + wx-mini-program/lib/coupon-window/index.json | 3 + wx-mini-program/lib/coupon-window/index.wxml | 17 + wx-mini-program/lib/coupon-window/index.wxss | 14 + wx-mini-program/lib/home/index.js | 77 + wx-mini-program/lib/home/index.json | 4 + wx-mini-program/lib/home/index.wxml | 9 + wx-mini-program/lib/home/index.wxss | 7 + .../lib/share-red-packets/index.js | 27 + .../lib/share-red-packets/index.json | 4 + .../lib/share-red-packets/index.wxml | 13 + .../lib/share-red-packets/index.wxss | 12 + wx-mini-program/lib/wxParse/html2json.js | 242 ++ wx-mini-program/lib/wxParse/htmlparser.js | 182 + wx-mini-program/lib/wxParse/showdown.js | 2529 ++++++++++++ wx-mini-program/lib/wxParse/wxDiscode.js | 206 + wx-mini-program/lib/wxParse/wxParse.js | 146 + wx-mini-program/lib/wxParse/wxParse.wxml | 928 +++++ wx-mini-program/lib/wxParse/wxParse.wxss | 202 + .../lib/zanui-weapp/capsule/index.js | 31 + .../lib/zanui-weapp/capsule/index.json | 3 + .../lib/zanui-weapp/capsule/index.wxml | 10 + .../lib/zanui-weapp/capsule/index.wxss | 42 + wx-mini-program/pages/about/about.js | 49 + wx-mini-program/pages/about/about.json | 4 + wx-mini-program/pages/about/about.wxml | 55 + wx-mini-program/pages/about/about.wxss | 44 + wx-mini-program/pages/article/article.js | 95 + wx-mini-program/pages/article/article.json | 7 + wx-mini-program/pages/article/article.wxml | 14 + wx-mini-program/pages/article/article.wxss | 9 + .../pages/auth/accountLogin/accountLogin.js | 117 + .../pages/auth/accountLogin/accountLogin.json | 4 + .../pages/auth/accountLogin/accountLogin.wxml | 29 + .../pages/auth/accountLogin/accountLogin.wxss | 103 + wx-mini-program/pages/auth/login/login.js | 52 + wx-mini-program/pages/auth/login/login.json | 4 + wx-mini-program/pages/auth/login/login.wxml | 6 + wx-mini-program/pages/auth/login/login.wxss | 61 + .../pages/auth/register/register.js | 230 ++ .../pages/auth/register/register.json | 4 + .../pages/auth/register/register.wxml | 35 + .../pages/auth/register/register.wxss | 69 + wx-mini-program/pages/auth/reset/reset.js | 172 + wx-mini-program/pages/auth/reset/reset.json | 4 + wx-mini-program/pages/auth/reset/reset.wxml | 30 + wx-mini-program/pages/auth/reset/reset.wxss | 68 + wx-mini-program/pages/brand/brand.js | 59 + wx-mini-program/pages/brand/brand.json | 4 + wx-mini-program/pages/brand/brand.wxml | 16 + wx-mini-program/pages/brand/brand.wxss | 52 + .../pages/brandDetail/brandDetail.js | 69 + .../pages/brandDetail/brandDetail.json | 4 + .../pages/brandDetail/brandDetail.wxml | 28 + .../pages/brandDetail/brandDetail.wxss | 111 + wx-mini-program/pages/brokerage/main/main.js | 126 + .../pages/brokerage/main/main.json | 4 + .../pages/brokerage/main/main.wxml | 82 + .../pages/brokerage/main/main.wxss | 294 ++ .../pages/brokerage/order/order.js | 79 + .../pages/brokerage/order/order.json | 4 + .../pages/brokerage/order/order.wxml | 46 + .../pages/brokerage/order/order.wxss | 181 + .../pages/brokerage/record/record.js | 44 + .../pages/brokerage/record/record.json | 4 + .../pages/brokerage/record/record.wxml | 24 + .../pages/brokerage/record/record.wxss | 139 + .../pages/brokerage/withdrawal/withdrawal.js | 124 + .../brokerage/withdrawal/withdrawal.json | 4 + .../brokerage/withdrawal/withdrawal.wxml | 22 + .../brokerage/withdrawal/withdrawal.wxss | 68 + wx-mini-program/pages/cart/cart.js | 530 +++ wx-mini-program/pages/cart/cart.json | 4 + wx-mini-program/pages/cart/cart.wxml | 92 + wx-mini-program/pages/cart/cart.wxss | 560 +++ wx-mini-program/pages/catalog/catalog.js | 77 + wx-mini-program/pages/catalog/catalog.json | 3 + wx-mini-program/pages/catalog/catalog.wxml | 30 + wx-mini-program/pages/catalog/catalog.wxss | 163 + wx-mini-program/pages/category/category.js | 132 + wx-mini-program/pages/category/category.json | 1 + wx-mini-program/pages/category/category.wxml | 25 + wx-mini-program/pages/category/category.wxss | 114 + wx-mini-program/pages/checkout/checkout.js | 216 + wx-mini-program/pages/checkout/checkout.json | 3 + wx-mini-program/pages/checkout/checkout.wxml | 139 + wx-mini-program/pages/checkout/checkout.wxss | 372 ++ wx-mini-program/pages/comment/comment.js | 127 + wx-mini-program/pages/comment/comment.json | 4 + wx-mini-program/pages/comment/comment.wxml | 30 + wx-mini-program/pages/comment/comment.wxss | 155 + .../pages/commentPost/commentPost.js | 177 + .../pages/commentPost/commentPost.json | 4 + .../pages/commentPost/commentPost.wxml | 55 + .../pages/commentPost/commentPost.wxss | 246 ++ wx-mini-program/pages/coupon/coupon.js | 149 + wx-mini-program/pages/coupon/coupon.json | 4 + wx-mini-program/pages/coupon/coupon.wxml | 26 + wx-mini-program/pages/coupon/coupon.wxss | 171 + wx-mini-program/pages/goods/goods.js | 719 ++++ wx-mini-program/pages/goods/goods.json | 4 + wx-mini-program/pages/goods/goods.wxml | 196 + wx-mini-program/pages/goods/goods.wxss | 938 +++++ .../groupon/grouponDetail/grouponDetail.js | 289 ++ .../groupon/grouponDetail/grouponDetail.json | 4 + .../groupon/grouponDetail/grouponDetail.wxml | 75 + .../groupon/grouponDetail/grouponDetail.wxss | 402 ++ .../pages/groupon/grouponList/grouponList.js | 132 + .../groupon/grouponList/grouponList.json | 7 + .../groupon/grouponList/grouponList.wxml | 30 + .../groupon/grouponList/grouponList.wxss | 110 + .../pages/groupon/myGroupon/myGroupon.js | 52 + .../pages/groupon/myGroupon/myGroupon.json | 7 + .../pages/groupon/myGroupon/myGroupon.wxml | 52 + .../pages/groupon/myGroupon/myGroupon.wxss | 222 ++ wx-mini-program/pages/hotGoods/hotGoods.js | 132 + wx-mini-program/pages/hotGoods/hotGoods.json | 4 + wx-mini-program/pages/hotGoods/hotGoods.wxml | 40 + wx-mini-program/pages/hotGoods/hotGoods.wxss | 177 + wx-mini-program/pages/index/index.js | 195 + wx-mini-program/pages/index/index.json | 8 + wx-mini-program/pages/index/index.wxml | 197 + wx-mini-program/pages/index/index.wxss | 592 +++ wx-mini-program/pages/logs/logs.js | 15 + wx-mini-program/pages/logs/logs.json | 5 + wx-mini-program/pages/logs/logs.wxml | 6 + wx-mini-program/pages/logs/logs.wxss | 8 + wx-mini-program/pages/newGoods/newGoods.js | 118 + wx-mini-program/pages/newGoods/newGoods.json | 4 + wx-mini-program/pages/newGoods/newGoods.wxml | 40 + wx-mini-program/pages/newGoods/newGoods.wxss | 177 + wx-mini-program/pages/payResult/payResult.js | 97 + .../pages/payResult/payResult.json | 5 + .../pages/payResult/payResult.wxml | 24 + .../pages/payResult/payResult.wxss | 59 + wx-mini-program/pages/search/search.js | 195 + wx-mini-program/pages/search/search.json | 4 + wx-mini-program/pages/search/search.wxml | 65 + wx-mini-program/pages/search/search.wxss | 335 ++ wx-mini-program/pages/topic/topic.js | 86 + wx-mini-program/pages/topic/topic.json | 4 + wx-mini-program/pages/topic/topic.wxml | 16 + wx-mini-program/pages/topic/topic.wxss | 94 + .../pages/topicComment/topicComment.js | 119 + .../pages/topicComment/topicComment.json | 4 + .../pages/topicComment/topicComment.wxml | 18 + .../pages/topicComment/topicComment.wxss | 107 + .../topicCommentPost/topicCommentPost.js | 177 + .../topicCommentPost/topicCommentPost.json | 4 + .../topicCommentPost/topicCommentPost.wxml | 51 + .../topicCommentPost/topicCommentPost.wxss | 246 ++ .../pages/topicDetail/topicDetail.js | 88 + .../pages/topicDetail/topicDetail.json | 4 + .../pages/topicDetail/topicDetail.wxml | 70 + .../pages/topicDetail/topicDetail.wxss | 270 ++ .../pages/ucenter/address/address.js | 91 + .../pages/ucenter/address/address.json | 4 + .../pages/ucenter/address/address.wxml | 22 + .../pages/ucenter/address/address.wxss | 112 + .../pages/ucenter/addressAdd/addressAdd.js | 372 ++ .../pages/ucenter/addressAdd/addressAdd.json | 4 + .../pages/ucenter/addressAdd/addressAdd.wxml | 39 + .../pages/ucenter/addressAdd/addressAdd.wxss | 174 + .../pages/ucenter/collect/collect.js | 122 + .../pages/ucenter/collect/collect.json | 4 + .../pages/ucenter/collect/collect.wxml | 19 + .../pages/ucenter/collect/collect.wxss | 102 + .../pages/ucenter/couponList/couponList.js | 170 + .../pages/ucenter/couponList/couponList.json | 4 + .../pages/ucenter/couponList/couponList.wxml | 39 + .../pages/ucenter/couponList/couponList.wxss | 204 + .../ucenter/couponSelect/couponSelect.js | 147 + .../ucenter/couponSelect/couponSelect.json | 4 + .../ucenter/couponSelect/couponSelect.wxml | 25 + .../ucenter/couponSelect/couponSelect.wxss | 128 + .../pages/ucenter/expressInfo/expressInfo.js | 98 + .../ucenter/expressInfo/expressInfo.json | 4 + .../ucenter/expressInfo/expressInfo.wxml | 85 + .../ucenter/expressInfo/expressInfo.wxss | 201 + .../pages/ucenter/feedback/feedback.js | 184 + .../pages/ucenter/feedback/feedback.json | 4 + .../pages/ucenter/feedback/feedback.wxml | 35 + .../pages/ucenter/feedback/feedback.wxss | 170 + .../pages/ucenter/footprint/footprint.js | 134 + .../pages/ucenter/footprint/footprint.json | 4 + .../pages/ucenter/footprint/footprint.wxml | 23 + .../pages/ucenter/footprint/footprint.wxss | 126 + wx-mini-program/pages/ucenter/index/index.js | 159 + .../pages/ucenter/index/index.json | 5 + .../pages/ucenter/index/index.wxml | 84 + .../pages/ucenter/index/index.wxss | 44 + wx-mini-program/pages/ucenter/main/index.js | 232 ++ wx-mini-program/pages/ucenter/main/index.json | 5 + wx-mini-program/pages/ucenter/main/index.wxml | 105 + wx-mini-program/pages/ucenter/main/index.wxss | 184 + wx-mini-program/pages/ucenter/order/order.js | 223 ++ .../pages/ucenter/order/order.json | 4 + .../pages/ucenter/order/order.wxml | 69 + .../pages/ucenter/order/order.wxss | 232 ++ .../pages/ucenter/orderDetail/orderDetail.js | 203 + .../ucenter/orderDetail/orderDetail.json | 4 + .../ucenter/orderDetail/orderDetail.wxml | 71 + .../ucenter/orderDetail/orderDetail.wxss | 337 ++ wx-mini-program/pages/ucenter/user/user.js | 85 + wx-mini-program/pages/ucenter/user/user.json | 4 + wx-mini-program/pages/ucenter/user/user.wxml | 33 + wx-mini-program/pages/ucenter/user/user.wxss | 9 + wx-mini-program/project.config.json | 276 ++ wx-mini-program/sitemap.json | 7 + wx-mini-program/static/css/animate.wxss | 3494 +++++++++++++++++ wx-mini-program/static/css/guildford.wxss | 16 + wx-mini-program/static/css/style.wxss | 121 + wx-mini-program/static/font/iconfont.wxss | 463 +++ wx-mini-program/static/images/about.png | Bin 0 -> 1006 bytes wx-mini-program/static/images/about_us.png | Bin 0 -> 2501 bytes .../static/images/address-bg-bd.png | Bin 0 -> 183 bytes wx-mini-program/static/images/address.png | Bin 0 -> 2615 bytes .../static/images/address_right.png | Bin 0 -> 283 bytes wx-mini-program/static/images/avatar.png | Bin 0 -> 510 bytes wx-mini-program/static/images/cart.png | Bin 0 -> 2193 bytes .../static/images/cart@selected.png | Bin 0 -> 1973 bytes wx-mini-program/static/images/category.png | Bin 0 -> 1533 bytes .../static/images/category@selected.png | Bin 0 -> 1446 bytes .../static/images/channel_category.png | Bin 0 -> 2222 bytes wx-mini-program/static/images/checkbox.png | Bin 0 -> 1421 bytes wx-mini-program/static/images/clear_input.png | Bin 0 -> 259 bytes wx-mini-program/static/images/close.gif | Bin 0 -> 18292 bytes wx-mini-program/static/images/comment.png | Bin 0 -> 2476 bytes wx-mini-program/static/images/complete.png | Bin 0 -> 20655 bytes wx-mini-program/static/images/coupon.png | Bin 0 -> 1575 bytes wx-mini-program/static/images/customer.png | Bin 0 -> 2782 bytes wx-mini-program/static/images/del-address.png | Bin 0 -> 1102 bytes wx-mini-program/static/images/detail_back.png | Bin 0 -> 195 bytes wx-mini-program/static/images/dfh.png | Bin 0 -> 1775 bytes wx-mini-program/static/images/dfk.png | Bin 0 -> 1942 bytes wx-mini-program/static/images/down.png | Bin 0 -> 2618 bytes wx-mini-program/static/images/dpj.png | Bin 0 -> 2309 bytes wx-mini-program/static/images/dsh.png | Bin 0 -> 1854 bytes .../static/images/edit-address.png | Bin 0 -> 287 bytes wx-mini-program/static/images/feedback.png | Bin 0 -> 2339 bytes wx-mini-program/static/images/footprint.png | Bin 0 -> 2475 bytes wx-mini-program/static/images/friend.png | Bin 0 -> 17192 bytes wx-mini-program/static/images/go.png | Bin 0 -> 254 bytes wx-mini-program/static/images/group.png | Bin 0 -> 2573 bytes wx-mini-program/static/images/home.png | Bin 0 -> 1942 bytes .../static/images/home@selected.png | Bin 0 -> 1724 bytes .../static/images/ic_menu_shoping_nor.png | Bin 0 -> 1394 bytes .../static/images/ic_menu_topic_nor.png | Bin 0 -> 388 bytes .../static/images/ic_menu_topic_pressed.png | Bin 0 -> 388 bytes wx-mini-program/static/images/ico-addr.png | Bin 0 -> 11675 bytes wx-mini-program/static/images/icon_close.png | Bin 0 -> 219 bytes .../static/images/icon_collect.png | Bin 0 -> 2395 bytes .../static/images/icon_collect_checked.png | Bin 0 -> 9904 bytes wx-mini-program/static/images/icon_error.png | Bin 0 -> 1259 bytes .../static/images/icon_go_more.png | Bin 0 -> 736 bytes wx-mini-program/static/images/icon_like.png | Bin 0 -> 4467 bytes .../static/images/icon_like_checked.png | Bin 0 -> 3592 bytes wx-mini-program/static/images/kefu.png | Bin 0 -> 8648 bytes wx-mini-program/static/images/mobile.png | Bin 0 -> 3916 bytes wx-mini-program/static/images/my.png | Bin 0 -> 2466 bytes wx-mini-program/static/images/my@selected.png | Bin 0 -> 1972 bytes wx-mini-program/static/images/news.png | Bin 0 -> 2361 bytes wx-mini-program/static/images/noAddress.png | Bin 0 -> 6925 bytes wx-mini-program/static/images/noCart.png | Bin 0 -> 27506 bytes wx-mini-program/static/images/noCart_old.png | Bin 0 -> 4210 bytes wx-mini-program/static/images/open.gif | Bin 0 -> 23525 bytes wx-mini-program/static/images/selnum.png | Bin 0 -> 1637 bytes wx-mini-program/static/images/sh.png | Bin 0 -> 2112 bytes wx-mini-program/static/images/share.png | Bin 0 -> 10791 bytes wx-mini-program/static/images/telephone.png | Bin 0 -> 13668 bytes .../static/images/title_search.png | Bin 0 -> 378 bytes wx-mini-program/static/images/wechat.png | Bin 0 -> 13346 bytes wx-mini-program/static/images/wxpay.png | Bin 0 -> 1791 bytes wx-mini-program/utils/check.js | 12 + wx-mini-program/utils/user.js | 98 + wx-mini-program/utils/util.js | 119 + 281 files changed, 28188 insertions(+), 1 deletion(-) create mode 100644 wx-mini-program/app.js create mode 100644 wx-mini-program/app.json create mode 100644 wx-mini-program/app.wxss create mode 100644 wx-mini-program/config/api.js create mode 100644 wx-mini-program/lib/coupon-window/index.js create mode 100644 wx-mini-program/lib/coupon-window/index.json create mode 100644 wx-mini-program/lib/coupon-window/index.wxml create mode 100644 wx-mini-program/lib/coupon-window/index.wxss create mode 100644 wx-mini-program/lib/home/index.js create mode 100644 wx-mini-program/lib/home/index.json create mode 100644 wx-mini-program/lib/home/index.wxml create mode 100644 wx-mini-program/lib/home/index.wxss create mode 100644 wx-mini-program/lib/share-red-packets/index.js create mode 100644 wx-mini-program/lib/share-red-packets/index.json create mode 100644 wx-mini-program/lib/share-red-packets/index.wxml create mode 100644 wx-mini-program/lib/share-red-packets/index.wxss create mode 100644 wx-mini-program/lib/wxParse/html2json.js create mode 100644 wx-mini-program/lib/wxParse/htmlparser.js create mode 100644 wx-mini-program/lib/wxParse/showdown.js create mode 100644 wx-mini-program/lib/wxParse/wxDiscode.js create mode 100644 wx-mini-program/lib/wxParse/wxParse.js create mode 100644 wx-mini-program/lib/wxParse/wxParse.wxml create mode 100644 wx-mini-program/lib/wxParse/wxParse.wxss create mode 100644 wx-mini-program/lib/zanui-weapp/capsule/index.js create mode 100644 wx-mini-program/lib/zanui-weapp/capsule/index.json create mode 100644 wx-mini-program/lib/zanui-weapp/capsule/index.wxml create mode 100644 wx-mini-program/lib/zanui-weapp/capsule/index.wxss create mode 100644 wx-mini-program/pages/about/about.js create mode 100644 wx-mini-program/pages/about/about.json create mode 100644 wx-mini-program/pages/about/about.wxml create mode 100644 wx-mini-program/pages/about/about.wxss create mode 100644 wx-mini-program/pages/article/article.js create mode 100644 wx-mini-program/pages/article/article.json create mode 100644 wx-mini-program/pages/article/article.wxml create mode 100644 wx-mini-program/pages/article/article.wxss create mode 100644 wx-mini-program/pages/auth/accountLogin/accountLogin.js create mode 100644 wx-mini-program/pages/auth/accountLogin/accountLogin.json create mode 100644 wx-mini-program/pages/auth/accountLogin/accountLogin.wxml create mode 100644 wx-mini-program/pages/auth/accountLogin/accountLogin.wxss create mode 100644 wx-mini-program/pages/auth/login/login.js create mode 100644 wx-mini-program/pages/auth/login/login.json create mode 100644 wx-mini-program/pages/auth/login/login.wxml create mode 100644 wx-mini-program/pages/auth/login/login.wxss create mode 100644 wx-mini-program/pages/auth/register/register.js create mode 100644 wx-mini-program/pages/auth/register/register.json create mode 100644 wx-mini-program/pages/auth/register/register.wxml create mode 100644 wx-mini-program/pages/auth/register/register.wxss create mode 100644 wx-mini-program/pages/auth/reset/reset.js create mode 100644 wx-mini-program/pages/auth/reset/reset.json create mode 100644 wx-mini-program/pages/auth/reset/reset.wxml create mode 100644 wx-mini-program/pages/auth/reset/reset.wxss create mode 100644 wx-mini-program/pages/brand/brand.js create mode 100644 wx-mini-program/pages/brand/brand.json create mode 100644 wx-mini-program/pages/brand/brand.wxml create mode 100644 wx-mini-program/pages/brand/brand.wxss create mode 100644 wx-mini-program/pages/brandDetail/brandDetail.js create mode 100644 wx-mini-program/pages/brandDetail/brandDetail.json create mode 100644 wx-mini-program/pages/brandDetail/brandDetail.wxml create mode 100644 wx-mini-program/pages/brandDetail/brandDetail.wxss create mode 100644 wx-mini-program/pages/brokerage/main/main.js create mode 100644 wx-mini-program/pages/brokerage/main/main.json create mode 100644 wx-mini-program/pages/brokerage/main/main.wxml create mode 100644 wx-mini-program/pages/brokerage/main/main.wxss create mode 100644 wx-mini-program/pages/brokerage/order/order.js create mode 100644 wx-mini-program/pages/brokerage/order/order.json create mode 100644 wx-mini-program/pages/brokerage/order/order.wxml create mode 100644 wx-mini-program/pages/brokerage/order/order.wxss create mode 100644 wx-mini-program/pages/brokerage/record/record.js create mode 100644 wx-mini-program/pages/brokerage/record/record.json create mode 100644 wx-mini-program/pages/brokerage/record/record.wxml create mode 100644 wx-mini-program/pages/brokerage/record/record.wxss create mode 100644 wx-mini-program/pages/brokerage/withdrawal/withdrawal.js create mode 100644 wx-mini-program/pages/brokerage/withdrawal/withdrawal.json create mode 100644 wx-mini-program/pages/brokerage/withdrawal/withdrawal.wxml create mode 100644 wx-mini-program/pages/brokerage/withdrawal/withdrawal.wxss create mode 100644 wx-mini-program/pages/cart/cart.js create mode 100644 wx-mini-program/pages/cart/cart.json create mode 100644 wx-mini-program/pages/cart/cart.wxml create mode 100644 wx-mini-program/pages/cart/cart.wxss create mode 100644 wx-mini-program/pages/catalog/catalog.js create mode 100644 wx-mini-program/pages/catalog/catalog.json create mode 100644 wx-mini-program/pages/catalog/catalog.wxml create mode 100644 wx-mini-program/pages/catalog/catalog.wxss create mode 100644 wx-mini-program/pages/category/category.js create mode 100644 wx-mini-program/pages/category/category.json create mode 100644 wx-mini-program/pages/category/category.wxml create mode 100644 wx-mini-program/pages/category/category.wxss create mode 100644 wx-mini-program/pages/checkout/checkout.js create mode 100644 wx-mini-program/pages/checkout/checkout.json create mode 100644 wx-mini-program/pages/checkout/checkout.wxml create mode 100644 wx-mini-program/pages/checkout/checkout.wxss create mode 100644 wx-mini-program/pages/comment/comment.js create mode 100644 wx-mini-program/pages/comment/comment.json create mode 100644 wx-mini-program/pages/comment/comment.wxml create mode 100644 wx-mini-program/pages/comment/comment.wxss create mode 100644 wx-mini-program/pages/commentPost/commentPost.js create mode 100644 wx-mini-program/pages/commentPost/commentPost.json create mode 100644 wx-mini-program/pages/commentPost/commentPost.wxml create mode 100644 wx-mini-program/pages/commentPost/commentPost.wxss create mode 100644 wx-mini-program/pages/coupon/coupon.js create mode 100644 wx-mini-program/pages/coupon/coupon.json create mode 100644 wx-mini-program/pages/coupon/coupon.wxml create mode 100644 wx-mini-program/pages/coupon/coupon.wxss create mode 100644 wx-mini-program/pages/goods/goods.js create mode 100644 wx-mini-program/pages/goods/goods.json create mode 100644 wx-mini-program/pages/goods/goods.wxml create mode 100644 wx-mini-program/pages/goods/goods.wxss create mode 100644 wx-mini-program/pages/groupon/grouponDetail/grouponDetail.js create mode 100644 wx-mini-program/pages/groupon/grouponDetail/grouponDetail.json create mode 100644 wx-mini-program/pages/groupon/grouponDetail/grouponDetail.wxml create mode 100644 wx-mini-program/pages/groupon/grouponDetail/grouponDetail.wxss create mode 100644 wx-mini-program/pages/groupon/grouponList/grouponList.js create mode 100644 wx-mini-program/pages/groupon/grouponList/grouponList.json create mode 100644 wx-mini-program/pages/groupon/grouponList/grouponList.wxml create mode 100644 wx-mini-program/pages/groupon/grouponList/grouponList.wxss create mode 100644 wx-mini-program/pages/groupon/myGroupon/myGroupon.js create mode 100644 wx-mini-program/pages/groupon/myGroupon/myGroupon.json create mode 100644 wx-mini-program/pages/groupon/myGroupon/myGroupon.wxml create mode 100644 wx-mini-program/pages/groupon/myGroupon/myGroupon.wxss create mode 100644 wx-mini-program/pages/hotGoods/hotGoods.js create mode 100644 wx-mini-program/pages/hotGoods/hotGoods.json create mode 100644 wx-mini-program/pages/hotGoods/hotGoods.wxml create mode 100644 wx-mini-program/pages/hotGoods/hotGoods.wxss create mode 100644 wx-mini-program/pages/index/index.js create mode 100644 wx-mini-program/pages/index/index.json create mode 100644 wx-mini-program/pages/index/index.wxml create mode 100644 wx-mini-program/pages/index/index.wxss create mode 100644 wx-mini-program/pages/logs/logs.js create mode 100644 wx-mini-program/pages/logs/logs.json create mode 100644 wx-mini-program/pages/logs/logs.wxml create mode 100644 wx-mini-program/pages/logs/logs.wxss create mode 100644 wx-mini-program/pages/newGoods/newGoods.js create mode 100644 wx-mini-program/pages/newGoods/newGoods.json create mode 100644 wx-mini-program/pages/newGoods/newGoods.wxml create mode 100644 wx-mini-program/pages/newGoods/newGoods.wxss create mode 100644 wx-mini-program/pages/payResult/payResult.js create mode 100644 wx-mini-program/pages/payResult/payResult.json create mode 100644 wx-mini-program/pages/payResult/payResult.wxml create mode 100644 wx-mini-program/pages/payResult/payResult.wxss create mode 100644 wx-mini-program/pages/search/search.js create mode 100644 wx-mini-program/pages/search/search.json create mode 100644 wx-mini-program/pages/search/search.wxml create mode 100644 wx-mini-program/pages/search/search.wxss create mode 100644 wx-mini-program/pages/topic/topic.js create mode 100644 wx-mini-program/pages/topic/topic.json create mode 100644 wx-mini-program/pages/topic/topic.wxml create mode 100644 wx-mini-program/pages/topic/topic.wxss create mode 100644 wx-mini-program/pages/topicComment/topicComment.js create mode 100644 wx-mini-program/pages/topicComment/topicComment.json create mode 100644 wx-mini-program/pages/topicComment/topicComment.wxml create mode 100644 wx-mini-program/pages/topicComment/topicComment.wxss create mode 100644 wx-mini-program/pages/topicCommentPost/topicCommentPost.js create mode 100644 wx-mini-program/pages/topicCommentPost/topicCommentPost.json create mode 100644 wx-mini-program/pages/topicCommentPost/topicCommentPost.wxml create mode 100644 wx-mini-program/pages/topicCommentPost/topicCommentPost.wxss create mode 100644 wx-mini-program/pages/topicDetail/topicDetail.js create mode 100644 wx-mini-program/pages/topicDetail/topicDetail.json create mode 100644 wx-mini-program/pages/topicDetail/topicDetail.wxml create mode 100644 wx-mini-program/pages/topicDetail/topicDetail.wxss create mode 100644 wx-mini-program/pages/ucenter/address/address.js create mode 100644 wx-mini-program/pages/ucenter/address/address.json create mode 100644 wx-mini-program/pages/ucenter/address/address.wxml create mode 100644 wx-mini-program/pages/ucenter/address/address.wxss create mode 100644 wx-mini-program/pages/ucenter/addressAdd/addressAdd.js create mode 100644 wx-mini-program/pages/ucenter/addressAdd/addressAdd.json create mode 100644 wx-mini-program/pages/ucenter/addressAdd/addressAdd.wxml create mode 100644 wx-mini-program/pages/ucenter/addressAdd/addressAdd.wxss create mode 100644 wx-mini-program/pages/ucenter/collect/collect.js create mode 100644 wx-mini-program/pages/ucenter/collect/collect.json create mode 100644 wx-mini-program/pages/ucenter/collect/collect.wxml create mode 100644 wx-mini-program/pages/ucenter/collect/collect.wxss create mode 100644 wx-mini-program/pages/ucenter/couponList/couponList.js create mode 100644 wx-mini-program/pages/ucenter/couponList/couponList.json create mode 100644 wx-mini-program/pages/ucenter/couponList/couponList.wxml create mode 100644 wx-mini-program/pages/ucenter/couponList/couponList.wxss create mode 100644 wx-mini-program/pages/ucenter/couponSelect/couponSelect.js create mode 100644 wx-mini-program/pages/ucenter/couponSelect/couponSelect.json create mode 100644 wx-mini-program/pages/ucenter/couponSelect/couponSelect.wxml create mode 100644 wx-mini-program/pages/ucenter/couponSelect/couponSelect.wxss create mode 100644 wx-mini-program/pages/ucenter/expressInfo/expressInfo.js create mode 100644 wx-mini-program/pages/ucenter/expressInfo/expressInfo.json create mode 100644 wx-mini-program/pages/ucenter/expressInfo/expressInfo.wxml create mode 100644 wx-mini-program/pages/ucenter/expressInfo/expressInfo.wxss create mode 100644 wx-mini-program/pages/ucenter/feedback/feedback.js create mode 100644 wx-mini-program/pages/ucenter/feedback/feedback.json create mode 100644 wx-mini-program/pages/ucenter/feedback/feedback.wxml create mode 100644 wx-mini-program/pages/ucenter/feedback/feedback.wxss create mode 100644 wx-mini-program/pages/ucenter/footprint/footprint.js create mode 100644 wx-mini-program/pages/ucenter/footprint/footprint.json create mode 100644 wx-mini-program/pages/ucenter/footprint/footprint.wxml create mode 100644 wx-mini-program/pages/ucenter/footprint/footprint.wxss create mode 100644 wx-mini-program/pages/ucenter/index/index.js create mode 100644 wx-mini-program/pages/ucenter/index/index.json create mode 100644 wx-mini-program/pages/ucenter/index/index.wxml create mode 100644 wx-mini-program/pages/ucenter/index/index.wxss create mode 100644 wx-mini-program/pages/ucenter/main/index.js create mode 100644 wx-mini-program/pages/ucenter/main/index.json create mode 100644 wx-mini-program/pages/ucenter/main/index.wxml create mode 100644 wx-mini-program/pages/ucenter/main/index.wxss create mode 100644 wx-mini-program/pages/ucenter/order/order.js create mode 100644 wx-mini-program/pages/ucenter/order/order.json create mode 100644 wx-mini-program/pages/ucenter/order/order.wxml create mode 100644 wx-mini-program/pages/ucenter/order/order.wxss create mode 100644 wx-mini-program/pages/ucenter/orderDetail/orderDetail.js create mode 100644 wx-mini-program/pages/ucenter/orderDetail/orderDetail.json create mode 100644 wx-mini-program/pages/ucenter/orderDetail/orderDetail.wxml create mode 100644 wx-mini-program/pages/ucenter/orderDetail/orderDetail.wxss create mode 100644 wx-mini-program/pages/ucenter/user/user.js create mode 100644 wx-mini-program/pages/ucenter/user/user.json create mode 100644 wx-mini-program/pages/ucenter/user/user.wxml create mode 100644 wx-mini-program/pages/ucenter/user/user.wxss create mode 100644 wx-mini-program/project.config.json create mode 100644 wx-mini-program/sitemap.json create mode 100644 wx-mini-program/static/css/animate.wxss create mode 100644 wx-mini-program/static/css/guildford.wxss create mode 100644 wx-mini-program/static/css/style.wxss create mode 100644 wx-mini-program/static/font/iconfont.wxss create mode 100644 wx-mini-program/static/images/about.png create mode 100644 wx-mini-program/static/images/about_us.png create mode 100644 wx-mini-program/static/images/address-bg-bd.png create mode 100644 wx-mini-program/static/images/address.png create mode 100644 wx-mini-program/static/images/address_right.png create mode 100644 wx-mini-program/static/images/avatar.png create mode 100644 wx-mini-program/static/images/cart.png create mode 100644 wx-mini-program/static/images/cart@selected.png create mode 100644 wx-mini-program/static/images/category.png create mode 100644 wx-mini-program/static/images/category@selected.png create mode 100644 wx-mini-program/static/images/channel_category.png create mode 100644 wx-mini-program/static/images/checkbox.png create mode 100644 wx-mini-program/static/images/clear_input.png create mode 100644 wx-mini-program/static/images/close.gif create mode 100644 wx-mini-program/static/images/comment.png create mode 100644 wx-mini-program/static/images/complete.png create mode 100644 wx-mini-program/static/images/coupon.png create mode 100644 wx-mini-program/static/images/customer.png create mode 100644 wx-mini-program/static/images/del-address.png create mode 100644 wx-mini-program/static/images/detail_back.png create mode 100644 wx-mini-program/static/images/dfh.png create mode 100644 wx-mini-program/static/images/dfk.png create mode 100644 wx-mini-program/static/images/down.png create mode 100644 wx-mini-program/static/images/dpj.png create mode 100644 wx-mini-program/static/images/dsh.png create mode 100644 wx-mini-program/static/images/edit-address.png create mode 100644 wx-mini-program/static/images/feedback.png create mode 100644 wx-mini-program/static/images/footprint.png create mode 100644 wx-mini-program/static/images/friend.png create mode 100644 wx-mini-program/static/images/go.png create mode 100644 wx-mini-program/static/images/group.png create mode 100644 wx-mini-program/static/images/home.png create mode 100644 wx-mini-program/static/images/home@selected.png create mode 100644 wx-mini-program/static/images/ic_menu_shoping_nor.png create mode 100644 wx-mini-program/static/images/ic_menu_topic_nor.png create mode 100644 wx-mini-program/static/images/ic_menu_topic_pressed.png create mode 100644 wx-mini-program/static/images/ico-addr.png create mode 100644 wx-mini-program/static/images/icon_close.png create mode 100644 wx-mini-program/static/images/icon_collect.png create mode 100644 wx-mini-program/static/images/icon_collect_checked.png create mode 100644 wx-mini-program/static/images/icon_error.png create mode 100644 wx-mini-program/static/images/icon_go_more.png create mode 100644 wx-mini-program/static/images/icon_like.png create mode 100644 wx-mini-program/static/images/icon_like_checked.png create mode 100644 wx-mini-program/static/images/kefu.png create mode 100644 wx-mini-program/static/images/mobile.png create mode 100644 wx-mini-program/static/images/my.png create mode 100644 wx-mini-program/static/images/my@selected.png create mode 100644 wx-mini-program/static/images/news.png create mode 100644 wx-mini-program/static/images/noAddress.png create mode 100644 wx-mini-program/static/images/noCart.png create mode 100644 wx-mini-program/static/images/noCart_old.png create mode 100644 wx-mini-program/static/images/open.gif create mode 100644 wx-mini-program/static/images/selnum.png create mode 100644 wx-mini-program/static/images/sh.png create mode 100644 wx-mini-program/static/images/share.png create mode 100644 wx-mini-program/static/images/telephone.png create mode 100644 wx-mini-program/static/images/title_search.png create mode 100644 wx-mini-program/static/images/wechat.png create mode 100644 wx-mini-program/static/images/wxpay.png create mode 100644 wx-mini-program/utils/check.js create mode 100644 wx-mini-program/utils/user.js create mode 100644 wx-mini-program/utils/util.js diff --git a/LICENSE b/LICENSE index 65c5ca8..3e18c6a 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,8 @@ GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2019 DTS-SHOP qiguliuxing<623659388@qq.com> + Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. diff --git a/wx-mini-program/app.js b/wx-mini-program/app.js new file mode 100644 index 0000000..1fb78e9 --- /dev/null +++ b/wx-mini-program/app.js @@ -0,0 +1,31 @@ +var util = require('./utils/util.js'); +var api = require('./config/api.js'); +var user = require('./utils/user.js'); + +App({ + onLaunch: function() { + const updateManager = wx.getUpdateManager(); + wx.getUpdateManager().onUpdateReady(function() { + wx.showModal({ + title: '更新提示', + content: '新版本已经准备好,是否重启应用?', + success: function(res) { + if (res.confirm) { + // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启 + updateManager.applyUpdate() + } + } + }) + }) + }, + onShow: function(options) { + user.checkLogin().then(res => { + this.globalData.hasLogin = true; + }).catch(() => { + this.globalData.hasLogin = false; + }); + }, + globalData: { + hasLogin: false + } +}) \ No newline at end of file diff --git a/wx-mini-program/app.json b/wx-mini-program/app.json new file mode 100644 index 0000000..5be7013 --- /dev/null +++ b/wx-mini-program/app.json @@ -0,0 +1,99 @@ +{ + "pages": [ + "pages/index/index", + "pages/catalog/catalog", + "pages/newGoods/newGoods", + "pages/hotGoods/hotGoods", + "pages/ucenter/index/index", + "pages/ucenter/address/address", + "pages/ucenter/addressAdd/addressAdd", + "pages/ucenter/feedback/feedback", + "pages/ucenter/footprint/footprint", + "pages/ucenter/order/order", + "pages/ucenter/orderDetail/orderDetail", + "pages/ucenter/couponList/couponList", + "pages/ucenter/couponSelect/couponSelect", + "pages/ucenter/collect/collect", + "pages/ucenter/user/user", + "pages/auth/login/login", + "pages/auth/accountLogin/accountLogin", + "pages/auth/register/register", + "pages/auth/reset/reset", + "pages/payResult/payResult", + "pages/comment/comment", + "pages/logs/logs", + "pages/commentPost/commentPost", + "pages/topic/topic", + "pages/topicComment/topicComment", + "pages/topicDetail/topicDetail", + "pages/topicCommentPost/topicCommentPost", + "pages/brand/brand", + "pages/brandDetail/brandDetail", + "pages/search/search", + "pages/category/category", + "pages/cart/cart", + "pages/checkout/checkout", + "pages/goods/goods", + "pages/about/about", + "pages/groupon/myGroupon/myGroupon", + "pages/groupon/grouponDetail/grouponDetail", + "pages/groupon/grouponList/grouponList", + "pages/coupon/coupon", + "pages/brokerage/main/main", + "pages/brokerage/order/order", + "pages/brokerage/record/record", + "pages/brokerage/withdrawal/withdrawal", + "pages/ucenter/expressInfo/expressInfo", + "pages/article/article", + "lib/coupon-window/index", + "lib/home/index" + ], + "window": { + "navigationBarBackgroundColor": "#85c43f", + "navigationBarTitleText": "聚惠星", + "enablePullDownRefresh": true, + "navigationBarTextStyle": "white", + "backgroundColor": "#FFFFFF", + "backgroundTextStyle": "dark" + }, + "tabBar": { + "backgroundColor": "#fafafa", + "borderStyle": "white", + "selectedColor": "#85c43f", + "color": "#666", + "list": [ + { + "pagePath": "pages/index/index", + "iconPath": "static/images/home.png", + "selectedIconPath": "static/images/home@selected.png", + "text": "首页" + }, + { + "pagePath": "pages/catalog/catalog", + "iconPath": "static/images/category.png", + "selectedIconPath": "static/images/category@selected.png", + "text": "分类" + }, + { + "pagePath": "pages/cart/cart", + "iconPath": "static/images/cart.png", + "selectedIconPath": "static/images/cart@selected.png", + "text": "购物车" + }, + { + "pagePath": "pages/ucenter/index/index", + "iconPath": "static/images/my.png", + "selectedIconPath": "static/images/my@selected.png", + "text": "我的" + } + ] + }, + "networkTimeout": { + "request": 10000, + "connectSocket": 10000, + "uploadFile": 10000, + "downloadFile": 10000 + }, + "debug": true, + "sitemapLocation": "sitemap.json" +} \ No newline at end of file diff --git a/wx-mini-program/app.wxss b/wx-mini-program/app.wxss new file mode 100644 index 0000000..ae8ce80 --- /dev/null +++ b/wx-mini-program/app.wxss @@ -0,0 +1,83 @@ +/**app.wxss**/ + +@import '/static/font/iconfont.wxss'; +@import '/static/css/style.wxss'; +@import '/static/css/animate.wxss'; + +.container { + box-sizing: border-box; + background-color: #f4f4f4; + font-family: PingFangSC-Light, helvetica, 'Heiti SC'; +} + +view, image, text, navigator { + box-sizing: border-box; + padding: 0; + margin: 0; +} + +view, text { + font-family: PingFangSC-Light, helvetica, 'Heiti SC'; + font-size: 29rpx; + color: #333; +} + +.start{width: 122rpx; height: 30rpx;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHoAAADMCAYAAAC8yreMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA4BpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpDMDg0NEE2QTVFNUQxMUU4QUI3RkNGOTgwNDYyRUZDOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozODU5QzVENDMwRjcxMUU5OTQ0QzlEOTQ5RkE1MTlBRiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozODU5QzVEMzMwRjcxMUU5OTQ0QzlEOTQ5RkE1MTlBRiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOCAoV2luZG93cykiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpkN2ZhZTM5NC0wNmE4LTkzNGYtODA0OS0zNjBjNTcxOTU2YjAiIHN0UmVmOmRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDpmYWI1M2NhMC04MWE1LTE5NGItYmJlYi1jMzI2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');background-repeat: no-repeat; background-size: 122rpx auto;} +.start.star5{background-position: 0 3rpx;} +.start.star4{background-position: 0 -30rpx;} +.start.star3{background-position: 0 -70rpx;} +.start.star2{background-position: 0 -105rpx;} +.start.star1{background-position: 0 -140rpx;} +.start.star0{background-position: 0 -175rpx;} +page{font-size:28rpx;background-color: #f5f5f5; color: #333;} +view{box-sizing:border-box;} +.acea-row{display:flex;flex-wrap:wrap;} +.acea-row.row-top{align-items:flex-start;} +.acea-row.row-middle{align-items:center;} +.acea-row.row-bottom{align-items:flex-end;} +.acea-row.row-left{justify-content:flex-start;} +.acea-row.row-center{justify-content:center;} +.acea-row.row-right{justify-content:flex-end;} +.acea-row.row-between{justify-content:space-between;} +.acea-row.row-around{justify-content:space-around;} +.acea-row.row-column{flex-direction:column;} +.acea-row.row-column-between{flex-direction:column;justify-content:space-between;} +.acea-row.row-column-around{flex-direction:column;justify-content:space-around;} +.acea-row.row-center-wrapper{align-items:center;justify-content:center;} +.acea-row.row-between-wrapper{align-items:center;justify-content:space-between;} +.font-color{color:#fc4141!important;} +.bg-color{background-color:#85c43f!important;} +.icon-color{color:#85c43f;} +.cart-color{color:#85c43f!important;border:1px solid #85c43f!important;} +/* 单选 */ +radio .wx-radio-input{border-radius:50%;width:38rpx;height:38rpx;} +radio .wx-radio-input.wx-radio-input-checked{border: 1px solid #e93323 !important; +background-color: #e93323 !important;} +/* 多选 */ +checkbox .wx-checkbox-input{border-radius:50%;width:38rpx;height:38rpx;} +checkbox .wx-checkbox-input.wx-checkbox-input-checked{ +border: 1px solid #e93323 !important;background-color: #e93323 !important;color:#fff!important;} +checkbox .wx-checkbox-input.wx-checkbox-input-checked::before {font-size:35rpx;} +.line1{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} +.line2{word-break:break-all;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;} +.mask{position:fixed;top:0;left:0;right:0;bottom:0;background-color:#000;opacity:0.5;z-index:5;} +button{padding:0;margin:0;line-height:normal;background-color:#fff;} +button::after{border:0;} +@keyframes load + { + from {transform: rotate(0deg);} + to {transform: rotate(360deg);} + } +.loadingpic { + animation: load 3s linear 1s infinite; +} + .loading-list { + animation: load linear 1s infinite; + font-size:40rpx;margin-right:22rpx; +} +.loading{width:100%;height:100rpx;line-height:100rpx;align-items:center;justify-content:center;position: relative;text-align:center;} +.loading .line{position: absolute;width: 450rpx;left: 150rpx;top: 50rpx;height: 1px;border-top:1px solid #eee ;} +.loading .text{position: relative;display: inline-block;padding: 0 20rpx;background: #fff;z-index: 2;color: #777;} + +.loadingicon .loading {animation: load linear 1s infinite;font-size:45rpx;color:#000;} +.loadingicon{width:100%;height:80rpx;} diff --git a/wx-mini-program/config/api.js b/wx-mini-program/config/api.js new file mode 100644 index 0000000..057ac73 --- /dev/null +++ b/wx-mini-program/config/api.js @@ -0,0 +1,104 @@ +// 以下是业务服务器API地址 + // 本机开发API地址 +var WxApiRoot = 'http://localhost:8070/wx/'; +// 测试环境部署api地址 +// var WxApiRoot = 'http://192.168.0.101:8070/wx/'; +// 线上云平台api地址 +//var WxApiRoot = 'https://www.dtsshop.com/wx/'; + +module.exports = { + IndexUrl: WxApiRoot + 'home/index', //首页数据接口 + CatalogList: WxApiRoot + 'catalog/index', //分类目录全部分类数据接口 + CatalogCurrent: WxApiRoot + 'catalog/current', //分类目录当前分类数据接口 + + AuthLoginByWeixin: WxApiRoot + 'auth/login_by_weixin', //微信登录 + AuthLoginByAccount: WxApiRoot + 'auth/login', //账号登录 + AuthLogout: WxApiRoot + 'auth/logout', //账号登出 + AuthRegister: WxApiRoot + 'auth/register', //账号注册 + AuthReset: WxApiRoot + 'auth/reset', //账号密码重置 + AuthRegisterCaptcha: WxApiRoot + 'auth/regCaptcha', //验证码 + AuthBindPhone: WxApiRoot + 'auth/bindPhone', //绑定微信手机号 + + GoodsCount: WxApiRoot + 'goods/count', //统计商品总数 + GoodsList: WxApiRoot + 'goods/list', //获得商品列表 + GoodsCategory: WxApiRoot + 'goods/category', //获得分类数据 + GoodsDetail: WxApiRoot + 'goods/detail', //获得商品的详情 + GoodsRelated: WxApiRoot + 'goods/related', //商品详情页的关联商品(大家都在看) + + BrandList: WxApiRoot + 'brand/list', //品牌列表 + BrandDetail: WxApiRoot + 'brand/detail', //品牌详情 + + CartList: WxApiRoot + 'cart/index', //获取购物车的数据 + CartAdd: WxApiRoot + 'cart/add', // 添加商品到购物车 + CartFastAdd: WxApiRoot + 'cart/fastadd', // 立即购买商品 + CartUpdate: WxApiRoot + 'cart/update', // 更新购物车的商品 + CartDelete: WxApiRoot + 'cart/delete', // 删除购物车的商品 + CartChecked: WxApiRoot + 'cart/checked', // 选择或取消选择商品 + CartGoodsCount: WxApiRoot + 'cart/goodscount', // 获取购物车商品件数 + CartCheckout: WxApiRoot + 'cart/checkout', // 下单前信息确认 + + CollectList: WxApiRoot + 'collect/list', //收藏列表 + CollectAddOrDelete: WxApiRoot + 'collect/addordelete', //添加或取消收藏 + + CommentList: WxApiRoot + 'comment/list', //评论列表 + CommentCount: WxApiRoot + 'comment/count', //评论总数 + CommentPost: WxApiRoot + 'comment/post', //发表评论 + + TopicList: WxApiRoot + 'topic/list', //专题列表 + TopicDetail: WxApiRoot + 'topic/detail', //专题详情 + TopicRelated: WxApiRoot + 'topic/related', //相关专题 + + SearchIndex: WxApiRoot + 'search/index', //搜索关键字 + SearchResult: WxApiRoot + 'search/result', //搜索结果 + SearchHelper: WxApiRoot + 'search/helper', //搜索帮助 + SearchClearHistory: WxApiRoot + 'search/clearhistory', //搜索历史清楚 + + AddressList: WxApiRoot + 'address/list', //收货地址列表 + AddressDetail: WxApiRoot + 'address/detail', //收货地址详情 + AddressSave: WxApiRoot + 'address/save', //保存收货地址 + AddressDelete: WxApiRoot + 'address/delete', //保存收货地址 + + ExpressQuery: WxApiRoot + 'express/query', //物流查询 + + RegionList: WxApiRoot + 'region/list', //获取区域列表 + + OrderSubmit: WxApiRoot + 'order/submit', // 提交订单 + OrderPrepay: WxApiRoot + 'order/prepay', // 订单的预支付会话 + OrderList: WxApiRoot + 'order/list', //订单列表 + OrderDetail: WxApiRoot + 'order/detail', //订单详情 + ExpressTrace: WxApiRoot + 'order/expressTrace', //订单物流 + OrderCancel: WxApiRoot + 'order/cancel', //取消订单 + OrderRefund: WxApiRoot + 'order/refund', //退款取消订单 + OrderDelete: WxApiRoot + 'order/delete', //删除订单 + OrderConfirm: WxApiRoot + 'order/confirm', //确认收货 + OrderGoods: WxApiRoot + 'order/goods', // 代评价商品信息 + OrderComment: WxApiRoot + 'order/comment', // 评价订单商品信息 + + FeedbackAdd: WxApiRoot + 'feedback/submit', //添加反馈 + FootprintList: WxApiRoot + 'footprint/list', //足迹列表 + FootprintDelete: WxApiRoot + 'footprint/delete', //删除足迹 + + UserFormIdCreate: WxApiRoot + 'formid/create', //用户FromId,用于发送模版消息 + + GroupOnList: WxApiRoot + 'groupon/list', //团购列表 + GroupOn: WxApiRoot + 'groupon/query', //团购API-查询 + GroupOnMy: WxApiRoot + 'groupon/my', //团购API-我的团购 + GroupOnDetail: WxApiRoot + 'groupon/detail', //团购API-详情 + GroupOnJoin: WxApiRoot + 'groupon/join', //团购API-详情 + + CouponList: WxApiRoot + 'coupon/list', //优惠券列表 + CouponMyList: WxApiRoot + 'coupon/mylist', //我的优惠券列表 + CouponSelectList: WxApiRoot + 'coupon/selectlist', //当前订单可用优惠券列表 + CouponReceive: WxApiRoot + 'coupon/receive', //优惠券领取 + CouponReceiveAll: WxApiRoot + 'coupon/receiveAll', //优惠券领取 + CouponExchange: WxApiRoot + 'coupon/exchange', //优惠券兑换 + GetUserCoupon:WxApiRoot + 'coupon/getUserCoupon',//用户个人可领取优惠券查询 + + StorageUpload: WxApiRoot + 'storage/upload', //图片上传, + + UserIndex: WxApiRoot + 'user/index', //个人页面用户相关信息 + BrokerageMain: WxApiRoot + 'brokerage/main',//佣金收益主页面 + SettleOrderList: WxApiRoot + 'brokerage/settleOrderList',//佣金收益主页面 + ExtractList: WxApiRoot + 'brokerage/extractList',//佣金账号提现记录 + ArticleDetail: WxApiRoot + 'article/detail' //公告详情 +}; \ No newline at end of file diff --git a/wx-mini-program/lib/coupon-window/index.js b/wx-mini-program/lib/coupon-window/index.js new file mode 100644 index 0000000..5a96393 --- /dev/null +++ b/wx-mini-program/lib/coupon-window/index.js @@ -0,0 +1,48 @@ +const util = require('../../utils/util.js'); +const api = require('../../config/api.js'); +const user = require('../../utils/user.js'); + +var app = getApp(); + +Component({ + properties: { + window:{ + type: Boolean, + value: true, + }, + couponList:{ + type:Array, + value:[], + } + }, + data: { + + }, + attached: function () { + + }, + methods: { + close:function(){ + this.triggerEvent('onColse'); + }, + getAllCoupon: function () { + if (!app.globalData.hasLogin) { + wx.navigateTo({ + url: "/pages/auth/login/login" + }); + } + util.request(api.CouponReceiveAll, null, 'POST').then(res => { + if (res.errno === 0) { + wx.showToast({ + title: "领取成功" + }); + this.triggerEvent('onColse'); + } + else { + util.showErrorToast(res.errmsg); + } + }) + }, + + } +}) \ No newline at end of file diff --git a/wx-mini-program/lib/coupon-window/index.json b/wx-mini-program/lib/coupon-window/index.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/wx-mini-program/lib/coupon-window/index.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/wx-mini-program/lib/coupon-window/index.wxml b/wx-mini-program/lib/coupon-window/index.wxml new file mode 100644 index 0000000..7657d4e --- /dev/null +++ b/wx-mini-program/lib/coupon-window/index.wxml @@ -0,0 +1,17 @@ + + + + {{item.discount}} + + 【{{item.desc}}】购物买{{item.min}}减{{item.discount}} + 有效期:{{item.days}}天 + {{item.startTime}}-{{item.endTime}} + + + + + 立即领取 + + + + diff --git a/wx-mini-program/lib/coupon-window/index.wxss b/wx-mini-program/lib/coupon-window/index.wxss new file mode 100644 index 0000000..6277bee --- /dev/null +++ b/wx-mini-program/lib/coupon-window/index.wxss @@ -0,0 +1,14 @@ +@import '/app.wxss'; +.coupon-window{background-image:url('data:image/png;base64,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');background-repeat:no-repeat;background-size:100% 100%;width:630rpx;height:649rpx;position:fixed;top:20%;z-index:99;left:50%;margin-left:-305rpx;transform:translate3d(0,-200%,0);transition:all .3s cubic-bezier(.25,.5,.5,.9);} +.coupon-window.on{transform:translate3d(0,0,0);} +.coupon-window .couponWinList{width:480rpx;margin:157rpx 0 0 60rpx;height:415rpx;overflow:auto;} +.coupon-window .couponWinList .item{width:100%;height:120rpx;background-color:#fff;position:relative;margin-bottom:17rpx;} +.coupon-window .couponWinList .item::after{content:'';position: absolute;width:18rpx;height: 18rpx;border-radius: 50%;background-color: #f2443a;left:25.5%;bottom:0;margin-bottom:-9rpx;} +.coupon-window .couponWinList .item::before{content:'';position: absolute;width:18rpx;height: 18rpx;border-radius: 50%;background-color: #f2443a;left:25.5%;top:0;margin-top:-9rpx;} +.coupon-window .couponWinList .item .money{width:130rpx;border-right:1px dashed #ddd;height:100%;text-align:center;line-height:120rpx;font-size:26rpx;font-weight:bold;} +.coupon-window .couponWinList .item .money .num{font-size:40rpx;color: #e00;} +.coupon-window .couponWinList .item .text{width:349rpx;font-size:22rpx;color:#999;padding:0 10rpx;box-sizing:border-box;} +.coupon-window .couponWinList .item .text .name{font-size:24rpx;color:#282828;font-weight:bold;margin-bottom:9rpx;} +.coupon-window .lid{background-image:url('data:image/png;base64,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');background-repeat:no-repeat;background-size:100% 100%;width:573rpx;height:224rpx;position:fixed;left:50%;top:20%;margin:424rpx 0 0 -296rpx;} +.coupon-window .lid .bnt{font-size:29rpx;width:440rpx;height:80rpx;border-radius:40rpx;background-color:#f9f1d3;text-align:center;line-height:80rpx;font-weight:bold;margin:98rpx auto 0 auto;} +.coupon-window .lid .iconfont{color:#fff;font-size:60rpx;text-align:center;margin-top:87rpx;} \ No newline at end of file diff --git a/wx-mini-program/lib/home/index.js b/wx-mini-program/lib/home/index.js new file mode 100644 index 0000000..f7362e1 --- /dev/null +++ b/wx-mini-program/lib/home/index.js @@ -0,0 +1,77 @@ +// components/home/index.js +Page({ + + /** + * 页面的初始数据 + */ + data: { + homeActive:false + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + + }, + setTouchMove: function (e) { + var that = this; + if (e.touches[0].clientY < 400 && e.touches[0].clientY > 66) { + that.setData({ + top: e.touches[0].clientY + }) + } + }, + open:function(){ + this.setData({ + homeActive: !this.data.homeActive + }) + }, + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/wx-mini-program/lib/home/index.json b/wx-mini-program/lib/home/index.json new file mode 100644 index 0000000..4575d1b --- /dev/null +++ b/wx-mini-program/lib/home/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "component": true +} \ No newline at end of file diff --git a/wx-mini-program/lib/home/index.wxml b/wx-mini-program/lib/home/index.wxml new file mode 100644 index 0000000..aeb64f7 --- /dev/null +++ b/wx-mini-program/lib/home/index.wxml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/wx-mini-program/lib/home/index.wxss b/wx-mini-program/lib/home/index.wxss new file mode 100644 index 0000000..17b3324 --- /dev/null +++ b/wx-mini-program/lib/home/index.wxss @@ -0,0 +1,7 @@ +@import '/app.wxss'; +.home{position: fixed ;top:580rpx;color: white;text-align: center;z-index:99;right:10rpx;} +.home .homeCon{width:86rpx;border-radius:50rpx;padding:34rpx 0;box-sizing:border-box;transition:all 0.3s ease-in-out 0s;opacity:0;transform: scale(0);height:0rpx;color:#e93323;} +.home .homeCon.on{opacity:1;transform: scale(1);height:300rpx;color:#fff;} +.home .homeCon .iconfont{font-size:48rpx;} +.home .pictrue{width:86rpx;height:86rpx;border-radius:50%;margin-top:20rpx;} +.home .pictrue image{width:100%;height:100%;border-radius:50%;} diff --git a/wx-mini-program/lib/share-red-packets/index.js b/wx-mini-program/lib/share-red-packets/index.js new file mode 100644 index 0000000..fe012f2 --- /dev/null +++ b/wx-mini-program/lib/share-red-packets/index.js @@ -0,0 +1,27 @@ +var app = getApp(); +Component({ + properties: { + sharePacket:{ + type:Object, + value:{ + isState: true, + priceName:'', + } + } + }, + data: { + + }, + attached: function () { + }, + methods: { + closeShare:function(){ + this.setData({ + "sharePacket.isState": true + }) + }, + goShare:function(){ + this.triggerEvent('listenerActionSheet'); + }, + } +}) \ No newline at end of file diff --git a/wx-mini-program/lib/share-red-packets/index.json b/wx-mini-program/lib/share-red-packets/index.json new file mode 100644 index 0000000..4575d1b --- /dev/null +++ b/wx-mini-program/lib/share-red-packets/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "component": true +} \ No newline at end of file diff --git a/wx-mini-program/lib/share-red-packets/index.wxml b/wx-mini-program/lib/share-red-packets/index.wxml new file mode 100644 index 0000000..d1002f3 --- /dev/null +++ b/wx-mini-program/lib/share-red-packets/index.wxml @@ -0,0 +1,13 @@ + diff --git a/wx-mini-program/lib/share-red-packets/index.wxss b/wx-mini-program/lib/share-red-packets/index.wxss new file mode 100644 index 0000000..e3cc259 --- /dev/null +++ b/wx-mini-program/lib/share-red-packets/index.wxss @@ -0,0 +1,12 @@ +@import '/app.wxss'; +.sharing-packets{position:fixed;right:30rpx;top:900rpx;z-index:5;transition:all 0.3s ease-in-out 0s;opacity:1;transform: scale(1);} +.sharing-packets.on{transform: scale(0);opacity:0;} +.sharing-packets .iconfont{width:44rpx;height:44rpx;border-radius:50%;text-align:center;line-height:44rpx;background-color:#999;font-size:20rpx;color:#fff;margin:0 auto;box-sizing:border-box;padding-left:1px;} +.sharing-packets .line{width:2rpx;height:40rpx;background-color:#999;margin:0 auto;} +.sharing-packets .sharing-con{width:187rpx;height:210rpx;position:relative;} +.sharing-packets .sharing-con image{width:100%;height:100%;} +.sharing-packets .sharing-con .text{position:absolute;top:30rpx;font-size:20rpx;width:100%;text-align:center;} +.sharing-packets .sharing-con .text .money{font-size:32rpx;font-weight:bold;margin-top:5rpx;} +.sharing-packets .sharing-con .text .money .label{font-size:20rpx;} +.sharing-packets .sharing-con .text .tip{font-size:18rpx;color:#999;margin-top:5rpx;} +.sharing-packets .sharing-con .text .shareBut{font-size:22rpx;color:#fff;margin-top:18rpx;height:50rpx;line-height:50rpx;} diff --git a/wx-mini-program/lib/wxParse/html2json.js b/wx-mini-program/lib/wxParse/html2json.js new file mode 100644 index 0000000..e0df889 --- /dev/null +++ b/wx-mini-program/lib/wxParse/html2json.js @@ -0,0 +1,242 @@ +/** + * author: Di (微信小程序开发工程师) + * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com) + * 垂直微信小程序开发交流社区 + * + * github地址: https://github.com/icindy/wxParse + * + * for: 微信小程序富文本解析 + * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184 + */ + +var __placeImgeUrlHttps = "https"; +var __emojisReg = ''; +var __emojisBaseSrc = ''; +var __emojis = {}; +var wxDiscode = require('wxDiscode.js'); +var HTMLParser = require('htmlparser.js'); +// Empty Elements - HTML 5 +var empty = makeMap("area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr"); +// Block Elements - HTML 5 +var block = makeMap("br,a,code,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video"); + +// Inline Elements - HTML 5 +var inline = makeMap("abbr,acronym,applet,b,basefont,bdo,big,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var"); + +// Elements that you can, intentionally, leave open +// (and which close themselves) +var closeSelf = makeMap("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr"); + +// Attributes that have their values filled in disabled="disabled" +var fillAttrs = makeMap("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected"); + +// Special Elements (can contain anything) +var special = makeMap("wxxxcode-style,script,style,view,scroll-view,block"); +function makeMap(str) { + var obj = {}, items = str.split(","); + for (var i = 0; i < items.length; i++) + obj[items[i]] = true; + return obj; +} + +function q(v) { + return '"' + v + '"'; +} + +function removeDOCTYPE(html) { + return html + .replace(/<\?xml.*\?>\n/, '') + .replace(/\n/, '') + .replace(/\n/, ''); +} + + +function html2json(html, bindName) { + //处理字符串 + html = removeDOCTYPE(html); + html = wxDiscode.strDiscode(html); + //生成node节点 + var bufArray = []; + var results = { + node: bindName, + nodes: [], + images:[], + imageUrls:[] + }; + HTMLParser(html, { + start: function (tag, attrs, unary) { + //debug(tag, attrs, unary); + // node for this element + var node = { + node: 'element', + tag: tag, + }; + + if (block[tag]) { + node.tagType = "block"; + } else if (inline[tag]) { + node.tagType = "inline"; + } else if (closeSelf[tag]) { + node.tagType = "closeSelf"; + } + + if (attrs.length !== 0) { + node.attr = attrs.reduce(function (pre, attr) { + var name = attr.name; + var value = attr.value; + if (name == 'class') { + // console.dir(value); + // value = value.join("") + node.classStr = value; + } + // has multi attibutes + // make it array of attribute + if (name == 'style') { + // console.dir(value); + // value = value.join("") + node.styleStr = value; + } + if (value.match(/ /)) { + value = value.split(' '); + } + + + // if attr already exists + // merge it + if (pre[name]) { + if (Array.isArray(pre[name])) { + // already array, push to last + pre[name].push(value); + } else { + // single value, make it array + pre[name] = [pre[name], value]; + } + } else { + // not exist, put it + pre[name] = value; + } + + return pre; + }, {}); + } + + //对img添加额外数据 + if (node.tag === 'img') { + node.imgIndex = results.images.length; + var imgUrl = node.attr.src; + imgUrl = wxDiscode.urlToHttpUrl(imgUrl, __placeImgeUrlHttps); + node.attr.src = imgUrl; + node.from = bindName; + results.images.push(node); + results.imageUrls.push(imgUrl); + } + + if (unary) { + // if this tag dosen't have end tag + // like + // add to parents + var parent = bufArray[0] || results; + if (parent.nodes === undefined) { + parent.nodes = []; + } + parent.nodes.push(node); + } else { + bufArray.unshift(node); + } + }, + end: function (tag) { + //debug(tag); + // merge into parent tag + var node = bufArray.shift(); + if (node.tag !== tag) console.error('invalid state: mismatch end tag'); + + if (bufArray.length === 0) { + results.nodes.push(node); + } else { + var parent = bufArray[0]; + if (parent.nodes === undefined) { + parent.nodes = []; + } + parent.nodes.push(node); + } + }, + chars: function (text) { + //debug(text); + var node = { + node: 'text', + text: text, + textArray:transEmojiStr(text) + }; + + if (bufArray.length === 0) { + results.nodes.push(node); + } else { + var parent = bufArray[0]; + if (parent.nodes === undefined) { + parent.nodes = []; + } + parent.nodes.push(node); + } + }, + comment: function (text) { + //debug(text); + var node = { + node: 'comment', + text: text, + }; + var parent = bufArray[0]; + if (parent.nodes === undefined) { + parent.nodes = []; + } + parent.nodes.push(node); + }, + }); + return results; +}; + +function transEmojiStr(str){ + // var eReg = new RegExp("["+__reg+' '+"]"); +// str = str.replace(/\[([^\[\]]+)\]/g,':$1:') + + var emojiObjs = []; + //如果正则表达式为空 + if(__emojisReg.length == 0 || !__emojis){ + var emojiObj = {} + emojiObj.node = "text"; + emojiObj.text = str; + array = [emojiObj]; + return array; + } + //这个地方需要调整 + str = str.replace(/\[([^\[\]]+)\]/g,':$1:') + var eReg = new RegExp("[:]"); + var array = str.split(eReg); + for(var i = 0; i < array.length; i++){ + var ele = array[i]; + var emojiObj = {}; + if(__emojis[ele]){ + emojiObj.node = "element"; + emojiObj.tag = "emoji"; + emojiObj.text = __emojis[ele]; + emojiObj.baseSrc= __emojisBaseSrc; + }else{ + emojiObj.node = "text"; + emojiObj.text = ele; + } + emojiObjs.push(emojiObj); + } + + return emojiObjs; +} + +function emojisInit(reg='',baseSrc="/wxParse/emojis/",emojis){ + __emojisReg = reg; + __emojisBaseSrc=baseSrc; + __emojis=emojis; +} + +module.exports = { + html2json: html2json, + emojisInit:emojisInit +}; + diff --git a/wx-mini-program/lib/wxParse/htmlparser.js b/wx-mini-program/lib/wxParse/htmlparser.js new file mode 100644 index 0000000..7406b45 --- /dev/null +++ b/wx-mini-program/lib/wxParse/htmlparser.js @@ -0,0 +1,182 @@ +/** + * author: Di (微信小程序开发工程师) + * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com) + * 垂直微信小程序开发交流社区 + * + * github地址: https://github.com/icindy/wxParse + * + * for: 微信小程序富文本解析 + * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184 + */ +// Regular Expressions for parsing tags and attributes +var startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/, + endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/, + attr = /([a-zA-Z_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g; + +// Empty Elements - HTML 5 +var empty = makeMap("area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr"); + +// Block Elements - HTML 5 +var block = makeMap("a,address,code,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video"); + +// Inline Elements - HTML 5 +var inline = makeMap("abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var"); + +// Elements that you can, intentionally, leave open +// (and which close themselves) +var closeSelf = makeMap("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr"); + +// Attributes that have their values filled in disabled="disabled" +var fillAttrs = makeMap("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected"); + +// Special Elements (can contain anything) +var special = makeMap("wxxxcode-style,script,style,view,scroll-view,block"); + +function HTMLParser(html, handler) { + var index, chars, match, stack = [], last = html; + stack.last = function () { + return this[this.length - 1]; + }; + + while (html) { + chars = true; + + // Make sure we're not in a script or style element + if (!stack.last() || !special[stack.last()]) { + + // Comment + if (html.indexOf(""); + + if (index >= 0) { + if (handler.comment) + handler.comment(html.substring(4, index)); + html = html.substring(index + 3); + chars = false; + } + + // end tag + } else if (html.indexOf("]*>"), function (all, text) { + text = text.replace(/|/g, "$1$2"); + if (handler.chars) + handler.chars(text); + + return ""; + }); + + + parseEndTag("", stack.last()); + } + + if (html == last) + throw "Parse Error: " + html; + last = html; + } + + // Clean up any remaining tags + parseEndTag(); + + function parseStartTag(tag, tagName, rest, unary) { + tagName = tagName.toLowerCase(); + + if (block[tagName]) { + while (stack.last() && inline[stack.last()]) { + parseEndTag("", stack.last()); + } + } + + if (closeSelf[tagName] && stack.last() == tagName) { + parseEndTag("", tagName); + } + + unary = empty[tagName] || !!unary; + + if (!unary) + stack.push(tagName); + + if (handler.start) { + var attrs = []; + + rest.replace(attr, function (match, name) { + var value = arguments[2] ? arguments[2] : + arguments[3] ? arguments[3] : + arguments[4] ? arguments[4] : + fillAttrs[name] ? name : ""; + + attrs.push({ + name: name, + value: value, + escaped: value.replace(/(^|[^\\])"/g, '$1\\\"') //" + }); + }); + + if (handler.start) { + handler.start(tagName, attrs, unary); + } + + } + } + + function parseEndTag(tag, tagName) { + // If no tag name is provided, clean shop + if (!tagName) + var pos = 0; + + // Find the closest opened tag of the same type + else + for (var pos = stack.length - 1; pos >= 0; pos--) + if (stack[pos] == tagName) + break; + + if (pos >= 0) { + // Close all the open elements, up the stack + for (var i = stack.length - 1; i >= pos; i--) + if (handler.end) + handler.end(stack[i]); + + // Remove the open elements from the stack + stack.length = pos; + } + } +}; + +function makeMap(str) { + var obj = {}, items = str.split(","); + for (var i = 0; i < items.length; i++) + obj[items[i]] = true; + return obj; +} + +module.exports = HTMLParser; diff --git a/wx-mini-program/lib/wxParse/showdown.js b/wx-mini-program/lib/wxParse/showdown.js new file mode 100644 index 0000000..a1f830f --- /dev/null +++ b/wx-mini-program/lib/wxParse/showdown.js @@ -0,0 +1,2529 @@ +/** + * author: Di (微信小程序开发工程师) + * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com) + * 垂直微信小程序开发交流社区 + * + * github地址: https://github.com/icindy/wxParse + * + * for: 微信小程序富文本解析 + * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184 + */ + +function getDefaultOpts(simple) { + 'use strict'; + + var defaultOptions = { + omitExtraWLInCodeBlocks: { + defaultValue: false, + describe: 'Omit the default extra whiteline added to code blocks', + type: 'boolean' + }, + noHeaderId: { + defaultValue: false, + describe: 'Turn on/off generated header id', + type: 'boolean' + }, + prefixHeaderId: { + defaultValue: false, + describe: 'Specify a prefix to generated header ids', + type: 'string' + }, + headerLevelStart: { + defaultValue: false, + describe: 'The header blocks level start', + type: 'integer' + }, + parseImgDimensions: { + defaultValue: false, + describe: 'Turn on/off image dimension parsing', + type: 'boolean' + }, + simplifiedAutoLink: { + defaultValue: false, + describe: 'Turn on/off GFM autolink style', + type: 'boolean' + }, + literalMidWordUnderscores: { + defaultValue: false, + describe: 'Parse midword underscores as literal underscores', + type: 'boolean' + }, + strikethrough: { + defaultValue: false, + describe: 'Turn on/off strikethrough support', + type: 'boolean' + }, + tables: { + defaultValue: false, + describe: 'Turn on/off tables support', + type: 'boolean' + }, + tablesHeaderId: { + defaultValue: false, + describe: 'Add an id to table headers', + type: 'boolean' + }, + ghCodeBlocks: { + defaultValue: true, + describe: 'Turn on/off GFM fenced code blocks support', + type: 'boolean' + }, + tasklists: { + defaultValue: false, + describe: 'Turn on/off GFM tasklist support', + type: 'boolean' + }, + smoothLivePreview: { + defaultValue: false, + describe: 'Prevents weird effects in live previews due to incomplete input', + type: 'boolean' + }, + smartIndentationFix: { + defaultValue: false, + description: 'Tries to smartly fix identation in es6 strings', + type: 'boolean' + } + }; + if (simple === false) { + return JSON.parse(JSON.stringify(defaultOptions)); + } + var ret = {}; + for (var opt in defaultOptions) { + if (defaultOptions.hasOwnProperty(opt)) { + ret[opt] = defaultOptions[opt].defaultValue; + } + } + return ret; +} + +/** + * Created by Tivie on 06-01-2015. + */ + +// Private properties +var showdown = {}, + parsers = {}, + extensions = {}, + globalOptions = getDefaultOpts(true), + flavor = { + github: { + omitExtraWLInCodeBlocks: true, + prefixHeaderId: 'user-content-', + simplifiedAutoLink: true, + literalMidWordUnderscores: true, + strikethrough: true, + tables: true, + tablesHeaderId: true, + ghCodeBlocks: true, + tasklists: true + }, + vanilla: getDefaultOpts(true) + }; + +/** + * helper namespace + * @type {{}} + */ +showdown.helper = {}; + +/** + * TODO LEGACY SUPPORT CODE + * @type {{}} + */ +showdown.extensions = {}; + +/** + * Set a global option + * @static + * @param {string} key + * @param {*} value + * @returns {showdown} + */ +showdown.setOption = function (key, value) { + 'use strict'; + globalOptions[key] = value; + return this; +}; + +/** + * Get a global option + * @static + * @param {string} key + * @returns {*} + */ +showdown.getOption = function (key) { + 'use strict'; + return globalOptions[key]; +}; + +/** + * Get the global options + * @static + * @returns {{}} + */ +showdown.getOptions = function () { + 'use strict'; + return globalOptions; +}; + +/** + * Reset global options to the default values + * @static + */ +showdown.resetOptions = function () { + 'use strict'; + globalOptions = getDefaultOpts(true); +}; + +/** + * Set the flavor showdown should use as default + * @param {string} name + */ +showdown.setFlavor = function (name) { + 'use strict'; + if (flavor.hasOwnProperty(name)) { + var preset = flavor[name]; + for (var option in preset) { + if (preset.hasOwnProperty(option)) { + globalOptions[option] = preset[option]; + } + } + } +}; + +/** + * Get the default options + * @static + * @param {boolean} [simple=true] + * @returns {{}} + */ +showdown.getDefaultOptions = function (simple) { + 'use strict'; + return getDefaultOpts(simple); +}; + +/** + * Get or set a subParser + * + * subParser(name) - Get a registered subParser + * subParser(name, func) - Register a subParser + * @static + * @param {string} name + * @param {function} [func] + * @returns {*} + */ +showdown.subParser = function (name, func) { + 'use strict'; + if (showdown.helper.isString(name)) { + if (typeof func !== 'undefined') { + parsers[name] = func; + } else { + if (parsers.hasOwnProperty(name)) { + return parsers[name]; + } else { + throw Error('SubParser named ' + name + ' not registered!'); + } + } + } +}; + +/** + * Gets or registers an extension + * @static + * @param {string} name + * @param {object|function=} ext + * @returns {*} + */ +showdown.extension = function (name, ext) { + 'use strict'; + + if (!showdown.helper.isString(name)) { + throw Error('Extension \'name\' must be a string'); + } + + name = showdown.helper.stdExtName(name); + + // Getter + if (showdown.helper.isUndefined(ext)) { + if (!extensions.hasOwnProperty(name)) { + throw Error('Extension named ' + name + ' is not registered!'); + } + return extensions[name]; + + // Setter + } else { + // Expand extension if it's wrapped in a function + if (typeof ext === 'function') { + ext = ext(); + } + + // Ensure extension is an array + if (!showdown.helper.isArray(ext)) { + ext = [ext]; + } + + var validExtension = validate(ext, name); + + if (validExtension.valid) { + extensions[name] = ext; + } else { + throw Error(validExtension.error); + } + } +}; + +/** + * Gets all extensions registered + * @returns {{}} + */ +showdown.getAllExtensions = function () { + 'use strict'; + return extensions; +}; + +/** + * Remove an extension + * @param {string} name + */ +showdown.removeExtension = function (name) { + 'use strict'; + delete extensions[name]; +}; + +/** + * Removes all extensions + */ +showdown.resetExtensions = function () { + 'use strict'; + extensions = {}; +}; + +/** + * Validate extension + * @param {array} extension + * @param {string} name + * @returns {{valid: boolean, error: string}} + */ +function validate(extension, name) { + 'use strict'; + + var errMsg = (name) ? 'Error in ' + name + ' extension->' : 'Error in unnamed extension', + ret = { + valid: true, + error: '' + }; + + if (!showdown.helper.isArray(extension)) { + extension = [extension]; + } + + for (var i = 0; i < extension.length; ++i) { + var baseMsg = errMsg + ' sub-extension ' + i + ': ', + ext = extension[i]; + if (typeof ext !== 'object') { + ret.valid = false; + ret.error = baseMsg + 'must be an object, but ' + typeof ext + ' given'; + return ret; + } + + if (!showdown.helper.isString(ext.type)) { + ret.valid = false; + ret.error = baseMsg + 'property "type" must be a string, but ' + typeof ext.type + ' given'; + return ret; + } + + var type = ext.type = ext.type.toLowerCase(); + + // normalize extension type + if (type === 'language') { + type = ext.type = 'lang'; + } + + if (type === 'html') { + type = ext.type = 'output'; + } + + if (type !== 'lang' && type !== 'output' && type !== 'listener') { + ret.valid = false; + ret.error = baseMsg + 'type ' + type + ' is not recognized. Valid values: "lang/language", "output/html" or "listener"'; + return ret; + } + + if (type === 'listener') { + if (showdown.helper.isUndefined(ext.listeners)) { + ret.valid = false; + ret.error = baseMsg + '. Extensions of type "listener" must have a property called "listeners"'; + return ret; + } + } else { + if (showdown.helper.isUndefined(ext.filter) && showdown.helper.isUndefined(ext.regex)) { + ret.valid = false; + ret.error = baseMsg + type + ' extensions must define either a "regex" property or a "filter" method'; + return ret; + } + } + + if (ext.listeners) { + if (typeof ext.listeners !== 'object') { + ret.valid = false; + ret.error = baseMsg + '"listeners" property must be an object but ' + typeof ext.listeners + ' given'; + return ret; + } + for (var ln in ext.listeners) { + if (ext.listeners.hasOwnProperty(ln)) { + if (typeof ext.listeners[ln] !== 'function') { + ret.valid = false; + ret.error = baseMsg + '"listeners" property must be an hash of [event name]: [callback]. listeners.' + ln + + ' must be a function but ' + typeof ext.listeners[ln] + ' given'; + return ret; + } + } + } + } + + if (ext.filter) { + if (typeof ext.filter !== 'function') { + ret.valid = false; + ret.error = baseMsg + '"filter" must be a function, but ' + typeof ext.filter + ' given'; + return ret; + } + } else if (ext.regex) { + if (showdown.helper.isString(ext.regex)) { + ext.regex = new RegExp(ext.regex, 'g'); + } + if (!ext.regex instanceof RegExp) { + ret.valid = false; + ret.error = baseMsg + '"regex" property must either be a string or a RegExp object, but ' + typeof ext.regex + ' given'; + return ret; + } + if (showdown.helper.isUndefined(ext.replace)) { + ret.valid = false; + ret.error = baseMsg + '"regex" extensions must implement a replace string or function'; + return ret; + } + } + } + return ret; +} + +/** + * Validate extension + * @param {object} ext + * @returns {boolean} + */ +showdown.validateExtension = function (ext) { + 'use strict'; + + var validateExtension = validate(ext, null); + if (!validateExtension.valid) { + console.warn(validateExtension.error); + return false; + } + return true; +}; + +/** + * showdownjs helper functions + */ + +if (!showdown.hasOwnProperty('helper')) { + showdown.helper = {}; +} + +/** + * Check if var is string + * @static + * @param {string} a + * @returns {boolean} + */ +showdown.helper.isString = function isString(a) { + 'use strict'; + return (typeof a === 'string' || a instanceof String); +}; + +/** + * Check if var is a function + * @static + * @param {string} a + * @returns {boolean} + */ +showdown.helper.isFunction = function isFunction(a) { + 'use strict'; + var getType = {}; + return a && getType.toString.call(a) === '[object Function]'; +}; + +/** + * ForEach helper function + * @static + * @param {*} obj + * @param {function} callback + */ +showdown.helper.forEach = function forEach(obj, callback) { + 'use strict'; + if (typeof obj.forEach === 'function') { + obj.forEach(callback); + } else { + for (var i = 0; i < obj.length; i++) { + callback(obj[i], i, obj); + } + } +}; + +/** + * isArray helper function + * @static + * @param {*} a + * @returns {boolean} + */ +showdown.helper.isArray = function isArray(a) { + 'use strict'; + return a.constructor === Array; +}; + +/** + * Check if value is undefined + * @static + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. + */ +showdown.helper.isUndefined = function isUndefined(value) { + 'use strict'; + return typeof value === 'undefined'; +}; + +/** + * Standardidize extension name + * @static + * @param {string} s extension name + * @returns {string} + */ +showdown.helper.stdExtName = function (s) { + 'use strict'; + return s.replace(/[_-]||\s/g, '').toLowerCase(); +}; + +function escapeCharactersCallback(wholeMatch, m1) { + 'use strict'; + var charCodeToEscape = m1.charCodeAt(0); + return '~E' + charCodeToEscape + 'E'; +} + +/** + * Callback used to escape characters when passing through String.replace + * @static + * @param {string} wholeMatch + * @param {string} m1 + * @returns {string} + */ +showdown.helper.escapeCharactersCallback = escapeCharactersCallback; + +/** + * Escape characters in a string + * @static + * @param {string} text + * @param {string} charsToEscape + * @param {boolean} afterBackslash + * @returns {XML|string|void|*} + */ +showdown.helper.escapeCharacters = function escapeCharacters(text, charsToEscape, afterBackslash) { + 'use strict'; + // First we have to escape the escape characters so that + // we can build a character class out of them + var regexString = '([' + charsToEscape.replace(/([\[\]\\])/g, '\\$1') + '])'; + + if (afterBackslash) { + regexString = '\\\\' + regexString; + } + + var regex = new RegExp(regexString, 'g'); + text = text.replace(regex, escapeCharactersCallback); + + return text; +}; + +var rgxFindMatchPos = function (str, left, right, flags) { + 'use strict'; + var f = flags || '', + g = f.indexOf('g') > -1, + x = new RegExp(left + '|' + right, 'g' + f.replace(/g/g, '')), + l = new RegExp(left, f.replace(/g/g, '')), + pos = [], + t, s, m, start, end; + + do { + t = 0; + while ((m = x.exec(str))) { + if (l.test(m[0])) { + if (!(t++)) { + s = x.lastIndex; + start = s - m[0].length; + } + } else if (t) { + if (!--t) { + end = m.index + m[0].length; + var obj = { + left: {start: start, end: s}, + match: {start: s, end: m.index}, + right: {start: m.index, end: end}, + wholeMatch: {start: start, end: end} + }; + pos.push(obj); + if (!g) { + return pos; + } + } + } + } + } while (t && (x.lastIndex = s)); + + return pos; +}; + +/** + * matchRecursiveRegExp + * + * (c) 2007 Steven Levithan + * MIT License + * + * Accepts a string to search, a left and right format delimiter + * as regex patterns, and optional regex flags. Returns an array + * of matches, allowing nested instances of left/right delimiters. + * Use the "g" flag to return all matches, otherwise only the + * first is returned. Be careful to ensure that the left and + * right format delimiters produce mutually exclusive matches. + * Backreferences are not supported within the right delimiter + * due to how it is internally combined with the left delimiter. + * When matching strings whose format delimiters are unbalanced + * to the left or right, the output is intentionally as a + * conventional regex library with recursion support would + * produce, e.g. "<" and ">" both produce ["x"] when using + * "<" and ">" as the delimiters (both strings contain a single, + * balanced instance of ""). + * + * examples: + * matchRecursiveRegExp("test", "\\(", "\\)") + * returns: [] + * matchRecursiveRegExp(">>t<>", "<", ">", "g") + * returns: ["t<>", ""] + * matchRecursiveRegExp("
test
", "]*>", "", "gi") + * returns: ["test"] + */ +showdown.helper.matchRecursiveRegExp = function (str, left, right, flags) { + 'use strict'; + + var matchPos = rgxFindMatchPos (str, left, right, flags), + results = []; + + for (var i = 0; i < matchPos.length; ++i) { + results.push([ + str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end), + str.slice(matchPos[i].match.start, matchPos[i].match.end), + str.slice(matchPos[i].left.start, matchPos[i].left.end), + str.slice(matchPos[i].right.start, matchPos[i].right.end) + ]); + } + return results; +}; + +/** + * + * @param {string} str + * @param {string|function} replacement + * @param {string} left + * @param {string} right + * @param {string} flags + * @returns {string} + */ +showdown.helper.replaceRecursiveRegExp = function (str, replacement, left, right, flags) { + 'use strict'; + + if (!showdown.helper.isFunction(replacement)) { + var repStr = replacement; + replacement = function () { + return repStr; + }; + } + + var matchPos = rgxFindMatchPos(str, left, right, flags), + finalStr = str, + lng = matchPos.length; + + if (lng > 0) { + var bits = []; + if (matchPos[0].wholeMatch.start !== 0) { + bits.push(str.slice(0, matchPos[0].wholeMatch.start)); + } + for (var i = 0; i < lng; ++i) { + bits.push( + replacement( + str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end), + str.slice(matchPos[i].match.start, matchPos[i].match.end), + str.slice(matchPos[i].left.start, matchPos[i].left.end), + str.slice(matchPos[i].right.start, matchPos[i].right.end) + ) + ); + if (i < lng - 1) { + bits.push(str.slice(matchPos[i].wholeMatch.end, matchPos[i + 1].wholeMatch.start)); + } + } + if (matchPos[lng - 1].wholeMatch.end < str.length) { + bits.push(str.slice(matchPos[lng - 1].wholeMatch.end)); + } + finalStr = bits.join(''); + } + return finalStr; +}; + +/** + * POLYFILLS + */ +if (showdown.helper.isUndefined(console)) { + console = { + warn: function (msg) { + 'use strict'; + alert(msg); + }, + log: function (msg) { + 'use strict'; + alert(msg); + }, + error: function (msg) { + 'use strict'; + throw msg; + } + }; +} + +/** + * Created by Estevao on 31-05-2015. + */ + +/** + * Showdown Converter class + * @class + * @param {object} [converterOptions] + * @returns {Converter} + */ +showdown.Converter = function (converterOptions) { + 'use strict'; + + var + /** + * Options used by this converter + * @private + * @type {{}} + */ + options = {}, + + /** + * Language extensions used by this converter + * @private + * @type {Array} + */ + langExtensions = [], + + /** + * Output modifiers extensions used by this converter + * @private + * @type {Array} + */ + outputModifiers = [], + + /** + * Event listeners + * @private + * @type {{}} + */ + listeners = {}; + + _constructor(); + + /** + * Converter constructor + * @private + */ + function _constructor() { + converterOptions = converterOptions || {}; + + for (var gOpt in globalOptions) { + if (globalOptions.hasOwnProperty(gOpt)) { + options[gOpt] = globalOptions[gOpt]; + } + } + + // Merge options + if (typeof converterOptions === 'object') { + for (var opt in converterOptions) { + if (converterOptions.hasOwnProperty(opt)) { + options[opt] = converterOptions[opt]; + } + } + } else { + throw Error('Converter expects the passed parameter to be an object, but ' + typeof converterOptions + + ' was passed instead.'); + } + + if (options.extensions) { + showdown.helper.forEach(options.extensions, _parseExtension); + } + } + + /** + * Parse extension + * @param {*} ext + * @param {string} [name=''] + * @private + */ + function _parseExtension(ext, name) { + + name = name || null; + // If it's a string, the extension was previously loaded + if (showdown.helper.isString(ext)) { + ext = showdown.helper.stdExtName(ext); + name = ext; + + // LEGACY_SUPPORT CODE + if (showdown.extensions[ext]) { + console.warn('DEPRECATION WARNING: ' + ext + ' is an old extension that uses a deprecated loading method.' + + 'Please inform the developer that the extension should be updated!'); + legacyExtensionLoading(showdown.extensions[ext], ext); + return; + // END LEGACY SUPPORT CODE + + } else if (!showdown.helper.isUndefined(extensions[ext])) { + ext = extensions[ext]; + + } else { + throw Error('Extension "' + ext + '" could not be loaded. It was either not found or is not a valid extension.'); + } + } + + if (typeof ext === 'function') { + ext = ext(); + } + + if (!showdown.helper.isArray(ext)) { + ext = [ext]; + } + + var validExt = validate(ext, name); + if (!validExt.valid) { + throw Error(validExt.error); + } + + for (var i = 0; i < ext.length; ++i) { + switch (ext[i].type) { + + case 'lang': + langExtensions.push(ext[i]); + break; + + case 'output': + outputModifiers.push(ext[i]); + break; + } + if (ext[i].hasOwnProperty(listeners)) { + for (var ln in ext[i].listeners) { + if (ext[i].listeners.hasOwnProperty(ln)) { + listen(ln, ext[i].listeners[ln]); + } + } + } + } + + } + + /** + * LEGACY_SUPPORT + * @param {*} ext + * @param {string} name + */ + function legacyExtensionLoading(ext, name) { + if (typeof ext === 'function') { + ext = ext(new showdown.Converter()); + } + if (!showdown.helper.isArray(ext)) { + ext = [ext]; + } + var valid = validate(ext, name); + + if (!valid.valid) { + throw Error(valid.error); + } + + for (var i = 0; i < ext.length; ++i) { + switch (ext[i].type) { + case 'lang': + langExtensions.push(ext[i]); + break; + case 'output': + outputModifiers.push(ext[i]); + break; + default:// should never reach here + throw Error('Extension loader error: Type unrecognized!!!'); + } + } + } + + /** + * Listen to an event + * @param {string} name + * @param {function} callback + */ + function listen(name, callback) { + if (!showdown.helper.isString(name)) { + throw Error('Invalid argument in converter.listen() method: name must be a string, but ' + typeof name + ' given'); + } + + if (typeof callback !== 'function') { + throw Error('Invalid argument in converter.listen() method: callback must be a function, but ' + typeof callback + ' given'); + } + + if (!listeners.hasOwnProperty(name)) { + listeners[name] = []; + } + listeners[name].push(callback); + } + + function rTrimInputText(text) { + var rsp = text.match(/^\s*/)[0].length, + rgx = new RegExp('^\\s{0,' + rsp + '}', 'gm'); + return text.replace(rgx, ''); + } + + /** + * Dispatch an event + * @private + * @param {string} evtName Event name + * @param {string} text Text + * @param {{}} options Converter Options + * @param {{}} globals + * @returns {string} + */ + this._dispatch = function dispatch (evtName, text, options, globals) { + if (listeners.hasOwnProperty(evtName)) { + for (var ei = 0; ei < listeners[evtName].length; ++ei) { + var nText = listeners[evtName][ei](evtName, text, this, options, globals); + if (nText && typeof nText !== 'undefined') { + text = nText; + } + } + } + return text; + }; + + /** + * Listen to an event + * @param {string} name + * @param {function} callback + * @returns {showdown.Converter} + */ + this.listen = function (name, callback) { + listen(name, callback); + return this; + }; + + /** + * Converts a markdown string into HTML + * @param {string} text + * @returns {*} + */ + this.makeHtml = function (text) { + //check if text is not falsy + if (!text) { + return text; + } + + var globals = { + gHtmlBlocks: [], + gHtmlMdBlocks: [], + gHtmlSpans: [], + gUrls: {}, + gTitles: {}, + gDimensions: {}, + gListLevel: 0, + hashLinkCounts: {}, + langExtensions: langExtensions, + outputModifiers: outputModifiers, + converter: this, + ghCodeBlocks: [] + }; + + // attacklab: Replace ~ with ~T + // This lets us use tilde as an escape char to avoid md5 hashes + // The choice of character is arbitrary; anything that isn't + // magic in Markdown will work. + text = text.replace(/~/g, '~T'); + + // attacklab: Replace $ with ~D + // RegExp interprets $ as a special character + // when it's in a replacement string + text = text.replace(/\$/g, '~D'); + + // Standardize line endings + text = text.replace(/\r\n/g, '\n'); // DOS to Unix + text = text.replace(/\r/g, '\n'); // Mac to Unix + + if (options.smartIndentationFix) { + text = rTrimInputText(text); + } + + // Make sure text begins and ends with a couple of newlines: + //text = '\n\n' + text + '\n\n'; + text = text; + // detab + text = showdown.subParser('detab')(text, options, globals); + + // stripBlankLines + text = showdown.subParser('stripBlankLines')(text, options, globals); + + //run languageExtensions + showdown.helper.forEach(langExtensions, function (ext) { + text = showdown.subParser('runExtension')(ext, text, options, globals); + }); + + // run the sub parsers + text = showdown.subParser('hashPreCodeTags')(text, options, globals); + text = showdown.subParser('githubCodeBlocks')(text, options, globals); + text = showdown.subParser('hashHTMLBlocks')(text, options, globals); + text = showdown.subParser('hashHTMLSpans')(text, options, globals); + text = showdown.subParser('stripLinkDefinitions')(text, options, globals); + text = showdown.subParser('blockGamut')(text, options, globals); + text = showdown.subParser('unhashHTMLSpans')(text, options, globals); + text = showdown.subParser('unescapeSpecialChars')(text, options, globals); + + // attacklab: Restore dollar signs + text = text.replace(/~D/g, '$$'); + + // attacklab: Restore tildes + text = text.replace(/~T/g, '~'); + + // Run output modifiers + showdown.helper.forEach(outputModifiers, function (ext) { + text = showdown.subParser('runExtension')(ext, text, options, globals); + }); + return text; + }; + + /** + * Set an option of this Converter instance + * @param {string} key + * @param {*} value + */ + this.setOption = function (key, value) { + options[key] = value; + }; + + /** + * Get the option of this Converter instance + * @param {string} key + * @returns {*} + */ + this.getOption = function (key) { + return options[key]; + }; + + /** + * Get the options of this Converter instance + * @returns {{}} + */ + this.getOptions = function () { + return options; + }; + + /** + * Add extension to THIS converter + * @param {{}} extension + * @param {string} [name=null] + */ + this.addExtension = function (extension, name) { + name = name || null; + _parseExtension(extension, name); + }; + + /** + * Use a global registered extension with THIS converter + * @param {string} extensionName Name of the previously registered extension + */ + this.useExtension = function (extensionName) { + _parseExtension(extensionName); + }; + + /** + * Set the flavor THIS converter should use + * @param {string} name + */ + this.setFlavor = function (name) { + if (flavor.hasOwnProperty(name)) { + var preset = flavor[name]; + for (var option in preset) { + if (preset.hasOwnProperty(option)) { + options[option] = preset[option]; + } + } + } + }; + + /** + * Remove an extension from THIS converter. + * Note: This is a costly operation. It's better to initialize a new converter + * and specify the extensions you wish to use + * @param {Array} extension + */ + this.removeExtension = function (extension) { + if (!showdown.helper.isArray(extension)) { + extension = [extension]; + } + for (var a = 0; a < extension.length; ++a) { + var ext = extension[a]; + for (var i = 0; i < langExtensions.length; ++i) { + if (langExtensions[i] === ext) { + langExtensions[i].splice(i, 1); + } + } + for (var ii = 0; ii < outputModifiers.length; ++i) { + if (outputModifiers[ii] === ext) { + outputModifiers[ii].splice(i, 1); + } + } + } + }; + + /** + * Get all extension of THIS converter + * @returns {{language: Array, output: Array}} + */ + this.getAllExtensions = function () { + return { + language: langExtensions, + output: outputModifiers + }; + }; +}; + +/** + * Turn Markdown link shortcuts into XHTML tags. + */ +showdown.subParser('anchors', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('anchors.before', text, options, globals); + + var writeAnchorTag = function (wholeMatch, m1, m2, m3, m4, m5, m6, m7) { + if (showdown.helper.isUndefined(m7)) { + m7 = ''; + } + wholeMatch = m1; + var linkText = m2, + linkId = m3.toLowerCase(), + url = m4, + title = m7; + + if (!url) { + if (!linkId) { + // lower-case and turn embedded newlines into spaces + linkId = linkText.toLowerCase().replace(/ ?\n/g, ' '); + } + url = '#' + linkId; + + if (!showdown.helper.isUndefined(globals.gUrls[linkId])) { + url = globals.gUrls[linkId]; + if (!showdown.helper.isUndefined(globals.gTitles[linkId])) { + title = globals.gTitles[linkId]; + } + } else { + if (wholeMatch.search(/\(\s*\)$/m) > -1) { + // Special case for explicit empty url + url = ''; + } else { + return wholeMatch; + } + } + } + + url = showdown.helper.escapeCharacters(url, '*_', false); + var result = ''; + + return result; + }; + + // First, handle reference-style links: [link text] [id] + /* + text = text.replace(/ + ( // wrap whole match in $1 + \[ + ( + (?: + \[[^\]]*\] // allow brackets nested one level + | + [^\[] // or anything else + )* + ) + \] + + [ ]? // one optional space + (?:\n[ ]*)? // one optional newline followed by spaces + + \[ + (.*?) // id = $3 + \] + )()()()() // pad remaining backreferences + /g,_DoAnchors_callback); + */ + text = text.replace(/(\[((?:\[[^\]]*]|[^\[\]])*)][ ]?(?:\n[ ]*)?\[(.*?)])()()()()/g, writeAnchorTag); + + // + // Next, inline-style links: [link text](url "optional title") + // + + /* + text = text.replace(/ + ( // wrap whole match in $1 + \[ + ( + (?: + \[[^\]]*\] // allow brackets nested one level + | + [^\[\]] // or anything else + ) + ) + \] + \( // literal paren + [ \t]* + () // no id, so leave $3 empty + ? // href = $4 + [ \t]* + ( // $5 + (['"]) // quote char = $6 + (.*?) // Title = $7 + \6 // matching quote + [ \t]* // ignore any spaces/tabs between closing quote and ) + )? // title is optional + \) + ) + /g,writeAnchorTag); + */ + text = text.replace(/(\[((?:\[[^\]]*]|[^\[\]])*)]\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g, + writeAnchorTag); + + // + // Last, handle reference-style shortcuts: [link text] + // These must come last in case you've also got [link test][1] + // or [link test](/foo) + // + + /* + text = text.replace(/ + ( // wrap whole match in $1 + \[ + ([^\[\]]+) // link text = $2; can't contain '[' or ']' + \] + )()()()()() // pad rest of backreferences + /g, writeAnchorTag); + */ + text = text.replace(/(\[([^\[\]]+)])()()()()()/g, writeAnchorTag); + + text = globals.converter._dispatch('anchors.after', text, options, globals); + return text; +}); + +showdown.subParser('autoLinks', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('autoLinks.before', text, options, globals); + + var simpleURLRegex = /\b(((https?|ftp|dict):\/\/|www\.)[^'">\s]+\.[^'">\s]+)(?=\s|$)(?!["<>])/gi, + delimUrlRegex = /<(((https?|ftp|dict):\/\/|www\.)[^'">\s]+)>/gi, + simpleMailRegex = /(?:^|[ \n\t])([A-Za-z0-9!#$%&'*+-/=?^_`\{|}~\.]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)(?:$|[ \n\t])/gi, + delimMailRegex = /<(?:mailto:)?([-.\w]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi; + + text = text.replace(delimUrlRegex, replaceLink); + text = text.replace(delimMailRegex, replaceMail); + // simpleURLRegex = /\b(((https?|ftp|dict):\/\/|www\.)[-.+~:?#@!$&'()*,;=[\]\w]+)\b/gi, + // Email addresses: + + if (options.simplifiedAutoLink) { + text = text.replace(simpleURLRegex, replaceLink); + text = text.replace(simpleMailRegex, replaceMail); + } + + function replaceLink(wm, link) { + var lnkTxt = link; + if (/^www\./i.test(link)) { + link = link.replace(/^www\./i, 'http://www.'); + } + return '' + lnkTxt + ''; + } + + function replaceMail(wholeMatch, m1) { + var unescapedStr = showdown.subParser('unescapeSpecialChars')(m1); + return showdown.subParser('encodeEmailAddress')(unescapedStr); + } + + text = globals.converter._dispatch('autoLinks.after', text, options, globals); + + return text; +}); + +/** + * These are all the transformations that form block-level + * tags like paragraphs, headers, and list items. + */ +showdown.subParser('blockGamut', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('blockGamut.before', text, options, globals); + + // we parse blockquotes first so that we can have headings and hrs + // inside blockquotes + text = showdown.subParser('blockQuotes')(text, options, globals); + text = showdown.subParser('headers')(text, options, globals); + + // Do Horizontal Rules: + var key = showdown.subParser('hashBlock')('
', options, globals); + text = text.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm, key); + text = text.replace(/^[ ]{0,2}([ ]?\-[ ]?){3,}[ \t]*$/gm, key); + text = text.replace(/^[ ]{0,2}([ ]?_[ ]?){3,}[ \t]*$/gm, key); + + text = showdown.subParser('lists')(text, options, globals); + text = showdown.subParser('codeBlocks')(text, options, globals); + text = showdown.subParser('tables')(text, options, globals); + + // We already ran _HashHTMLBlocks() before, in Markdown(), but that + // was to escape raw HTML in the original Markdown source. This time, + // we're escaping the markup we've just created, so that we don't wrap + //

tags around block-level tags. + text = showdown.subParser('hashHTMLBlocks')(text, options, globals); + text = showdown.subParser('paragraphs')(text, options, globals); + + text = globals.converter._dispatch('blockGamut.after', text, options, globals); + + return text; +}); + +showdown.subParser('blockQuotes', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('blockQuotes.before', text, options, globals); + /* + text = text.replace(/ + ( // Wrap whole match in $1 + ( + ^[ \t]*>[ \t]? // '>' at the start of a line + .+\n // rest of the first line + (.+\n)* // subsequent consecutive lines + \n* // blanks + )+ + ) + /gm, function(){...}); + */ + + text = text.replace(/((^[ \t]{0,3}>[ \t]?.+\n(.+\n)*\n*)+)/gm, function (wholeMatch, m1) { + var bq = m1; + + // attacklab: hack around Konqueror 3.5.4 bug: + // "----------bug".replace(/^-/g,"") == "bug" + bq = bq.replace(/^[ \t]*>[ \t]?/gm, '~0'); // trim one level of quoting + + // attacklab: clean up hack + bq = bq.replace(/~0/g, ''); + + bq = bq.replace(/^[ \t]+$/gm, ''); // trim whitespace-only lines + bq = showdown.subParser('githubCodeBlocks')(bq, options, globals); + bq = showdown.subParser('blockGamut')(bq, options, globals); // recurse + + bq = bq.replace(/(^|\n)/g, '$1 '); + // These leading spaces screw with

 content, so we need to fix that:
+    bq = bq.replace(/(\s*
[^\r]+?<\/pre>)/gm, function (wholeMatch, m1) {
+      var pre = m1;
+      // attacklab: hack around Konqueror 3.5.4 bug:
+      pre = pre.replace(/^  /mg, '~0');
+      pre = pre.replace(/~0/g, '');
+      return pre;
+    });
+
+    return showdown.subParser('hashBlock')('
\n' + bq + '\n
', options, globals); + }); + + text = globals.converter._dispatch('blockQuotes.after', text, options, globals); + return text; +}); + +/** + * Process Markdown `
` blocks.
+ */
+showdown.subParser('codeBlocks', function (text, options, globals) {
+  'use strict';
+
+  text = globals.converter._dispatch('codeBlocks.before', text, options, globals);
+  /*
+   text = text.replace(text,
+   /(?:\n\n|^)
+   (								// $1 = the code block -- one or more lines, starting with a space/tab
+   (?:
+   (?:[ ]{4}|\t)			// Lines must start with a tab or a tab-width of spaces - attacklab: g_tab_width
+   .*\n+
+   )+
+   )
+   (\n*[ ]{0,3}[^ \t\n]|(?=~0))	// attacklab: g_tab_width
+   /g,function(){...});
+   */
+
+  // attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug
+  text += '~0';
+
+  var pattern = /(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g;
+  text = text.replace(pattern, function (wholeMatch, m1, m2) {
+    var codeblock = m1,
+        nextChar = m2,
+        end = '\n';
+
+    codeblock = showdown.subParser('outdent')(codeblock);
+    codeblock = showdown.subParser('encodeCode')(codeblock);
+    codeblock = showdown.subParser('detab')(codeblock);
+    codeblock = codeblock.replace(/^\n+/g, ''); // trim leading newlines
+    codeblock = codeblock.replace(/\n+$/g, ''); // trim trailing newlines
+
+    if (options.omitExtraWLInCodeBlocks) {
+      end = '';
+    }
+
+    codeblock = '
' + codeblock + end + '
'; + + return showdown.subParser('hashBlock')(codeblock, options, globals) + nextChar; + }); + + // attacklab: strip sentinel + text = text.replace(/~0/, ''); + + text = globals.converter._dispatch('codeBlocks.after', text, options, globals); + return text; +}); + +/** + * + * * Backtick quotes are used for spans. + * + * * You can use multiple backticks as the delimiters if you want to + * include literal backticks in the code span. So, this input: + * + * Just type ``foo `bar` baz`` at the prompt. + * + * Will translate to: + * + *

Just type foo `bar` baz at the prompt.

+ * + * There's no arbitrary limit to the number of backticks you + * can use as delimters. If you need three consecutive backticks + * in your code, use four for delimiters, etc. + * + * * You can use spaces to get literal backticks at the edges: + * + * ... type `` `bar` `` ... + * + * Turns to: + * + * ... type `bar` ... + */ +showdown.subParser('codeSpans', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('codeSpans.before', text, options, globals); + + /* + text = text.replace(/ + (^|[^\\]) // Character before opening ` can't be a backslash + (`+) // $2 = Opening run of ` + ( // $3 = The code block + [^\r]*? + [^`] // attacklab: work around lack of lookbehind + ) + \2 // Matching closer + (?!`) + /gm, function(){...}); + */ + + if (typeof(text) === 'undefined') { + text = ''; + } + text = text.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm, + function (wholeMatch, m1, m2, m3) { + var c = m3; + c = c.replace(/^([ \t]*)/g, ''); // leading whitespace + c = c.replace(/[ \t]*$/g, ''); // trailing whitespace + c = showdown.subParser('encodeCode')(c); + return m1 + '' + c + ''; + } + ); + + text = globals.converter._dispatch('codeSpans.after', text, options, globals); + return text; +}); + +/** + * Convert all tabs to spaces + */ +showdown.subParser('detab', function (text) { + 'use strict'; + + // expand first n-1 tabs + text = text.replace(/\t(?=\t)/g, ' '); // g_tab_width + + // replace the nth with two sentinels + text = text.replace(/\t/g, '~A~B'); + + // use the sentinel to anchor our regex so it doesn't explode + text = text.replace(/~B(.+?)~A/g, function (wholeMatch, m1) { + var leadingText = m1, + numSpaces = 4 - leadingText.length % 4; // g_tab_width + + // there *must* be a better way to do this: + for (var i = 0; i < numSpaces; i++) { + leadingText += ' '; + } + + return leadingText; + }); + + // clean up sentinels + text = text.replace(/~A/g, ' '); // g_tab_width + text = text.replace(/~B/g, ''); + + return text; + +}); + +/** + * Smart processing for ampersands and angle brackets that need to be encoded. + */ +showdown.subParser('encodeAmpsAndAngles', function (text) { + 'use strict'; + // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin: + // http://bumppo.net/projects/amputator/ + text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g, '&'); + + // Encode naked <'s + text = text.replace(/<(?![a-z\/?\$!])/gi, '<'); + + return text; +}); + +/** + * Returns the string, with after processing the following backslash escape sequences. + * + * attacklab: The polite way to do this is with the new escapeCharacters() function: + * + * text = escapeCharacters(text,"\\",true); + * text = escapeCharacters(text,"`*_{}[]()>#+-.!",true); + * + * ...but we're sidestepping its use of the (slow) RegExp constructor + * as an optimization for Firefox. This function gets called a LOT. + */ +showdown.subParser('encodeBackslashEscapes', function (text) { + 'use strict'; + text = text.replace(/\\(\\)/g, showdown.helper.escapeCharactersCallback); + text = text.replace(/\\([`*_{}\[\]()>#+-.!])/g, showdown.helper.escapeCharactersCallback); + return text; +}); + +/** + * Encode/escape certain characters inside Markdown code runs. + * The point is that in code, these characters are literals, + * and lose their special Markdown meanings. + */ +showdown.subParser('encodeCode', function (text) { + 'use strict'; + + // Encode all ampersands; HTML entities are not + // entities within a Markdown code span. + text = text.replace(/&/g, '&'); + + // Do the angle bracket song and dance: + text = text.replace(//g, '>'); + + // Now, escape characters that are magic in Markdown: + text = showdown.helper.escapeCharacters(text, '*_{}[]\\', false); + + // jj the line above breaks this: + //--- + //* Item + // 1. Subitem + // special char: * + // --- + + return text; +}); + +/** + * Input: an email address, e.g. "foo@example.com" + * + * Output: the email address as a mailto link, with each character + * of the address encoded as either a decimal or hex entity, in + * the hopes of foiling most address harvesting spam bots. E.g.: + * + * foo + * @example.com + * + * Based on a filter by Matthew Wickline, posted to the BBEdit-Talk + * mailing list: + * + */ +showdown.subParser('encodeEmailAddress', function (addr) { + 'use strict'; + + var encode = [ + function (ch) { + return '&#' + ch.charCodeAt(0) + ';'; + }, + function (ch) { + return '&#x' + ch.charCodeAt(0).toString(16) + ';'; + }, + function (ch) { + return ch; + } + ]; + + addr = 'mailto:' + addr; + + addr = addr.replace(/./g, function (ch) { + if (ch === '@') { + // this *must* be encoded. I insist. + ch = encode[Math.floor(Math.random() * 2)](ch); + } else if (ch !== ':') { + // leave ':' alone (to spot mailto: later) + var r = Math.random(); + // roughly 10% raw, 45% hex, 45% dec + ch = ( + r > 0.9 ? encode[2](ch) : r > 0.45 ? encode[1](ch) : encode[0](ch) + ); + } + return ch; + }); + + addr = '' + addr + ''; + addr = addr.replace(/">.+:/g, '">'); // strip the mailto: from the visible part + + return addr; +}); + +/** + * Within tags -- meaning between < and > -- encode [\ ` * _] so they + * don't conflict with their use in Markdown for code, italics and strong. + */ +showdown.subParser('escapeSpecialCharsWithinTagAttributes', function (text) { + 'use strict'; + + // Build a regex to find HTML tags and comments. See Friedl's + // "Mastering Regular Expressions", 2nd Ed., pp. 200-201. + var regex = /(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|)/gi; + + text = text.replace(regex, function (wholeMatch) { + var tag = wholeMatch.replace(/(.)<\/?code>(?=.)/g, '$1`'); + tag = showdown.helper.escapeCharacters(tag, '\\`*_', false); + return tag; + }); + + return text; +}); + +/** + * Handle github codeblocks prior to running HashHTML so that + * HTML contained within the codeblock gets escaped properly + * Example: + * ```ruby + * def hello_world(x) + * puts "Hello, #{x}" + * end + * ``` + */ +showdown.subParser('githubCodeBlocks', function (text, options, globals) { + 'use strict'; + + // early exit if option is not enabled + if (!options.ghCodeBlocks) { + return text; + } + + text = globals.converter._dispatch('githubCodeBlocks.before', text, options, globals); + + text += '~0'; + + text = text.replace(/(?:^|\n)```(.*)\n([\s\S]*?)\n```/g, function (wholeMatch, language, codeblock) { + var end = (options.omitExtraWLInCodeBlocks) ? '' : '\n'; + + // First parse the github code block + codeblock = showdown.subParser('encodeCode')(codeblock); + codeblock = showdown.subParser('detab')(codeblock); + codeblock = codeblock.replace(/^\n+/g, ''); // trim leading newlines + codeblock = codeblock.replace(/\n+$/g, ''); // trim trailing whitespace + + codeblock = '
' + codeblock + end + '
'; + + codeblock = showdown.subParser('hashBlock')(codeblock, options, globals); + + // Since GHCodeblocks can be false positives, we need to + // store the primitive text and the parsed text in a global var, + // and then return a token + return '\n\n~G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\n\n'; + }); + + // attacklab: strip sentinel + text = text.replace(/~0/, ''); + + return globals.converter._dispatch('githubCodeBlocks.after', text, options, globals); +}); + +showdown.subParser('hashBlock', function (text, options, globals) { + 'use strict'; + text = text.replace(/(^\n+|\n+$)/g, ''); + return '\n\n~K' + (globals.gHtmlBlocks.push(text) - 1) + 'K\n\n'; +}); + +showdown.subParser('hashElement', function (text, options, globals) { + 'use strict'; + + return function (wholeMatch, m1) { + var blockText = m1; + + // Undo double lines + blockText = blockText.replace(/\n\n/g, '\n'); + blockText = blockText.replace(/^\n/, ''); + + // strip trailing blank lines + blockText = blockText.replace(/\n+$/g, ''); + + // Replace the element text with a marker ("~KxK" where x is its key) + blockText = '\n\n~K' + (globals.gHtmlBlocks.push(blockText) - 1) + 'K\n\n'; + + return blockText; + }; +}); + +showdown.subParser('hashHTMLBlocks', function (text, options, globals) { + 'use strict'; + + var blockTags = [ + 'pre', + 'div', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'blockquote', + 'table', + 'dl', + 'ol', + 'ul', + 'script', + 'noscript', + 'form', + 'fieldset', + 'iframe', + 'math', + 'style', + 'section', + 'header', + 'footer', + 'nav', + 'article', + 'aside', + 'address', + 'audio', + 'canvas', + 'figure', + 'hgroup', + 'output', + 'video', + 'p' + ], + repFunc = function (wholeMatch, match, left, right) { + var txt = wholeMatch; + // check if this html element is marked as markdown + // if so, it's contents should be parsed as markdown + if (left.search(/\bmarkdown\b/) !== -1) { + txt = left + globals.converter.makeHtml(match) + right; + } + return '\n\n~K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\n\n'; + }; + + for (var i = 0; i < blockTags.length; ++i) { + text = showdown.helper.replaceRecursiveRegExp(text, repFunc, '^(?: |\\t){0,3}<' + blockTags[i] + '\\b[^>]*>', '', 'gim'); + } + + // HR SPECIAL CASE + text = text.replace(/(\n[ ]{0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g, + showdown.subParser('hashElement')(text, options, globals)); + + // Special case for standalone HTML comments: + text = text.replace(/()/g, + showdown.subParser('hashElement')(text, options, globals)); + + // PHP and ASP-style processor instructions ( and <%...%>) + text = text.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g, + showdown.subParser('hashElement')(text, options, globals)); + return text; +}); + +/** + * Hash span elements that should not be parsed as markdown + */ +showdown.subParser('hashHTMLSpans', function (text, config, globals) { + 'use strict'; + + var matches = showdown.helper.matchRecursiveRegExp(text, ']*>', '', 'gi'); + + for (var i = 0; i < matches.length; ++i) { + text = text.replace(matches[i][0], '~L' + (globals.gHtmlSpans.push(matches[i][0]) - 1) + 'L'); + } + return text; +}); + +/** + * Unhash HTML spans + */ +showdown.subParser('unhashHTMLSpans', function (text, config, globals) { + 'use strict'; + + for (var i = 0; i < globals.gHtmlSpans.length; ++i) { + text = text.replace('~L' + i + 'L', globals.gHtmlSpans[i]); + } + + return text; +}); + +/** + * Hash span elements that should not be parsed as markdown + */ +showdown.subParser('hashPreCodeTags', function (text, config, globals) { + 'use strict'; + + var repFunc = function (wholeMatch, match, left, right) { + // encode html entities + var codeblock = left + showdown.subParser('encodeCode')(match) + right; + return '\n\n~G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\n\n'; + }; + + text = showdown.helper.replaceRecursiveRegExp(text, repFunc, '^(?: |\\t){0,3}]*>\\s*]*>', '^(?: |\\t){0,3}\\s*
', 'gim'); + return text; +}); + +showdown.subParser('headers', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('headers.before', text, options, globals); + + var prefixHeader = options.prefixHeaderId, + headerLevelStart = (isNaN(parseInt(options.headerLevelStart))) ? 1 : parseInt(options.headerLevelStart), + + // Set text-style headers: + // Header 1 + // ======== + // + // Header 2 + // -------- + // + setextRegexH1 = (options.smoothLivePreview) ? /^(.+)[ \t]*\n={2,}[ \t]*\n+/gm : /^(.+)[ \t]*\n=+[ \t]*\n+/gm, + setextRegexH2 = (options.smoothLivePreview) ? /^(.+)[ \t]*\n-{2,}[ \t]*\n+/gm : /^(.+)[ \t]*\n-+[ \t]*\n+/gm; + + text = text.replace(setextRegexH1, function (wholeMatch, m1) { + + var spanGamut = showdown.subParser('spanGamut')(m1, options, globals), + hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"', + hLevel = headerLevelStart, + hashBlock = '' + spanGamut + ''; + return showdown.subParser('hashBlock')(hashBlock, options, globals); + }); + + text = text.replace(setextRegexH2, function (matchFound, m1) { + var spanGamut = showdown.subParser('spanGamut')(m1, options, globals), + hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"', + hLevel = headerLevelStart + 1, + hashBlock = '' + spanGamut + ''; + return showdown.subParser('hashBlock')(hashBlock, options, globals); + }); + + // atx-style headers: + // # Header 1 + // ## Header 2 + // ## Header 2 with closing hashes ## + // ... + // ###### Header 6 + // + text = text.replace(/^(#{1,6})[ \t]*(.+?)[ \t]*#*\n+/gm, function (wholeMatch, m1, m2) { + var span = showdown.subParser('spanGamut')(m2, options, globals), + hID = (options.noHeaderId) ? '' : ' id="' + headerId(m2) + '"', + hLevel = headerLevelStart - 1 + m1.length, + header = '' + span + ''; + + return showdown.subParser('hashBlock')(header, options, globals); + }); + + function headerId(m) { + var title, escapedId = m.replace(/[^\w]/g, '').toLowerCase(); + + if (globals.hashLinkCounts[escapedId]) { + title = escapedId + '-' + (globals.hashLinkCounts[escapedId]++); + } else { + title = escapedId; + globals.hashLinkCounts[escapedId] = 1; + } + + // Prefix id to prevent causing inadvertent pre-existing style matches. + if (prefixHeader === true) { + prefixHeader = 'section'; + } + + if (showdown.helper.isString(prefixHeader)) { + return prefixHeader + title; + } + return title; + } + + text = globals.converter._dispatch('headers.after', text, options, globals); + return text; +}); + +/** + * Turn Markdown image shortcuts into tags. + */ +showdown.subParser('images', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('images.before', text, options, globals); + + var inlineRegExp = /!\[(.*?)]\s?\([ \t]*()?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(['"])(.*?)\6[ \t]*)?\)/g, + referenceRegExp = /!\[([^\]]*?)] ?(?:\n *)?\[(.*?)]()()()()()/g; + + function writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title) { + + var gUrls = globals.gUrls, + gTitles = globals.gTitles, + gDims = globals.gDimensions; + + linkId = linkId.toLowerCase(); + + if (!title) { + title = ''; + } + + if (url === '' || url === null) { + if (linkId === '' || linkId === null) { + // lower-case and turn embedded newlines into spaces + linkId = altText.toLowerCase().replace(/ ?\n/g, ' '); + } + url = '#' + linkId; + + if (!showdown.helper.isUndefined(gUrls[linkId])) { + url = gUrls[linkId]; + if (!showdown.helper.isUndefined(gTitles[linkId])) { + title = gTitles[linkId]; + } + if (!showdown.helper.isUndefined(gDims[linkId])) { + width = gDims[linkId].width; + height = gDims[linkId].height; + } + } else { + return wholeMatch; + } + } + + altText = altText.replace(/"/g, '"'); + altText = showdown.helper.escapeCharacters(altText, '*_', false); + url = showdown.helper.escapeCharacters(url, '*_', false); + var result = '' + altText + 'x "optional title") + text = text.replace(inlineRegExp, writeImageTag); + + text = globals.converter._dispatch('images.after', text, options, globals); + return text; +}); + +showdown.subParser('italicsAndBold', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('italicsAndBold.before', text, options, globals); + + if (options.literalMidWordUnderscores) { + //underscores + // Since we are consuming a \s character, we need to add it + text = text.replace(/(^|\s|>|\b)__(?=\S)([\s\S]+?)__(?=\b|<|\s|$)/gm, '$1$2'); + text = text.replace(/(^|\s|>|\b)_(?=\S)([\s\S]+?)_(?=\b|<|\s|$)/gm, '$1$2'); + //asterisks + text = text.replace(/(\*\*)(?=\S)([^\r]*?\S[*]*)\1/g, '$2'); + text = text.replace(/(\*)(?=\S)([^\r]*?\S)\1/g, '$2'); + + } else { + // must go first: + text = text.replace(/(\*\*|__)(?=\S)([^\r]*?\S[*_]*)\1/g, '$2'); + text = text.replace(/(\*|_)(?=\S)([^\r]*?\S)\1/g, '$2'); + } + + text = globals.converter._dispatch('italicsAndBold.after', text, options, globals); + return text; +}); + +/** + * Form HTML ordered (numbered) and unordered (bulleted) lists. + */ +showdown.subParser('lists', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('lists.before', text, options, globals); + /** + * Process the contents of a single ordered or unordered list, splitting it + * into individual list items. + * @param {string} listStr + * @param {boolean} trimTrailing + * @returns {string} + */ + function processListItems (listStr, trimTrailing) { + // The $g_list_level global keeps track of when we're inside a list. + // Each time we enter a list, we increment it; when we leave a list, + // we decrement. If it's zero, we're not in a list anymore. + // + // We do this because when we're not inside a list, we want to treat + // something like this: + // + // I recommend upgrading to version + // 8. Oops, now this line is treated + // as a sub-list. + // + // As a single paragraph, despite the fact that the second line starts + // with a digit-period-space sequence. + // + // Whereas when we're inside a list (or sub-list), that line will be + // treated as the start of a sub-list. What a kludge, huh? This is + // an aspect of Markdown's syntax that's hard to parse perfectly + // without resorting to mind-reading. Perhaps the solution is to + // change the syntax rules such that sub-lists must start with a + // starting cardinal number; e.g. "1." or "a.". + globals.gListLevel++; + + // trim trailing blank lines: + listStr = listStr.replace(/\n{2,}$/, '\n'); + + // attacklab: add sentinel to emulate \z + listStr += '~0'; + + var rgx = /(\n)?(^[ \t]*)([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(~0|\2([*+-]|\d+[.])[ \t]+))/gm, + isParagraphed = (/\n[ \t]*\n(?!~0)/.test(listStr)); + + listStr = listStr.replace(rgx, function (wholeMatch, m1, m2, m3, m4, taskbtn, checked) { + checked = (checked && checked.trim() !== ''); + var item = showdown.subParser('outdent')(m4, options, globals), + bulletStyle = ''; + + // Support for github tasklists + if (taskbtn && options.tasklists) { + bulletStyle = ' class="task-list-item" style="list-style-type: none;"'; + item = item.replace(/^[ \t]*\[(x|X| )?]/m, function () { + var otp = ' -1)) { + item = showdown.subParser('githubCodeBlocks')(item, options, globals); + item = showdown.subParser('blockGamut')(item, options, globals); + } else { + // Recursion for sub-lists: + item = showdown.subParser('lists')(item, options, globals); + item = item.replace(/\n$/, ''); // chomp(item) + if (isParagraphed) { + item = showdown.subParser('paragraphs')(item, options, globals); + } else { + item = showdown.subParser('spanGamut')(item, options, globals); + } + } + item = '\n' + item + '\n'; + return item; + }); + + // attacklab: strip sentinel + listStr = listStr.replace(/~0/g, ''); + + globals.gListLevel--; + + if (trimTrailing) { + listStr = listStr.replace(/\s+$/, ''); + } + + return listStr; + } + + /** + * Check and parse consecutive lists (better fix for issue #142) + * @param {string} list + * @param {string} listType + * @param {boolean} trimTrailing + * @returns {string} + */ + function parseConsecutiveLists(list, listType, trimTrailing) { + // check if we caught 2 or more consecutive lists by mistake + // we use the counterRgx, meaning if listType is UL we look for UL and vice versa + var counterRxg = (listType === 'ul') ? /^ {0,2}\d+\.[ \t]/gm : /^ {0,2}[*+-][ \t]/gm, + subLists = [], + result = ''; + + if (list.search(counterRxg) !== -1) { + (function parseCL(txt) { + var pos = txt.search(counterRxg); + if (pos !== -1) { + // slice + result += '\n\n<' + listType + '>' + processListItems(txt.slice(0, pos), !!trimTrailing) + '\n\n'; + + // invert counterType and listType + listType = (listType === 'ul') ? 'ol' : 'ul'; + counterRxg = (listType === 'ul') ? /^ {0,2}\d+\.[ \t]/gm : /^ {0,2}[*+-][ \t]/gm; + + //recurse + parseCL(txt.slice(pos)); + } else { + result += '\n\n<' + listType + '>' + processListItems(txt, !!trimTrailing) + '\n\n'; + } + })(list); + for (var i = 0; i < subLists.length; ++i) { + + } + } else { + result = '\n\n<' + listType + '>' + processListItems(list, !!trimTrailing) + '\n\n'; + } + + return result; + } + + // attacklab: add sentinel to hack around khtml/safari bug: + // http://bugs.webkit.org/show_bug.cgi?id=11231 + text += '~0'; + + // Re-usable pattern to match any entire ul or ol list: + var wholeList = /^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm; + + if (globals.gListLevel) { + text = text.replace(wholeList, function (wholeMatch, list, m2) { + var listType = (m2.search(/[*+-]/g) > -1) ? 'ul' : 'ol'; + return parseConsecutiveLists(list, listType, true); + }); + } else { + wholeList = /(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm; + //wholeList = /(\n\n|^\n?)( {0,3}([*+-]|\d+\.)[ \t]+[\s\S]+?)(?=(~0)|(\n\n(?!\t| {2,}| {0,3}([*+-]|\d+\.)[ \t])))/g; + text = text.replace(wholeList, function (wholeMatch, m1, list, m3) { + + var listType = (m3.search(/[*+-]/g) > -1) ? 'ul' : 'ol'; + return parseConsecutiveLists(list, listType); + }); + } + + // attacklab: strip sentinel + text = text.replace(/~0/, ''); + + text = globals.converter._dispatch('lists.after', text, options, globals); + return text; +}); + +/** + * Remove one level of line-leading tabs or spaces + */ +showdown.subParser('outdent', function (text) { + 'use strict'; + + // attacklab: hack around Konqueror 3.5.4 bug: + // "----------bug".replace(/^-/g,"") == "bug" + text = text.replace(/^(\t|[ ]{1,4})/gm, '~0'); // attacklab: g_tab_width + + // attacklab: clean up hack + text = text.replace(/~0/g, ''); + + return text; +}); + +/** + * + */ +showdown.subParser('paragraphs', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('paragraphs.before', text, options, globals); + // Strip leading and trailing lines: + text = text.replace(/^\n+/g, ''); + text = text.replace(/\n+$/g, ''); + + var grafs = text.split(/\n{2,}/g), + grafsOut = [], + end = grafs.length; // Wrap

tags + + for (var i = 0; i < end; i++) { + var str = grafs[i]; + // if this is an HTML marker, copy it + if (str.search(/~(K|G)(\d+)\1/g) >= 0) { + grafsOut.push(str); + } else { + str = showdown.subParser('spanGamut')(str, options, globals); + str = str.replace(/^([ \t]*)/g, '

'); + str += '

'; + grafsOut.push(str); + } + } + + /** Unhashify HTML blocks */ + end = grafsOut.length; + for (i = 0; i < end; i++) { + var blockText = '', + grafsOutIt = grafsOut[i], + codeFlag = false; + // if this is a marker for an html block... + while (grafsOutIt.search(/~(K|G)(\d+)\1/) >= 0) { + var delim = RegExp.$1, + num = RegExp.$2; + + if (delim === 'K') { + blockText = globals.gHtmlBlocks[num]; + } else { + // we need to check if ghBlock is a false positive + if (codeFlag) { + // use encoded version of all text + blockText = showdown.subParser('encodeCode')(globals.ghCodeBlocks[num].text); + } else { + blockText = globals.ghCodeBlocks[num].codeblock; + } + } + blockText = blockText.replace(/\$/g, '$$$$'); // Escape any dollar signs + + grafsOutIt = grafsOutIt.replace(/(\n\n)?~(K|G)\d+\2(\n\n)?/, blockText); + // Check if grafsOutIt is a pre->code + if (/^]*>\s*]*>/.test(grafsOutIt)) { + codeFlag = true; + } + } + grafsOut[i] = grafsOutIt; + } + text = grafsOut.join('\n\n'); + // Strip leading and trailing lines: + text = text.replace(/^\n+/g, ''); + text = text.replace(/\n+$/g, ''); + return globals.converter._dispatch('paragraphs.after', text, options, globals); +}); + +/** + * Run extension + */ +showdown.subParser('runExtension', function (ext, text, options, globals) { + 'use strict'; + + if (ext.filter) { + text = ext.filter(text, globals.converter, options); + + } else if (ext.regex) { + // TODO remove this when old extension loading mechanism is deprecated + var re = ext.regex; + if (!re instanceof RegExp) { + re = new RegExp(re, 'g'); + } + text = text.replace(re, ext.replace); + } + + return text; +}); + +/** + * These are all the transformations that occur *within* block-level + * tags like paragraphs, headers, and list items. + */ +showdown.subParser('spanGamut', function (text, options, globals) { + 'use strict'; + + text = globals.converter._dispatch('spanGamut.before', text, options, globals); + text = showdown.subParser('codeSpans')(text, options, globals); + text = showdown.subParser('escapeSpecialCharsWithinTagAttributes')(text, options, globals); + text = showdown.subParser('encodeBackslashEscapes')(text, options, globals); + + // Process anchor and image tags. Images must come first, + // because ![foo][f] looks like an anchor. + text = showdown.subParser('images')(text, options, globals); + text = showdown.subParser('anchors')(text, options, globals); + + // Make links out of things like `` + // Must come after _DoAnchors(), because you can use < and > + // delimiters in inline links like [this](). + text = showdown.subParser('autoLinks')(text, options, globals); + text = showdown.subParser('encodeAmpsAndAngles')(text, options, globals); + text = showdown.subParser('italicsAndBold')(text, options, globals); + text = showdown.subParser('strikethrough')(text, options, globals); + + // Do hard breaks: + text = text.replace(/ +\n/g, '
\n'); + + text = globals.converter._dispatch('spanGamut.after', text, options, globals); + return text; +}); + +showdown.subParser('strikethrough', function (text, options, globals) { + 'use strict'; + + if (options.strikethrough) { + text = globals.converter._dispatch('strikethrough.before', text, options, globals); + text = text.replace(/(?:~T){2}([\s\S]+?)(?:~T){2}/g, '$1'); + text = globals.converter._dispatch('strikethrough.after', text, options, globals); + } + + return text; +}); + +/** + * Strip any lines consisting only of spaces and tabs. + * This makes subsequent regexs easier to write, because we can + * match consecutive blank lines with /\n+/ instead of something + * contorted like /[ \t]*\n+/ + */ +showdown.subParser('stripBlankLines', function (text) { + 'use strict'; + return text.replace(/^[ \t]+$/mg, ''); +}); + +/** + * Strips link definitions from text, stores the URLs and titles in + * hash references. + * Link defs are in the form: ^[id]: url "optional title" + * + * ^[ ]{0,3}\[(.+)\]: // id = $1 attacklab: g_tab_width - 1 + * [ \t]* + * \n? // maybe *one* newline + * [ \t]* + * ? // url = $2 + * [ \t]* + * \n? // maybe one newline + * [ \t]* + * (?: + * (\n*) // any lines skipped = $3 attacklab: lookbehind removed + * ["(] + * (.+?) // title = $4 + * [")] + * [ \t]* + * )? // title is optional + * (?:\n+|$) + * /gm, + * function(){...}); + * + */ +showdown.subParser('stripLinkDefinitions', function (text, options, globals) { + 'use strict'; + + var regex = /^ {0,3}\[(.+)]:[ \t]*\n?[ \t]*?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n+|(?=~0))/gm; + + // attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug + text += '~0'; + + text = text.replace(regex, function (wholeMatch, linkId, url, width, height, blankLines, title) { + linkId = linkId.toLowerCase(); + globals.gUrls[linkId] = showdown.subParser('encodeAmpsAndAngles')(url); // Link IDs are case-insensitive + + if (blankLines) { + // Oops, found blank lines, so it's not a title. + // Put back the parenthetical statement we stole. + return blankLines + title; + + } else { + if (title) { + globals.gTitles[linkId] = title.replace(/"|'/g, '"'); + } + if (options.parseImgDimensions && width && height) { + globals.gDimensions[linkId] = { + width: width, + height: height + }; + } + } + // Completely remove the definition from the text + return ''; + }); + + // attacklab: strip sentinel + text = text.replace(/~0/, ''); + + return text; +}); + +showdown.subParser('tables', function (text, options, globals) { + 'use strict'; + + if (!options.tables) { + return text; + } + + var tableRgx = /^[ \t]{0,3}\|?.+\|.+\n[ \t]{0,3}\|?[ \t]*:?[ \t]*(?:-|=){2,}[ \t]*:?[ \t]*\|[ \t]*:?[ \t]*(?:-|=){2,}[\s\S]+?(?:\n\n|~0)/gm; + + function parseStyles(sLine) { + if (/^:[ \t]*--*$/.test(sLine)) { + return ' style="text-align:left;"'; + } else if (/^--*[ \t]*:[ \t]*$/.test(sLine)) { + return ' style="text-align:right;"'; + } else if (/^:[ \t]*--*[ \t]*:$/.test(sLine)) { + return ' style="text-align:center;"'; + } else { + return ''; + } + } + + function parseHeaders(header, style) { + var id = ''; + header = header.trim(); + if (options.tableHeaderId) { + id = ' id="' + header.replace(/ /g, '_').toLowerCase() + '"'; + } + header = showdown.subParser('spanGamut')(header, options, globals); + + return '' + header + '\n'; + } + + function parseCells(cell, style) { + var subText = showdown.subParser('spanGamut')(cell, options, globals); + return '' + subText + '\n'; + } + + function buildTable(headers, cells) { + var tb = '\n\n\n', + tblLgn = headers.length; + + for (var i = 0; i < tblLgn; ++i) { + tb += headers[i]; + } + tb += '\n\n\n'; + + for (i = 0; i < cells.length; ++i) { + tb += '\n'; + for (var ii = 0; ii < tblLgn; ++ii) { + tb += cells[i][ii]; + } + tb += '\n'; + } + tb += '\n
\n'; + return tb; + } + + text = globals.converter._dispatch('tables.before', text, options, globals); + + text = text.replace(tableRgx, function (rawTable) { + + var i, tableLines = rawTable.split('\n'); + + // strip wrong first and last column if wrapped tables are used + for (i = 0; i < tableLines.length; ++i) { + if (/^[ \t]{0,3}\|/.test(tableLines[i])) { + tableLines[i] = tableLines[i].replace(/^[ \t]{0,3}\|/, ''); + } + if (/\|[ \t]*$/.test(tableLines[i])) { + tableLines[i] = tableLines[i].replace(/\|[ \t]*$/, ''); + } + } + + var rawHeaders = tableLines[0].split('|').map(function (s) { return s.trim();}), + rawStyles = tableLines[1].split('|').map(function (s) { return s.trim();}), + rawCells = [], + headers = [], + styles = [], + cells = []; + + tableLines.shift(); + tableLines.shift(); + + for (i = 0; i < tableLines.length; ++i) { + if (tableLines[i].trim() === '') { + continue; + } + rawCells.push( + tableLines[i] + .split('|') + .map(function (s) { + return s.trim(); + }) + ); + } + + if (rawHeaders.length < rawStyles.length) { + return rawTable; + } + + for (i = 0; i < rawStyles.length; ++i) { + styles.push(parseStyles(rawStyles[i])); + } + + for (i = 0; i < rawHeaders.length; ++i) { + if (showdown.helper.isUndefined(styles[i])) { + styles[i] = ''; + } + headers.push(parseHeaders(rawHeaders[i], styles[i])); + } + + for (i = 0; i < rawCells.length; ++i) { + var row = []; + for (var ii = 0; ii < headers.length; ++ii) { + if (showdown.helper.isUndefined(rawCells[i][ii])) { + + } + row.push(parseCells(rawCells[i][ii], styles[ii])); + } + cells.push(row); + } + + return buildTable(headers, cells); + }); + + text = globals.converter._dispatch('tables.after', text, options, globals); + + return text; +}); + +/** + * Swap back in all the special characters we've hidden. + */ +showdown.subParser('unescapeSpecialChars', function (text) { + 'use strict'; + + text = text.replace(/~E(\d+)E/g, function (wholeMatch, m1) { + var charCodeToReplace = parseInt(m1); + return String.fromCharCode(charCodeToReplace); + }); + return text; +}); +module.exports = showdown; diff --git a/wx-mini-program/lib/wxParse/wxDiscode.js b/wx-mini-program/lib/wxParse/wxDiscode.js new file mode 100644 index 0000000..e339f7a --- /dev/null +++ b/wx-mini-program/lib/wxParse/wxDiscode.js @@ -0,0 +1,206 @@ +// HTML 支持的数学符号 +function strNumDiscode(str){ + str = str.replace(/∀/g, '∀'); + str = str.replace(/∂/g, '∂'); + str = str.replace(/&exists;/g, '∃'); + str = str.replace(/∅/g, '∅'); + str = str.replace(/∇/g, '∇'); + str = str.replace(/∈/g, '∈'); + str = str.replace(/∉/g, '∉'); + str = str.replace(/∋/g, '∋'); + str = str.replace(/∏/g, '∏'); + str = str.replace(/∑/g, '∑'); + str = str.replace(/−/g, '−'); + str = str.replace(/∗/g, '∗'); + str = str.replace(/√/g, '√'); + str = str.replace(/∝/g, '∝'); + str = str.replace(/∞/g, '∞'); + str = str.replace(/∠/g, '∠'); + str = str.replace(/∧/g, '∧'); + str = str.replace(/∨/g, '∨'); + str = str.replace(/∩/g, '∩'); + str = str.replace(/∩/g, '∪'); + str = str.replace(/∫/g, '∫'); + str = str.replace(/∴/g, '∴'); + str = str.replace(/∼/g, '∼'); + str = str.replace(/≅/g, '≅'); + str = str.replace(/≈/g, '≈'); + str = str.replace(/≠/g, '≠'); + str = str.replace(/≤/g, '≤'); + str = str.replace(/≥/g, '≥'); + str = str.replace(/⊂/g, '⊂'); + str = str.replace(/⊃/g, '⊃'); + str = str.replace(/⊄/g, '⊄'); + str = str.replace(/⊆/g, '⊆'); + str = str.replace(/⊇/g, '⊇'); + str = str.replace(/⊕/g, '⊕'); + str = str.replace(/⊗/g, '⊗'); + str = str.replace(/⊥/g, '⊥'); + str = str.replace(/⋅/g, '⋅'); + return str; +} + +//HTML 支持的希腊字母 +function strGreeceDiscode(str){ + str = str.replace(/Α/g, 'Α'); + str = str.replace(/Β/g, 'Β'); + str = str.replace(/Γ/g, 'Γ'); + str = str.replace(/Δ/g, 'Δ'); + str = str.replace(/Ε/g, 'Ε'); + str = str.replace(/Ζ/g, 'Ζ'); + str = str.replace(/Η/g, 'Η'); + str = str.replace(/Θ/g, 'Θ'); + str = str.replace(/Ι/g, 'Ι'); + str = str.replace(/Κ/g, 'Κ'); + str = str.replace(/Λ/g, 'Λ'); + str = str.replace(/Μ/g, 'Μ'); + str = str.replace(/Ν/g, 'Ν'); + str = str.replace(/Ξ/g, 'Ν'); + str = str.replace(/Ο/g, 'Ο'); + str = str.replace(/Π/g, 'Π'); + str = str.replace(/Ρ/g, 'Ρ'); + str = str.replace(/Σ/g, 'Σ'); + str = str.replace(/Τ/g, 'Τ'); + str = str.replace(/Υ/g, 'Υ'); + str = str.replace(/Φ/g, 'Φ'); + str = str.replace(/Χ/g, 'Χ'); + str = str.replace(/Ψ/g, 'Ψ'); + str = str.replace(/Ω/g, 'Ω'); + + str = str.replace(/α/g, 'α'); + str = str.replace(/β/g, 'β'); + str = str.replace(/γ/g, 'γ'); + str = str.replace(/δ/g, 'δ'); + str = str.replace(/ε/g, 'ε'); + str = str.replace(/ζ/g, 'ζ'); + str = str.replace(/η/g, 'η'); + str = str.replace(/θ/g, 'θ'); + str = str.replace(/ι/g, 'ι'); + str = str.replace(/κ/g, 'κ'); + str = str.replace(/λ/g, 'λ'); + str = str.replace(/μ/g, 'μ'); + str = str.replace(/ν/g, 'ν'); + str = str.replace(/ξ/g, 'ξ'); + str = str.replace(/ο/g, 'ο'); + str = str.replace(/π/g, 'π'); + str = str.replace(/ρ/g, 'ρ'); + str = str.replace(/ς/g, 'ς'); + str = str.replace(/σ/g, 'σ'); + str = str.replace(/τ/g, 'τ'); + str = str.replace(/υ/g, 'υ'); + str = str.replace(/φ/g, 'φ'); + str = str.replace(/χ/g, 'χ'); + str = str.replace(/ψ/g, 'ψ'); + str = str.replace(/ω/g, 'ω'); + str = str.replace(/ϑ/g, 'ϑ'); + str = str.replace(/ϒ/g, 'ϒ'); + str = str.replace(/ϖ/g, 'ϖ'); + str = str.replace(/·/g, '·'); + return str; +} + +// + +function strcharacterDiscode(str){ + // 加入常用解析 + str = str.replace(/ /g, ' '); + str = str.replace(/"/g, '"'); + str = str.replace(/&/g, '&'); + // str = str.replace(/</g, '‹'); + // str = str.replace(/>/g, '›'); + + str = str.replace(/</g, '<'); + str = str.replace(/>/g, '>'); + + return str; +} + +// HTML 支持的其他实体 +function strOtherDiscode(str){ + str = str.replace(/Œ/g, 'Œ'); + str = str.replace(/œ/g, 'œ'); + str = str.replace(/Š/g, 'Š'); + str = str.replace(/š/g, 'š'); + str = str.replace(/Ÿ/g, 'Ÿ'); + str = str.replace(/ƒ/g, 'ƒ'); + str = str.replace(/ˆ/g, 'ˆ'); + str = str.replace(/˜/g, '˜'); + str = str.replace(/ /g, ''); + str = str.replace(/ /g, ''); + str = str.replace(/ /g, ''); + str = str.replace(/‌/g, ''); + str = str.replace(/‍/g, ''); + str = str.replace(/‎/g, ''); + str = str.replace(/‏/g, ''); + str = str.replace(/–/g, '–'); + str = str.replace(/—/g, '—'); + str = str.replace(/‘/g, '‘'); + str = str.replace(/’/g, '’'); + str = str.replace(/‚/g, '‚'); + str = str.replace(/“/g, '“'); + str = str.replace(/”/g, '”'); + str = str.replace(/„/g, '„'); + str = str.replace(/†/g, '†'); + str = str.replace(/‡/g, '‡'); + str = str.replace(/•/g, '•'); + str = str.replace(/…/g, '…'); + str = str.replace(/‰/g, '‰'); + str = str.replace(/′/g, '′'); + str = str.replace(/″/g, '″'); + str = str.replace(/‹/g, '‹'); + str = str.replace(/›/g, '›'); + str = str.replace(/‾/g, '‾'); + str = str.replace(/€/g, '€'); + str = str.replace(/™/g, '™'); + + str = str.replace(/←/g, '←'); + str = str.replace(/↑/g, '↑'); + str = str.replace(/→/g, '→'); + str = str.replace(/↓/g, '↓'); + str = str.replace(/↔/g, '↔'); + str = str.replace(/↵/g, '↵'); + str = str.replace(/⌈/g, '⌈'); + str = str.replace(/⌉/g, '⌉'); + + str = str.replace(/⌊/g, '⌊'); + str = str.replace(/⌋/g, '⌋'); + str = str.replace(/◊/g, '◊'); + str = str.replace(/♠/g, '♠'); + str = str.replace(/♣/g, '♣'); + str = str.replace(/♥/g, '♥'); + + str = str.replace(/♦/g, '♦'); + + return str; +} + +function strMoreDiscode(str){ + str = str.replace(/\r\n/g,""); + str = str.replace(/\n/g,""); + + str = str.replace(/code/g,"wxxxcode-style"); + return str; +} + +function strDiscode(str){ + str = strNumDiscode(str); + str = strGreeceDiscode(str); + str = strcharacterDiscode(str); + str = strOtherDiscode(str); + str = strMoreDiscode(str); + return str; +} +function urlToHttpUrl(url,rep){ + + var patt1 = new RegExp("^//"); + var result = patt1.test(url); + if(result){ + url = rep+":"+url; + } + return url; +} + +module.exports = { + strDiscode:strDiscode, + urlToHttpUrl:urlToHttpUrl +} \ No newline at end of file diff --git a/wx-mini-program/lib/wxParse/wxParse.js b/wx-mini-program/lib/wxParse/wxParse.js new file mode 100644 index 0000000..8adab50 --- /dev/null +++ b/wx-mini-program/lib/wxParse/wxParse.js @@ -0,0 +1,146 @@ +/** + * author: Di (微信小程序开发工程师) + * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com) + * 垂直微信小程序开发交流社区 + * + * github地址: https://github.com/icindy/wxParse + * + * for: 微信小程序富文本解析 + * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184 + */ + +/** + * utils函数引入 + **/ +import showdown from 'showdown.js'; +import HtmlToJson from 'html2json.js'; +/** + * 配置及公有属性 + **/ +/** + * 主函数入口区 + **/ +function wxParse(bindName = 'wxParseData', type='html', data='
数据不能为空
', target,imagePadding) { + var that = target; + var transData = {};//存放转化后的数据 + if (type == 'html') { + transData = HtmlToJson.html2json(data, bindName); + // console.log(JSON.stringify(transData, ' ', ' ')); + } else if (type == 'md' || type == 'markdown') { + var converter = new showdown.Converter(); + var html = converter.makeHtml(data); + transData = HtmlToJson.html2json(html, bindName); + // console.log(JSON.stringify(transData, ' ', ' ')); + } + transData.view = {}; + transData.view.imagePadding = 0; + if(typeof(imagePadding) != 'undefined'){ + transData.view.imagePadding = imagePadding + } + var bindData = {}; + bindData[bindName] = transData; + that.setData(bindData) + that.wxParseImgLoad = wxParseImgLoad; + that.wxParseImgTap = wxParseImgTap; +} +// 图片点击事件 +function wxParseImgTap(e) { + var that = this; + var nowImgUrl = e.target.dataset.src; + var tagFrom = e.target.dataset.from; + if (typeof (tagFrom) != 'undefined' && tagFrom.length > 0) { + wx.previewImage({ + current: nowImgUrl, // 当前显示图片的http链接 + urls: that.data[tagFrom].imageUrls // 需要预览的图片http链接列表 + }) + } +} + +/** + * 图片视觉宽高计算函数区 + **/ +function wxParseImgLoad(e) { + var that = this; + var tagFrom = e.target.dataset.from; + var idx = e.target.dataset.idx; + if (typeof (tagFrom) != 'undefined' && tagFrom.length > 0) { + calMoreImageInfo(e, idx, that, tagFrom) + } +} +// 假循环获取计算图片视觉最佳宽高 +function calMoreImageInfo(e, idx, that, bindName) { + var temData = that.data[bindName]; + if (temData.images.length == 0) { + return; + } + var temImages = temData.images; + //因为无法获取view宽度 需要自定义padding进行计算,稍后处理 + var recal = wxAutoImageCal(e.detail.width, e.detail.height,that,bindName); + temImages[idx].width = recal.imageWidth; + temImages[idx].height = recal.imageheight; + temData.images = temImages; + var bindData = {}; + bindData[bindName] = temData; + that.setData(bindData); +} + +// 计算视觉优先的图片宽高 +function wxAutoImageCal(originalWidth, originalHeight,that,bindName) { + //获取图片的原始长宽 + var windowWidth = 0, windowHeight = 0; + var autoWidth = 0, autoHeight = 0; + var results = {}; + wx.getSystemInfo({ + success: function (res) { + var padding = that.data[bindName].view.imagePadding; + windowWidth = res.windowWidth-2*padding; + windowHeight = res.windowHeight; + //判断按照那种方式进行缩放 + // console.log("windowWidth" + windowWidth); + if (originalWidth > windowWidth) {//在图片width大于手机屏幕width时候 + autoWidth = windowWidth; + // console.log("autoWidth" + autoWidth); + autoHeight = (autoWidth * originalHeight) / originalWidth; + // console.log("autoHeight" + autoHeight); + results.imageWidth = autoWidth; + results.imageheight = autoHeight; + } else {//否则展示原来的数据 + results.imageWidth = originalWidth; + results.imageheight = originalHeight; + } + } + }) + return results; +} + +function wxParseTemArray(temArrayName,bindNameReg,total,that){ + var array = []; + var temData = that.data; + var obj = null; + for(var i = 0; i < total; i++){ + var simArr = temData[bindNameReg+i].nodes; + array.push(simArr); + } + + temArrayName = temArrayName || 'wxParseTemArray'; + obj = JSON.parse('{"'+ temArrayName +'":""}'); + obj[temArrayName] = array; + that.setData(obj); +} + +/** + * 配置emojis + * + */ + +function emojisInit(reg='',baseSrc="/wxParse/emojis/",emojis){ + HtmlToJson.emojisInit(reg,baseSrc,emojis); +} + +module.exports = { + wxParse: wxParse, + wxParseTemArray:wxParseTemArray, + emojisInit:emojisInit +} + + diff --git a/wx-mini-program/lib/wxParse/wxParse.wxml b/wx-mini-program/lib/wxParse/wxParse.wxml new file mode 100644 index 0000000..963a1b1 --- /dev/null +++ b/wx-mini-program/lib/wxParse/wxParse.wxml @@ -0,0 +1,928 @@ + + + + + + + + + + + + +