diff --git a/bingchat/app.wxss b/bingchat/app.wxss
index 67efa87..e1452e6 100644
--- a/bingchat/app.wxss
+++ b/bingchat/app.wxss
@@ -1,4 +1,4 @@
page {
background-color: #fff;
- font-size: 28rpx;
-}
+ font-size: 28rpx;
+}
\ No newline at end of file
diff --git a/bingchat/components/chatbox/index.json b/bingchat/components/chatbox/index.json
index a89ef4d..e322b32 100644
--- a/bingchat/components/chatbox/index.json
+++ b/bingchat/components/chatbox/index.json
@@ -1,4 +1,6 @@
{
"component": true,
- "usingComponents": {}
+ "usingComponents": {
+ "wemark": "../wemark/wemark"
+ }
}
diff --git a/bingchat/components/chatbox/index.wxml b/bingchat/components/chatbox/index.wxml
index ebe8ad0..c9c2c59 100644
--- a/bingchat/components/chatbox/index.wxml
+++ b/bingchat/components/chatbox/index.wxml
@@ -1,3 +1,4 @@
+
输入问题开始和New Bing聊天吧~
@@ -5,7 +6,7 @@
{{item.dt}}
- {{item.originContent}}
+ {{item.originContent}}
{{suggest}}
diff --git a/bingchat/components/wemark/parser.js b/bingchat/components/wemark/parser.js
new file mode 100644
index 0000000..19b1c1b
--- /dev/null
+++ b/bingchat/components/wemark/parser.js
@@ -0,0 +1,262 @@
+var Remarkable = require('./remarkable');
+var parser = new Remarkable({
+ html: true
+});
+var prism = require('./prism');
+
+function parse(md, options){
+ if(!options) options = {};
+ var tokens = parser.parse(md, {});
+
+ // markdwon渲染列表
+ var renderList = [];
+
+ var env = [];
+ // 记录当前list深度
+ var listLevel = 0;
+ // 记录第N级ol的顺序
+ var orderNum = [0, 0];
+ var tmp;
+
+ // 获取inline内容
+ var getInlineContent = function(inlineToken){
+ var ret = [];
+ var env;
+ var tokenData = {};
+
+ if(inlineToken.type === 'htmlblock'){
+ // 匹配video
+ // 兼容video[src]和video > source[src]
+ var videoRegExp = /|<\/video>)/g;
+
+ var match;
+ var html = inlineToken.content.replace(/\n/g, '');
+ while(match = videoRegExp.exec(html)){
+ if(match[1]){
+ var retParam = {
+ type: 'video',
+ src: match[1]
+ };
+
+ if(match[3]) {
+ retParam.poster = match[3];
+ }
+
+ ret.push(retParam);
+ }
+ }
+ }else{
+ // console.log(inlineToken);
+ inlineToken.children && inlineToken.children.forEach(function(token, index){
+ if(['text', 'code'].indexOf(token.type) > -1){
+ ret.push({
+ type: env || token.type,
+ content: token.content,
+ data: tokenData
+ });
+ env = '';
+ tokenData = {};
+ }else if(token.type === 'del_open'){
+ env = 'deleted';
+ }else if (token.type === 'softbreak') {
+ // todo:处理li的问题
+ /* ret.push({
+ type: 'text',
+ content: ' '
+ }); */
+ }else if (token.type === 'hardbreak') {
+ ret.push({
+ type: 'text',
+ content: '\n'
+ });
+ }else if(token.type === 'strong_open'){
+ if(env === 'em') {
+ env = 'strong_em';
+ }else {
+ env = 'strong';
+ }
+ }else if (token.type === 'em_open') {
+ if(env === 'strong') {
+ env = 'strong_em';
+ }else {
+ env = 'em';
+ }
+ }else if (token.type === 'link_open') {
+ if(options.link){
+ env = 'link';
+ tokenData = {
+ href: token.href
+ };
+ }
+ }else if(token.type === 'image'){
+ ret.push({
+ type: token.type,
+ src: token.src
+ });
+ }
+ });
+ }
+
+ return ret;
+ };
+
+ var getBlockContent = function(blockToken, index, firstInLi){
+
+ if(blockToken.type === 'htmlblock'){
+ return getInlineContent(blockToken);
+ }else if(blockToken.type === 'heading_open'){
+ return {
+ type: 'h' + blockToken.hLevel,
+ content: getInlineContent(tokens[index+1])
+ };
+ }else if(blockToken.type === 'paragraph_open'){
+ // var type = 'p';
+ var prefix = '';
+ if(env.length){
+ prefix = env.join('_') + '_';
+ }
+
+ var content = getInlineContent(tokens[index+1]);
+
+ // 处理ol前的数字
+ if(env[env.length - 1] === 'li' && env[env.length - 2] === 'ol'){
+ let prefix = ' ';
+ if (firstInLi){
+ prefix = orderNum[listLevel - 1] + '. ';
+ }
+ content.unshift({
+ type:'text',
+ content: prefix
+ });
+ }
+
+ return {
+ type: prefix + 'p',
+ content: content
+ };
+ }else if(blockToken.type === 'fence' || blockToken.type === 'code'){
+ content = blockToken.content;
+ var highlight = false;
+ if(options.highlight && blockToken.params && prism.languages[blockToken.params]){
+ content = prism.tokenize(content, prism.languages[blockToken.params]);
+ highlight = true;
+ }
+
+ const flattenTokens = (tokensArr, result = [], parentType = '') => {
+ if (Array.isArray(tokensArr)) {
+ tokensArr.forEach(el => {
+ if (typeof el === 'object') {
+ // el.type = parentType + ' wemark_inline_code_' + el.type;
+ if(Array.isArray(el.content)){
+ flattenTokens(el.content, result, el.type);
+ }else{
+ flattenTokens(el, result, el.type);
+ }
+ } else {
+ const obj = {};
+ obj.type = parentType || 'text';
+ // obj.type = parentType + ' wemark_inline_code_';
+ obj.content = el;
+ result.push(obj);
+ }
+ })
+ return result
+ } else {
+ result.push(tokensArr)
+ return result
+ }
+ }
+
+ if(highlight){
+ var tokenList = content;
+ content = [];
+ tokenList.forEach((token) => {
+ // let contentListForToken = [];
+ if(Array.isArray(token.content)){
+ content = content.concat(flattenTokens(token.content, [], ''));
+ }else{
+ content.push(token);
+ }
+ });
+ }
+ // flatten nested tokens in html
+ // if (blockToken.params === 'html') {
+ // content = flattenTokens(content)
+ // }
+ // console.log(content);
+
+ return {
+ type: 'code',
+ highlight: highlight,
+ content: content
+ };
+ }else if(blockToken.type === 'bullet_list_open'){
+ env.push('ul');
+ listLevel++;
+ }else if(blockToken.type === 'ordered_list_open'){
+ env.push('ol');
+ listLevel++;
+ }else if(blockToken.type === 'list_item_open'){
+ env.push('li');
+ if(env[env.length - 2] === 'ol' ){
+ orderNum[listLevel - 1]++;
+ }
+ }else if(blockToken.type === 'list_item_close'){
+ env.pop();
+ }else if(blockToken.type === 'bullet_list_close'){
+ env.pop();
+ listLevel--;
+ }else if(blockToken.type === 'ordered_list_close'){
+ env.pop();
+ listLevel--;
+ orderNum[listLevel] = 0;
+ }else if(blockToken.type === 'blockquote_open'){
+ env.push('blockquote');
+ }else if(blockToken.type === 'blockquote_close'){
+ env.pop();
+ }else if(blockToken.type === 'tr_open'){
+ tmp = {
+ type: 'table_tr',
+ content:[]
+ };
+ return tmp;
+ }else if(blockToken.type === 'th_open'){
+ tmp.content.push({
+ type: 'table_th',
+ content: getInlineContent(tokens[index+1]).map(function(inline){return inline.content;}).join('')
+ });
+ }else if(blockToken.type === 'td_open'){
+ tmp.content.push({
+ type: 'table_td',
+ content: getInlineContent(tokens[index+1]).map(function(inline){return inline.content;}).join('')
+ });
+ }
+ };
+
+ tokens.forEach(function(token, index){
+ // 标记是否刚进入li,如果刚进入,可以加符号/序号,否则不加
+ var firstInLi = false;
+ if(token.type === 'paragraph_open' && tokens[index-1] && tokens[index-1].type === 'list_item_open'){
+ firstInLi = true;
+ }
+ var blockContent = getBlockContent(token, index, firstInLi);
+ if(!blockContent) return;
+ if(!Array.isArray(blockContent)){
+ blockContent = [blockContent];
+ }
+ blockContent.forEach(function(block){
+ if(Array.isArray(block.content)){
+ block.isArray = true;
+ }else{
+ block.isArray = false;
+ }
+ renderList.push(block);
+ });
+ });
+
+ return renderList;
+}
+
+module.exports = {
+ parse: parse
+};
diff --git a/bingchat/components/wemark/prism.js b/bingchat/components/wemark/prism.js
new file mode 100644
index 0000000..6df52b8
--- /dev/null
+++ b/bingchat/components/wemark/prism.js
@@ -0,0 +1,16 @@
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+basic+markup-templating+go+java+json+php+sql+python+typescript */
+var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(){var e=/\blang(?:uage)?-([\w-]+)\b/i,t=0,n=_self.Prism={manual:_self.Prism&&_self.Prism.manual,disableWorkerMessageHandler:_self.Prism&&_self.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof r?new r(e.type,n.util.encode(e.content),e.alias):"Array"===n.util.type(e)?e.map(n.util.encode):e.replace(/&/g,"&").replace(/e.length)return;if(!(w instanceof s)){if(m&&b!=t.length-1){h.lastIndex=k;var _=h.exec(e);if(!_)break;for(var j=_.index+(d?_[1].length:0),P=_.index+_[0].length,A=b,x=k,O=t.length;O>A&&(P>x||!t[A].type&&!t[A-1].greedy);++A)x+=t[A].length,j>=x&&(++b,k=x);if(t[b]instanceof s)continue;I=A-b,w=e.slice(k,x),_.index-=k}else{h.lastIndex=0;var _=h.exec(w),I=1}if(_){d&&(p=_[1]?_[1].length:0);var j=_.index+p,_=_[0].slice(p),P=j+_.length,N=w.slice(0,j),S=w.slice(P),C=[b,I];N&&(++b,k+=N.length,C.push(N));var E=new s(u,f?n.tokenize(_,f):_,y,_,m);if(C.push(E),S&&C.push(S),Array.prototype.splice.apply(t,C),1!=I&&n.matchGrammar(e,t,r,b,k,!0,u),i)break}else if(i)break}}}}},tokenize:function(e,t){var r=[e],a=t.rest;if(a){for(var l in a)t[l]=a[l];delete t.rest}return n.matchGrammar(e,r,t,0,0,!1),r},hooks:{all:{},add:function(e,t){var r=n.hooks.all;r[e]=r[e]||[],r[e].push(t)},run:function(e,t){var r=n.hooks.all[e];if(r&&r.length)for(var a,l=0;a=r[l++];)a(t)}}},r=n.Token=function(e,t,n,r,a){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length,this.greedy=!!a};if(r.stringify=function(e,t,a){if("string"==typeof e)return e;if("Array"===n.util.type(e))return e.map(function(n){return r.stringify(n,t,e)}).join("");var l={type:e.type,content:r.stringify(e.content,t,a),tag:"span",classes:["token",e.type],attributes:{},language:t,parent:a};if(e.alias){var i="Array"===n.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(l.classes,i)}n.hooks.run("wrap",l);var o=Object.keys(l.attributes).map(function(e){return e+'="'+(l.attributes[e]||"").replace(/"/g,""")+'"'}).join(" ");return"<"+l.tag+' class="'+l.classes.join(" ")+'"'+(o?" "+o:"")+">"+l.content+""+l.tag+">"},!_self.document)return _self.addEventListener?(n.disableWorkerMessageHandler||_self.addEventListener("message",function(e){var t=JSON.parse(e.data),r=t.language,a=t.code,l=t.immediateClose;_self.postMessage(n.highlight(a,n.languages[r],r)),l&&_self.close()},!1),_self.Prism):_self.Prism;var a=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return a&&(n.filename=a.src,n.manual||a.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(n.highlightAll):window.setTimeout(n.highlightAll,16):document.addEventListener("DOMContentLoaded",n.highlightAll))),_self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
+Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype://i,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/(^|[^\\])["']/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/?[\da-z]{1,8};/i},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Prism.languages.xml=Prism.languages.markup,Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup;
+Prism.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(?:;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^{}\s][^{};]*?(?=\s*\{)/,string:{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/\B!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.languages.css,Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/(