├── .gitignore ├── .travis.yml ├── Gemfile ├── Gemfile.lock ├── aoa.bat ├── aoa.sh ├── build.sh ├── build ├── fonts │ ├── slate.eot │ ├── slate.svg │ ├── slate.ttf │ ├── slate.woff │ └── slate.woff2 ├── images │ ├── logo.png │ └── navbar.png ├── index.html ├── javascripts │ ├── all.js │ ├── all_nosearch.js │ ├── jquery.min.js │ ├── lib │ │ ├── jquery-1.7.1.min.js │ │ ├── marked.js │ │ └── modernizr-2.0.6.min.js │ └── releasenotes.js └── stylesheets │ ├── nav.css │ ├── print.css │ ├── releasenotes.plugin.css │ ├── screen.css │ └── style.css ├── config.rb ├── font-selection.json ├── fonts ├── slate.eot ├── slate.svg ├── slate.ttf ├── slate.woff └── slate.woff2 ├── gettoken ├── images ├── favicon.ico ├── logo.png └── navbar.png ├── index.html ├── javascripts ├── all.js ├── all_nosearch.js ├── jquery.min.js ├── lib │ ├── jquery-1.7.1.min.js │ ├── marked.js │ └── modernizr-2.0.6.min.js └── releasenotes.js ├── source ├── fonts │ ├── slate.eot │ ├── slate.svg │ ├── slate.ttf │ ├── slate.woff │ └── slate.woff2 ├── images │ ├── logo.png │ └── navbar.png ├── includes │ ├── _blog.md │ ├── _cdn.md │ ├── _client.md │ ├── _faq.md │ ├── _guide.md │ ├── _identityverify.md │ ├── _isvguide.md │ ├── _overview.md │ ├── _pc.md │ ├── _server.md │ ├── _serverdebug.md │ ├── _share.md │ ├── _standar.md │ └── _updatelog.md ├── index.md ├── javascripts │ ├── all.js │ ├── all_nosearch.js │ ├── app │ │ ├── _lang.js │ │ ├── _search.js │ │ └── _toc.js │ ├── jquery.min.js │ ├── lib │ │ ├── _energize.js │ │ ├── _jquery.highlight.js │ │ ├── _jquery.tocify.js │ │ ├── _jquery_ui.js │ │ ├── _lunr.js │ │ ├── jquery-1.7.1.min.js │ │ ├── marked.js │ │ └── modernizr-2.0.6.min.js │ └── releasenotes.js ├── layouts │ └── layout.erb └── stylesheets │ ├── _icon-font.scss │ ├── _nav.scss │ ├── _normalize.css │ ├── _syntax.scss.erb │ ├── _variables.scss │ ├── nav.scss │ ├── print.css.scss │ ├── releasenotes.plugin.css │ ├── screen.css.scss │ └── style.css └── stylesheets ├── nav.css ├── print.css ├── releasenotes.plugin.css ├── screen.css └── style.css /.gitignore: -------------------------------------------------------------------------------- 1 | /.buildpath 2 | /.project 3 | /.idea 4 | .DS_Store 5 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | rvm: 2 | - 1.9.3 3 | - 2.0.0 4 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://ruby.taobao.org' 2 | 3 | # Middleman 4 | gem 'middleman', '~>3.3.10' 5 | gem 'middleman-syntax', '~> 2.0.0' 6 | gem 'middleman-autoprefixer', '~> 2.4.4' 7 | gem 'rouge', '~> 1.9.0' 8 | gem 'redcarpet', '~> 3.3.1' 9 | 10 | #gem 'rake', '~> 10.4.2' 11 | #gem 'therubyracer', '~> 0.12.1', platforms: :ruby 12 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://ruby.taobao.org/ 3 | specs: 4 | activesupport (4.1.12) 5 | i18n (~> 0.6, >= 0.6.9) 6 | json (~> 1.7, >= 1.7.7) 7 | minitest (~> 5.1) 8 | thread_safe (~> 0.1) 9 | tzinfo (~> 1.1) 10 | autoprefixer-rails (5.2.1) 11 | execjs 12 | json 13 | celluloid (0.16.0) 14 | timers (~> 4.0.0) 15 | chunky_png (1.3.4) 16 | coffee-script (2.4.1) 17 | coffee-script-source 18 | execjs 19 | coffee-script-source (1.9.1.1) 20 | compass (1.0.3) 21 | chunky_png (~> 1.2) 22 | compass-core (~> 1.0.2) 23 | compass-import-once (~> 1.0.5) 24 | rb-fsevent (>= 0.9.3) 25 | rb-inotify (>= 0.9) 26 | sass (>= 3.3.13, < 3.5) 27 | compass-core (1.0.3) 28 | multi_json (~> 1.0) 29 | sass (>= 3.3.0, < 3.5) 30 | compass-import-once (1.0.5) 31 | sass (>= 3.2, < 3.5) 32 | erubis (2.7.0) 33 | execjs (2.5.2) 34 | ffi (1.9.10) 35 | ffi (1.9.10-x64-mingw32) 36 | haml (4.0.6) 37 | tilt 38 | hike (1.2.3) 39 | hitimes (1.2.2) 40 | hooks (0.4.0) 41 | uber (~> 0.0.4) 42 | i18n (0.7.0) 43 | json (1.8.3) 44 | kramdown (1.8.0) 45 | listen (2.10.1) 46 | celluloid (~> 0.16.0) 47 | rb-fsevent (>= 0.9.3) 48 | rb-inotify (>= 0.9) 49 | middleman (3.3.12) 50 | coffee-script (~> 2.2) 51 | compass (>= 1.0.0, < 2.0.0) 52 | compass-import-once (= 1.0.5) 53 | execjs (~> 2.0) 54 | haml (>= 4.0.5) 55 | kramdown (~> 1.2) 56 | middleman-core (= 3.3.12) 57 | middleman-sprockets (>= 3.1.2) 58 | sass (>= 3.4.0, < 4.0) 59 | uglifier (~> 2.5) 60 | middleman-autoprefixer (2.4.4) 61 | autoprefixer-rails (~> 5.2.0) 62 | middleman-core (>= 3.3.3) 63 | middleman-core (3.3.12) 64 | activesupport (~> 4.1.0) 65 | bundler (~> 1.1) 66 | erubis 67 | hooks (~> 0.3) 68 | i18n (~> 0.7.0) 69 | listen (>= 2.7.9, < 3.0) 70 | padrino-helpers (~> 0.12.3) 71 | rack (>= 1.4.5, < 2.0) 72 | rack-test (~> 0.6.2) 73 | thor (>= 0.15.2, < 2.0) 74 | tilt (~> 1.4.1, < 2.0) 75 | middleman-sprockets (3.4.2) 76 | middleman-core (>= 3.3) 77 | sprockets (~> 2.12.1) 78 | sprockets-helpers (~> 1.1.0) 79 | sprockets-sass (~> 1.3.0) 80 | middleman-syntax (2.0.0) 81 | middleman-core (~> 3.2) 82 | rouge (~> 1.0) 83 | minitest (5.7.0) 84 | multi_json (1.11.2) 85 | padrino-helpers (0.12.5) 86 | i18n (~> 0.6, >= 0.6.7) 87 | padrino-support (= 0.12.5) 88 | tilt (~> 1.4.1) 89 | padrino-support (0.12.5) 90 | activesupport (>= 3.1) 91 | rack (1.6.4) 92 | rack-test (0.6.3) 93 | rack (>= 1.0) 94 | rb-fsevent (0.9.5) 95 | rb-inotify (0.9.5) 96 | ffi (>= 0.5.0) 97 | redcarpet (3.3.2) 98 | rouge (1.9.0) 99 | sass (3.4.15) 100 | sprockets (2.12.4) 101 | hike (~> 1.2) 102 | multi_json (~> 1.0) 103 | rack (~> 1.0) 104 | tilt (~> 1.1, != 1.3.0) 105 | sprockets-helpers (1.1.0) 106 | sprockets (~> 2.0) 107 | sprockets-sass (1.3.1) 108 | sprockets (~> 2.0) 109 | tilt (~> 1.1) 110 | thor (0.19.1) 111 | thread_safe (0.3.5) 112 | tilt (1.4.1) 113 | timers (4.0.1) 114 | hitimes 115 | tzinfo (1.2.2) 116 | thread_safe (~> 0.1) 117 | uber (0.0.13) 118 | uglifier (2.7.1) 119 | execjs (>= 0.3.0) 120 | json (>= 1.8.0) 121 | 122 | PLATFORMS 123 | ruby 124 | x64-mingw32 125 | 126 | DEPENDENCIES 127 | middleman (~> 3.3.10) 128 | middleman-autoprefixer (~> 2.4.4) 129 | middleman-syntax (~> 2.0.0) 130 | redcarpet (~> 3.3.1) 131 | rouge (~> 1.9.0) 132 | 133 | BUNDLED WITH 134 | 1.11.2 135 | -------------------------------------------------------------------------------- /aoa.bat: -------------------------------------------------------------------------------- 1 | 2 | cp -force -r build/. tmp/ 3 | 4 | git checkout gh-pages 5 | 6 | cp -force -r tmp/* ./ 7 | 8 | rm -r -force tmp/ 9 | 10 | git pull 11 | 12 | git add . 13 | 14 | git commit -m "gh-pages" 15 | 16 | git push -u origin gh-pages 17 | 18 | git checkout master 19 | 20 | git push -u origin master 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /aoa.sh: -------------------------------------------------------------------------------- 1 | 2 | cp -f -r build/. tmp/ 3 | 4 | git checkout gh-pages 5 | 6 | git pull 7 | 8 | cp -f -r tmp/. ./ 9 | 10 | rm -rf tmp/ 11 | 12 | 13 | git add . 14 | 15 | git commit -m "gh-pages" 16 | 17 | git push -u origin gh-pages 18 | 19 | git checkout master 20 | 21 | git push -u origin master 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | bundle exec middleman build --clean 4 | -------------------------------------------------------------------------------- /build/fonts/slate.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddtalk/dingTalkDoc/ebfe662a78a81a67bd00733b850c25d0322a0e10/build/fonts/slate.eot -------------------------------------------------------------------------------- /build/fonts/slate.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Generated by IcoMoon 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /build/fonts/slate.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddtalk/dingTalkDoc/ebfe662a78a81a67bd00733b850c25d0322a0e10/build/fonts/slate.ttf -------------------------------------------------------------------------------- /build/fonts/slate.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddtalk/dingTalkDoc/ebfe662a78a81a67bd00733b850c25d0322a0e10/build/fonts/slate.woff -------------------------------------------------------------------------------- /build/fonts/slate.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddtalk/dingTalkDoc/ebfe662a78a81a67bd00733b850c25d0322a0e10/build/fonts/slate.woff2 -------------------------------------------------------------------------------- /build/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddtalk/dingTalkDoc/ebfe662a78a81a67bd00733b850c25d0322a0e10/build/images/logo.png -------------------------------------------------------------------------------- /build/images/navbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddtalk/dingTalkDoc/ebfe662a78a81a67bd00733b850c25d0322a0e10/build/images/navbar.png -------------------------------------------------------------------------------- /build/javascripts/lib/marked.js: -------------------------------------------------------------------------------- 1 | /** 2 | * marked - A markdown parser (https://github.com/chjj/marked) 3 | * Copyright (c) 2011-2012, Christopher Jeffrey. (MIT Licensed) 4 | */ 5 | (function(){function e(){var e="(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+";return e}function t(e){return e=e.source,function t(n,r){return n?(e=e.replace(n,r.source||r),t):new RegExp(e)}}function n(){}var r={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:n,hr:/^( *[\-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,lheading:/^([^\n]+)\n *(=|-){3,} *\n*/,blockquote:/^( *>[^\n]+(\n[^\n]+)*\n*)+/,list:/^( *)([*+-]|\d+\.) [^\0]+?(?:\n{2,}(?! )(?!\1bullet)\n*|\s*$)/,html:/^ *(?:comment|closed|closing) *(?:\n{2,}|\s*$)/,def:/^ *\[([^\]]+)\]: *([^\s]+)(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,paragraph:/^([^\n]+\n?(?!body))+\n*/,text:/^[^\n]+/};r.list=t(r.list)("bullet",/(?:[*+-](?!(?: *[-*]){2,})|\d+\.)/)(),r.html=t(r.html)("comment",//)("closed",/<(tag)[^\0]+?<\/\1>/)("closing",/])*?>/)(/tag/g,e())(),r.paragraph=function(){var t=r.paragraph.source,n=[];return function s(e){return e=r[e]?r[e].source:e,n.push(e.replace(/(^|[^\[])\^/g,"$1")),s}("hr")("heading")("lheading")("blockquote")("<"+e())("def"),new RegExp(t.replace("body",n.join("|")))}(),r.normal={fences:r.fences,paragraph:r.paragraph},r.gfm={fences:/^ *``` *(\w+)? *\n([^\0]+?)\s*``` *(?:\n+|$)/,paragraph:/^/},r.gfm.paragraph=t(r.paragraph)("(?!","(?!"+r.gfm.fences.source.replace(/(^|[^\[])\^/g,"$1")+"|")(),r.lexer=function(e){var t=[];return t.links={},e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," "),r.token(e,t,!0)},r.token=function(e,t,n){for(var s,l,i,a,c,g,o,e=e.replace(/^ +$/gm,"");e;)if((i=r.newline.exec(e))&&(e=e.substring(i[0].length),i[0].length>1&&t.push({type:"space"})),i=r.code.exec(e))e=e.substring(i[0].length),i=i[0].replace(/^ {4}/gm,""),t.push({type:"code",text:f.pedantic?i:i.replace(/\n+$/,"")});else if(i=r.fences.exec(e))e=e.substring(i[0].length),t.push({type:"code",lang:i[1],text:i[2]});else if(i=r.heading.exec(e))e=e.substring(i[0].length),t.push({type:"heading",depth:i[1].length,text:i[2]});else if(i=r.lheading.exec(e))e=e.substring(i[0].length),t.push({type:"heading",depth:"="===i[2]?1:2,text:i[1]});else if(i=r.hr.exec(e))e=e.substring(i[0].length),t.push({type:"hr"});else if(i=r.blockquote.exec(e))e=e.substring(i[0].length),t.push({type:"blockquote_start"}),i=i[0].replace(/^ *> ?/gm,""),r.token(i,t,n),t.push({type:"blockquote_end"});else if(i=r.list.exec(e)){for(e=e.substring(i[0].length),t.push({type:"list_start",ordered:isFinite(i[2])}),i=i[0].match(/^( *)([*+-]|\d+\.) [^\n]*(?:\n(?!\1(?:[*+-]|\d+\.) )[^\n]*)*/gm),s=!1,o=i.length,g=0;o>g;g++)a=i[g],c=a.length,a=a.replace(/^ *([*+-]|\d+\.) +/,""),~a.indexOf("\n ")&&(c-=a.length,a=f.pedantic?a.replace(/^ {1,4}/gm,""):a.replace(new RegExp("^ {1,"+c+"}","gm"),"")),l=s||/\n\n(?!\s*$)/.test(a),g!==o-1&&(s="\n"===a[a.length-1],l||(l=s)),t.push({type:l?"loose_item_start":"list_item_start"}),r.token(a,t),t.push({type:"list_item_end"});t.push({type:"list_end"})}else(i=r.html.exec(e))?(e=e.substring(i[0].length),t.push({type:"html",pre:"pre"===i[1],text:i[0]})):n&&(i=r.def.exec(e))?(e=e.substring(i[0].length),t.links[i[1].toLowerCase()]={href:i[2],title:i[3]}):n&&(i=r.paragraph.exec(e))?(e=e.substring(i[0].length),t.push({type:"paragraph",text:i[0]})):(i=r.text.exec(e))&&(e=e.substring(i[0].length),t.push({type:"text",text:i[0]}));return t};var s={escape:/^\\([\\`*{}\[\]()#+\-.!_>])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:n,tag:/^|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([^\0]+?)__(?!_)|^\*\*([^\0]+?)\*\*(?!\*)/,em:/^\b_((?:__|[^\0])+?)_\b|^\*((?:\*\*|[^\0])+?)\*(?!\*)/,code:/^(`+)([^\0]*?[^`])\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,text:/^[^\0]+?(?=[\\?(?:\s+['"]([^\0]*?)['"])?\s*/,s.link=t(s.link)("inside",s._linkInside)("href",s._linkHref)(),s.reflink=t(s.reflink)("inside",s._linkInside)(),s.normal={url:s.url,strong:s.strong,em:s.em,text:s.text},s.pedantic={strong:/^__(?=\S)([^\0]*?\S)__(?!_)|^\*\*(?=\S)([^\0]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([^\0]*?\S)_(?!_)|^\*(?=\S)([^\0]*?\S)\*(?!\*)/},s.gfm={url:/^(https?:\/\/[^\s]+[^.,:;"')\]\s])/,text:/^[^\0]+?(?=[\\'+n+"";else if(i=s.url.exec(e))e=e.substring(i[0].length),n=u(i[1]),r=n,c+=''+n+"";else if(i=s.tag.exec(e))e=e.substring(i[0].length),c+=f.sanitize?u(i[0]):i[0];else if(i=s.link.exec(e))e=e.substring(i[0].length),c+=a(i,{href:i[2],title:i[3]});else if((i=s.reflink.exec(e))||(i=s.nolink.exec(e))){if(e=e.substring(i[0].length),t=(i[2]||i[1]).replace(/\s+/g," "),t=g[t.toLowerCase()],!t||!t.href){c+=i[0][0],e=i[0].substring(1)+e;continue}c+=a(i,t)}else(i=s.strong.exec(e))?(e=e.substring(i[0].length),c+=""+s.lexer(i[2]||i[1])+""):(i=s.em.exec(e))?(e=e.substring(i[0].length),c+=""+s.lexer(i[2]||i[1])+""):(i=s.code.exec(e))?(e=e.substring(i[0].length),c+=""+u(i[2],!0)+""):(i=s.br.exec(e))?(e=e.substring(i[0].length),c+="
"):(i=s.text.exec(e))&&(e=e.substring(i[0].length),c+=u(i[0]));return c};var l,i,a=function(e,t){return"!"!==e[0][0]?'"+s.lexer(e[1])+"":''+u(e[1])+'"},c=function(){return i=l.pop()},g=function(){switch(i.type){case"space":return"";case"hr":return"
\n";case"heading":return""+s.lexer(i.text)+"\n";case"code":return"
"+(i.escaped?i.text:u(i.text,!0))+"
\n";case"blockquote_start":for(var e="";"blockquote_end"!==c().type;)e+=g();return"
\n"+e+"
\n";case"list_start":for(var t=i.ordered?"ol":"ul",e="";"list_end"!==c().type;)e+=g();return"<"+t+">\n"+e+"\n";case"list_item_start":for(var e="";"list_item_end"!==c().type;)e+="text"===i.type?o():g();return"
  • "+e+"
  • \n";case"loose_item_start":for(var e="";"list_item_end"!==c().type;)e+=g();return"
  • "+e+"
  • \n";case"html":return f.sanitize?s.lexer(i.text):i.pre||f.pedantic?i.text:s.lexer(i.text);case"paragraph":return"

    "+s.lexer(i.text)+"

    \n";case"text":return"

    "+o()+"

    \n"}},o=function(){for(var e,t=i.text;(e=l[l.length-1])&&"text"===e.type;)t+="\n"+c().text;return s.lexer(t)},p=function(e){l=e.reverse();for(var t="";c();)t+=g();return l=null,i=null,t},u=function(e,t){return e.replace(t?/&/g:/&(?!#?\w+;)/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")},h=function(e){for(var t,n="",r=e.length,s=0;r>s;s++)t=e.charCodeAt(s),Math.random()>.5&&(t="x"+t.toString(16)),n+="&#"+t+";";return n};n.exec=n;var f,d,x=function(e,t){return m(t),p(r.lexer(e))},m=function(e){e||(e=d),f!==e&&(f=e,f.gfm?(r.fences=r.gfm.fences,r.paragraph=r.gfm.paragraph,s.text=s.gfm.text,s.url=s.gfm.url):(r.fences=r.normal.fences,r.paragraph=r.normal.paragraph,s.text=s.normal.text,s.url=s.normal.url),f.pedantic?(s.em=s.pedantic.em,s.strong=s.pedantic.strong):(s.em=s.normal.em,s.strong=s.normal.strong))};x.options=x.setOptions=function(e){d=e,m(e)},x.options({gfm:!0,pedantic:!1,sanitize:!1}),x.parser=function(e,t){return m(t),p(e)},x.lexer=function(e,t){return m(t),r.lexer(e)},x.parse=x,"undefined"!=typeof module?module.exports=x:this.marked=x}).call(this); -------------------------------------------------------------------------------- /build/javascripts/releasenotes.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright, Cedric Dugas, 3 | * Do not sell or redistribute 4 | */ 5 | !function(e){marked.setOptions({gfm:!0,pedantic:!1,sanitize:!0});var t={milestonesShown:10,phpApi:!1,phpApiPath:"/",showDescription:!0,showComments:!0,repo:"appstore",username:"ddtalk"};e.fn.releaseNotes=function(n){n=e.extend({},t,n||{});var a=n.phpApiPath+"api.php",i=n.phpApi?"json":"jsonp",o={load:function(t){var s=this;this.$el=e(t),this.loadEvents();var a=e.extend(n,{state:"closed",action:"milestones",sort:"due_date"});this.callApi(a).success(function(e){e.data&&(e=e.data),s.showMilestones(e)}).error(function(e){console.log(e)})},loadEvents:function(){var e=this;n.showDescription&&this.$el.delegate(".issue","click",function(){return e.loadIssueDesc(this),!1}),n.showComments&&this.$el.delegate(".btnComments","click",function(){return e.loadComments(this),!1})},loadIssueDesc:function(t){var a=e(t),i=a.data("issue");$bigIssue=a.find(".issueBig"),$bigIssue.is(":visible")?$bigIssue.slideUp():(e(".issueBig").not($bigIssue).slideUp(),$bigIssue.find(".container").html(s.bigIssue(i,n.showComments)),$bigIssue.slideDown())},showMilestones:function(t){var a=this;t.sort(this.sortDate),e.each(t,function(t,i){if(t==n.milestonesShown)return!1;i.prettyDate=a.getPrettyDate(i.due_on?i.due_on:i.created_at),a.$el.append(s.milestone(i));var o=e.extend(n,{milestone:i.number,sort:"created",action:"issues",state:"closed"});a.callApi(o).success(function(e){e.data&&(e=e.data),a.showIssues(e)})})},loadComments:function(t){var s=this,a=e(t).attr("data-issue-id");e(t).fadeOut().slideUp();var i=e.extend(n,{issueid:a,action:"comments"});this.callApi(i).success(function(e){e.data&&(e=e.data),s.showComments(e,a)})},showComments:function(t,n){var a=this,i=a.$el.find("#issue"+n).find(".comments").empty();e.each(t,function(e,t){t.prettyDate=a.getPrettyDate(t.created_at),i.append(s.comment(t,n))}),i.slideDown()},showIssues:function(t){var a=this,i=a.$el.find("[data-id-milestone="+t[0].milestone.number+"]"),o=i.find(".issues");t.sort(this.sortLabel),e.each(t,function(e,t){t.prettyDate=a.getPrettyDate(t.closed_at),o.append(s.issue(t))}),i.addClass("separator"),n.showDescription&&i.find(".issue").addClass("cursor")},getPrettyDate:function(e){var t="",e=e.split("T"),s=e[0].split("-"),n=new Date(s[0],s[1]-1,s[2]),a=new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"),i=new Array("January","February","March","April","May","June","July","August","September","October","November","December");return t+=a[n.getDay()]+", ",t+=i[n.getMonth()]+" ",t+=n.getDate()+", ",t+=n.getFullYear()},sortDate:function(e,t){e.dateTest=e.due_on?e.due_on:e.created_at,t.dateTest=t.due_on?t.due_on:t.created_at;var s=new Date(e.dateTest),n=new Date(t.dateTest);return n>s?1:s>n?-1:0},sortLabel:function(e,t){return e.labels.length?t.labels.length?e.labels[0].name>t.labels[0].name?1:e.labels[0].name

    '+t.title+'

    \u53d1\u5e03\u65e5\u671f: '+t.prettyDate+'

    ').data("milestone",t)},issue:function(t){var s="",n=this;return e.each(t.labels,function(e,t){s+=n.label(t)}),null!==t.body&&void 0!==t.body&&""!==t.body&&"#"==t.body.substring(0,1)?e('
    • '+s+" "+e("").html(t.title).text()+"

    ").data("issue",t):e('
    • '+s+" "+e("").html(t.title).text()+"

    ").data("issue",t)},label:function(e){return""+e.name+""},bigIssue:function(){},comment:function(){}}}(jQuery); -------------------------------------------------------------------------------- /build/stylesheets/nav.css: -------------------------------------------------------------------------------- 1 | .navbar{width:100%}nav{display:-webkit-flex;display:-ms-flexbox;display:flex;position:absolute;top:0;left:0}@media (min-width: 48em){nav{-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}}nav .logo-container{width:100%}@media (min-width: 48em){nav .logo-container{width:auto}}nav .logo{height:60px;width:200px;margin:0 auto;background-repeat:no-repeat;background-position:center center;background-size:100%;color:#fff;font-size:28px;line-height:60px;text-shadow:none;position:relative}@media (min-width: 48em){nav .logo{display:inline-block;margin:6px 0 0 15px}}nav li{list-style:none !important;color:#FFF;padding:10px;font-size:12px;letter-spacing:1px;font-family:'proxima-nova';font-weight:bold;text-transform:uppercase;text-decoration:none}.caret{margin-top:4px;margin-left:4px;display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid white;border-right:4px solid transparent;border-left:4px solid transparent;content:""}nav li>a:only-child:after{content:''}nav li{list-style:none !important;color:#FFF;padding:10px;text-decoration:none}nav ul{padding:0;margin-top:20px;display:none}@media (min-width: 48em){nav ul{display:block}}nav ul li{list-style:none;float:left}nav ul li a{color:#fff;padding:10px;text-decoration:none}nav ul li ul{display:none}nav ul li:hover ul{position:absolute;z-index:1000;margin-top:10px;margin-left:8px;list-style:none;display:list-item !important;border-radius:2px;background-color:white;box-shadow:0px 2px 3px rgba(0,0,0,0.25)}nav ul li:hover ul:before{display:block;position:absolute;top:-5px;left:12px;width:10px;height:10px;background-color:white;content:'';-webkit-transform:rotate(45deg);transform:rotate(45deg)}nav ul li ul li a{text-transform:none;letter-spacing:0;color:#3e4552;font-family:'Microsoft YaHei','Helvetica Neue', 'Helvetica', 'Arial', 'sans-serif';font-weight:500}nav ul li:hover ul li{padding-left:0px;float:none} -------------------------------------------------------------------------------- /build/stylesheets/print.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.content h1,.content h2,.content h3,.content h4,body{font-family:'Microsoft YaHei','Helvetica Neue', 'Helvetica', 'Arial', 'sans-serif';font-size:14px}.content h1,.content h2,.content h3,.content h4{font-weight:bold}.content pre,.content code{font-family:Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, serif;font-size:12px;line-height:1.5}.content pre,.content code{word-break:break-all;word-break:break-word;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto}@font-face{font-family:'slate';src:url("../fonts/slate.eot?-syv14m");src:url("../fonts/slate.eot?#iefix-syv14m") format("embedded-opentype"),url("../fonts/slate.woff2?-syv14m") format("woff2"),url("../fonts/slate.woff?-syv14m") format("woff"),url("../fonts/slate.ttf?-syv14m") format("truetype"),url("../fonts/slate.svg?-syv14m#slate") format("svg");font-weight:normal;font-style:normal}.content aside.warning:before,.content aside.notice:before,.content aside.success:before{font-family:'slate';speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1}.content aside.warning:before{content:"\e600"}.content aside.notice:before{content:"\e602"}.content aside.success:before{content:"\e606"}.tocify,.toc-footer,.lang-selector,.search,#nav-button{display:none}.tocify-wrapper>img{margin:0 auto;display:block}.content{font-size:12px}.content pre,.content code{border:1px solid #999;border-radius:5px;font-size:0.8em}.content pre{padding:1.3em}.content code{padding:0.2em}.content table{border:1px solid #999}.content table tr{border-bottom:1px solid #999}.content table td,.content table th{padding:0.7em}.content p{line-height:1.5}.content a{text-decoration:none;color:#000}.content h1{font-size:2.5em;padding-top:0.5em;padding-bottom:0.5em;margin-top:1em;margin-bottom:21px;border:2px solid #ccc;border-width:2px 0;text-align:center}.content h2{font-size:1.8em;margin-top:2em;border-top:2px solid #ccc;padding-top:0.8em}.content h1+h2,.content h1+div+h2{border-top:none;padding-top:0;margin-top:0}.content h3,.content h4{font-size:0.8em;margin-top:1.5em;margin-bottom:0.8em;text-transform:uppercase}.content h5,.content h6{text-transform:uppercase}.content aside{padding:1em;border:1px solid #ccc;border-radius:5px;margin-top:1.5em;margin-bottom:1.5em;line-height:1.6}.content aside:before{vertical-align:middle;padding-right:0.5em;font-size:14px} -------------------------------------------------------------------------------- /build/stylesheets/releasenotes.plugin.css: -------------------------------------------------------------------------------- 1 | .milestoneContainer{padding-bottom:35px;margin-bottom:10px}.milestoneContainer.separator{background:url("../images/lineseparator.png") bottom center no-repeat}.milestoneContainer .cursor:hover{cursor:pointer}h3.release{margin:0 0 2px 0;font-size:18px}p.dateRelease{margin:0 0 10px 0;font-size:14px}.milestoneContainer .body p{padding:5px 0;margin:0}.milestoneContainer pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12.025px;line-height:18px;background-color:whiteSmoke;border:1px solid #CCC;border:1px solid rgba(0,0,0,0.15);border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;word-wrap:break-word}.milestoneContainer code,.milestoneContainer pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333;border-radius:3px}.milestoneContainer .btn{display:inline-block;text-decoration:none;*display:inline;*zoom:1;padding:4px 10px 4px;margin-bottom:0;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;background-color:#f5f5f5;background-image:linear-gradient(top, #fff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);-webkit-filter:progid:dximagetransform.microsoft.gradient(enabled=false);filter:progid:dximagetransform.microsoft.gradient(enabled=false);border:1px solid #cccccc;border-bottom-color:#b3b3b3;border-radius:4px;box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);cursor:pointer;*margin-left:.3em}.milestoneContainer .btn:hover,.milestoneContainer .btn:active{background-color:#e6e6e6}.milestoneContainer .btn:active,.milestoneContainer .btn.active{background-color:#cccccc \9}.milestoneContainer .btn:first-child{*margin-left:0}.milestoneContainer .btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;transition:background-position 0.1s linear}.milestoneContainer .btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.milestoneContainer .btn:active{background-image:none;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;outline:0}.milestoneContainer .date{font-size:14px}.milestoneContainer .cmeta .date{font-size:11px}.milestoneContainer .issue{padding-bottom:3px}.milestoneContainer .issues{color:#555}.milestoneContainer .issueTitle{line-height:24px;font-size:13px}.milestoneContainer .label{display:inline-block;font-family:arial;font-weight:normal;line-height:13px;color:white;vertical-align:middle;white-space:nowrap;font-size:12px;color:#fff;text-shadow:1px 1px 1px #333;padding:3px 4px;border-radius:5px;margin-top:-6px;margin-right:5px}.milestoneContainer .btnComments{margin:-8px 0 15px 63px}.milestoneContainer .hidden{display:none}.milestoneContainer .content-body{padding-top:10px;margin-top:15px;border-top:1px solid #CACACA}.milestoneContainer .normal-comment .content-body{padding-top:0px;margin-top:0px;border-top:none}.milestoneContainer .new-comments .bubble .comment{margin:0}.milestoneContainer .view-pull-request .new-comments .bubble .commit-comment{margin-top:3px}.milestoneContainer .new-comments .bubble .commit-comment.thread-start{margin-top:0}.milestoneContainer .bubble .comment-form{margin:0}.milestoneContainer .avatar-bubble{margin:20px 0;padding-left:60px;background:url('../images/bubble-arrow.png') 51px 20px no-repeat}.milestoneContainer .avatar-bubble>.avatar{position:relative;float:left;margin-left:-60px}.bubble{padding:3px;background:#eee;border-radius:3px}.milestoneContainer .avatar-bubble .form-actions{margin-top:10px}.milestoneContainer .bubble .file-box{margin-bottom:0}.milestoneContainer .avatar img{border-radius:3px}.milestoneContainer .starting-comment{margin:0;background:#fff;padding:0px;border:1px solid #CACACA;border-radius:2px}.milestoneContainer .normal-comment .starting-comment{padding:10px}.milestoneContainer .starting-comment .content-title{border-bottom:none}.milestoneContainer .starting-comment h2.content-title{margin:0 0 -6px;font-size:20px;font-weight:bold}.milestoneContainer .starting-comment .body p.author{margin:0px 0 0;color:#666;font-size:12px}.milestoneContainer .starting-comment p.author a{font-weight:bold;color:#666}.milestoneContainer .new-comments .starting-comment .body{padding:0 10px;font-size:13px;background:#fff}.milestoneContainer .comment .cmeta{height:33px;padding:0 10px;border-bottom:1px solid #CCC;background-color:#F8F8F8;background-image:-webkit-linear-gradient(#F8F8F8, #E1E1E1);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8f8f8',endColorstr='#e1e1e1',GradientType=0)"}.milestoneContainer .comment .cmeta p.author{margin:0;float:left;max-width:600px;font-size:12px;height:33px;line-height:33px;text-shadow:1px 1px 0 rgba(255,255,255,0.7);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.milestoneContainer .comment .cmeta .icon{display:inline-block;margin-top:-2px;margin-left:0px;width:16px;height:16px;vertical-align:middle;background:url('../images/icons.png') 0 0 no-repeat}.milestoneContainer .comment .cmeta p.author a{color:#222}.milestoneContainer .comment .cmeta p.info{float:right;margin:0;font-size:11px;height:33px;line-height:33px}.milestoneContainer .comment>.body{position:relative;padding:10px;color:#333;font-size:12px;background:#FBFBFB} -------------------------------------------------------------------------------- /build/stylesheets/screen.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6,html,body{font-family:'Microsoft YaHei','Helvetica Neue', 'Helvetica', 'Arial', 'sans-serif';font-size:14px}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{font-weight:bold}.content code,.content pre{font-family:Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, serif;font-size:12px;line-height:1.5}.content code{word-break:break-all;word-break:break-word;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.highlight table td{padding:5px}.highlight table pre{margin:0}.highlight,.highlight .w{color:#f8f8f2;background-color:#272822}.highlight .err{color:#151515;background-color:#ac4142}.highlight .c,.highlight .cd,.highlight .cm,.highlight .c1,.highlight .cs{color:#505050}.highlight .cp{color:#f4bf75}.highlight .nt{color:#f4bf75}.highlight .o,.highlight .ow{color:#d0d0d0}.highlight .p,.highlight .pi{color:#d0d0d0}.highlight .gi{color:#90a959}.highlight .gd{color:#ac4142}.highlight .gh{color:#6a9fb5;background-color:#151515;font-weight:bold}.highlight .k,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .kv{color:#aa759f}.highlight .kc{color:#d28445}.highlight .kt{color:#d28445}.highlight .kd{color:#d28445}.highlight .s,.highlight .sb,.highlight .sc,.highlight .sd,.highlight .s2,.highlight .sh,.highlight .sx,.highlight .s1{color:#90a959}.highlight .sr{color:#75b5aa}.highlight .si{color:#8f5536}.highlight .se{color:#8f5536}.highlight .nn{color:#f4bf75}.highlight .nc{color:#f4bf75}.highlight .no{color:#f4bf75}.highlight .na{color:#6a9fb5}.highlight .m,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .il,.highlight .mo,.highlight .mb,.highlight .mx{color:#90a959}.highlight .ss{color:#90a959}.highlight .c,.highlight .cm,.highlight .c1,.highlight .cs{color:#909090}.highlight,.highlight .w{background-color:#292929}@font-face{font-family:'slate';src:url("../fonts/slate.eot?-syv14m");src:url("../fonts/slate.eot?#iefix-syv14m") format("embedded-opentype"),url("../fonts/slate.woff2?-syv14m") format("woff2"),url("../fonts/slate.woff?-syv14m") format("woff"),url("../fonts/slate.ttf?-syv14m") format("truetype"),url("../fonts/slate.svg?-syv14m#slate") format("svg");font-weight:normal;font-style:normal}.content aside.warning:before,.content aside.notice:before,.content aside.success:before,.tocify-wrapper>.search:before{font-family:'slate';speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1}.content aside.warning:before{content:"\e600"}.content aside.notice:before{content:"\e602"}.content aside.success:before{content:"\e606"}.tocify-wrapper>.search:before{content:"\e607"}.navbar{width:100%}nav{display:-webkit-flex;display:-ms-flexbox;display:flex;position:absolute;top:0;left:0}@media (min-width: 48em){nav{-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}}nav .logo-container{width:100%}@media (min-width: 48em){nav .logo-container{width:auto}}nav .logo{height:60px;width:200px;margin:0 auto;background-repeat:no-repeat;background-position:center center;background-size:100%;color:#fff;font-size:28px;line-height:60px;text-shadow:none;position:relative}@media (min-width: 48em){nav .logo{display:inline-block;margin:6px 0 0 15px}}nav li{list-style:none !important;color:#FFF;padding:10px;font-size:12px;letter-spacing:1px;font-family:'proxima-nova';font-weight:bold;text-transform:uppercase;text-decoration:none}.caret{margin-top:4px;margin-left:4px;display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid white;border-right:4px solid transparent;border-left:4px solid transparent;content:""}nav li>a:only-child:after{content:''}nav li{list-style:none !important;color:#FFF;padding:10px;text-decoration:none}nav ul{padding:0;margin-top:20px;display:none}@media (min-width: 48em){nav ul{display:block}}nav ul li{list-style:none;float:left}nav ul li a{color:#fff;padding:10px;text-decoration:none}nav ul li ul{display:none}nav ul li:hover ul{position:absolute;z-index:1000;margin-top:10px;margin-left:8px;list-style:none;display:list-item !important;border-radius:2px;background-color:white;box-shadow:0px 2px 3px rgba(0,0,0,0.25)}nav ul li:hover ul:before{display:block;position:absolute;top:-5px;left:12px;width:10px;height:10px;background-color:white;content:'';-webkit-transform:rotate(45deg);transform:rotate(45deg)}nav ul li ul li a{text-transform:none;letter-spacing:0;color:#3e4552;font-family:'Microsoft YaHei','Helvetica Neue', 'Helvetica', 'Arial', 'sans-serif';font-weight:500}nav ul li:hover ul li{padding-left:0px;float:none}html,body{color:#333;padding:0;margin:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-color:#eaf2f6;height:100%;-webkit-text-size-adjust:none}#toc>ul>li>a>span{float:right;background-color:#2484FF;border-radius:40px;width:20px}.tocify-wrapper{padding-top:5px;transition:left 0.3s ease-in-out;overflow-y:auto;overflow-x:hidden;position:fixed;z-index:30;top:0;left:0;bottom:0;width:230px;background-color:#393939;font-size:14px;font-weight:bold}.tocify-wrapper .lang-selector{display:none}.tocify-wrapper .lang-selector a{padding-top:0.5em;padding-bottom:0.5em}.tocify-wrapper>img{display:block}.tocify-wrapper>.search{position:relative}.tocify-wrapper>.search input{background:#393939;border-width:0 0 1px 0;border-color:#666;padding:6px 0 6px 20px;box-sizing:border-box;margin:10px 15px;width:200px;outline:none;color:#fff;border-radius:0}.tocify-wrapper>.search:before{position:absolute;top:17px;left:15px;color:#fff}.tocify-wrapper img+.tocify{margin-top:20px}.tocify-wrapper .search-results{margin-top:0;box-sizing:border-box;height:0;overflow-y:auto;overflow-x:hidden;transition-property:height, margin;transition-duration:180ms;transition-timing-function:ease-in-out;background:linear-gradient(to bottom, rgba(0,0,0,0.2), transparent 8px),linear-gradient(to top, rgba(0,0,0,0.2), transparent 8px),linear-gradient(to bottom, #000, transparent 1.5px),linear-gradient(to top, #939393, rgba(147,147,147,0) 1.5px),#262626}.tocify-wrapper .search-results.visible{height:30%;margin-bottom:1em}.tocify-wrapper .search-results li{margin:1em 15px;line-height:1}.tocify-wrapper .search-results a{color:#fff;text-decoration:none}.tocify-wrapper .search-results a:hover{text-decoration:underline}.tocify-wrapper .tocify-item>a,.tocify-wrapper .toc-footer li{padding:0 15px 0 15px;display:block;overflow-x:hidden;white-space:nowrap;text-overflow:ellipsis}.tocify-wrapper ul,.tocify-wrapper li{list-style:none;margin:0;padding:0;line-height:28px}.tocify-wrapper li{color:#fff;transition-property:background;transition-timing-function:linear;transition-duration:230ms}.tocify-wrapper .tocify-focus{box-shadow:0px 1px 0px #000;background-color:#2467af;color:#fff}.tocify-wrapper .tocify-subheader{display:none;background-color:#262626;font-weight:500;background:linear-gradient(to bottom, rgba(0,0,0,0.2), transparent 8px),linear-gradient(to top, rgba(0,0,0,0.2), transparent 8px),linear-gradient(to bottom, #000, transparent 1.5px),linear-gradient(to top, #939393, rgba(147,147,147,0) 1.5px),#262626}.tocify-wrapper .tocify-subheader .tocify-item>a{padding-left:25px;font-size:13px}.tocify-wrapper .tocify-subheader>li:last-child{box-shadow:none}.tocify-wrapper .tocify-subheader .tocify-subheader .tocify-item>a{padding-left:35px;font-size:13px}.tocify-wrapper .toc-footer{padding:1em 0;margin-top:1em;border-top:1px dashed #666}.tocify-wrapper .toc-footer li,.tocify-wrapper .toc-footer a{color:#fff;text-decoration:none}.tocify-wrapper .toc-footer a:hover{text-decoration:underline}.tocify-wrapper .toc-footer li{font-size:0.8em;line-height:1.7;text-decoration:none}#nav-button{padding:0 1.5em 5em 0;display:none;position:fixed;top:0;left:0;z-index:100;color:#000;text-decoration:none;font-weight:bold;opacity:0.7;line-height:16px;transition:left 0.3s ease-in-out}#nav-button span{display:block;padding:6px 6px 6px;background-color:rgba(234,242,246,0.7);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:rotate(-90deg) translate(-100%, 0);transform:rotate(-90deg) translate(-100%, 0);border-radius:0 0 0 5px}#nav-button img{height:16px;vertical-align:bottom}#nav-button:hover{opacity:1}#nav-button.open{left:230px}.page-wrapper{margin-left:230px;position:relative;z-index:10;background-color:#eaf2f6;min-height:100%;padding-bottom:1px}.page-wrapper .dark-box{width:30%;background-color:#393939;position:absolute;right:0;top:0;bottom:0}.page-wrapper .lang-selector{position:fixed;z-index:50;border-bottom:5px solid #393939}.lang-selector{background-color:#222;width:100%;font-weight:bold}.lang-selector a{display:block;float:left;color:#fff;text-decoration:none;padding:0 10px;line-height:30px;outline:0}.lang-selector a:active,.lang-selector a:focus{background-color:#111;color:#fff}.lang-selector a.active{background-color:#393939;color:#fff}.lang-selector:after{content:'';clear:both;display:block}.content{position:relative;z-index:30;margin-top:0px}.content:after{content:'';display:block;clear:both}.content>h1,.content>h2,.content>h3,.content>h4,.content>h5,.content>h6,.content>p,.content>table,.content>ul,.content>ol,.content>aside,.content>dl{margin-right:30%;padding:0 28px;box-sizing:border-box;display:block;text-shadow:0px 1px 0px #fff}.content>ul,.content>ol{padding-left:43px}.content>h1,.content>h2,.content>div{clear:both}.content h1{font-size:24px;padding-top:0.83em;padding-bottom:0.83em;border-bottom:1px solid #ccc;margin-bottom:2em;margin-top:2em;border-top:1px solid #ddd;background-image:linear-gradient(to bottom, #fff, #f9f9f9)}.content h1:first-child,.content div:first-child+h1{border-top-width:0;margin-top:0}.content h2{font-size:20px;margin-top:0.8em;margin-bottom:0.8em;border-top:1px solid #ccc;border-bottom:1px solid #ccc;padding-top:0.75em;padding-bottom:0.75em;background-image:linear-gradient(to bottom, #fff, #f9f9f9)}.content h1+h2,.content h1+div+h2{margin-top:-21px;border-top:none}.content h3,.content h4,.content h5,.content h6{font-size:16px;margin-top:1em;margin-bottom:0.8em}.content h4,.content h5,.content h6{font-size:14px}.content h5,.content h6{font-size:13px}.content hr{margin:2em 0;border-top:2px solid #393939;border-bottom:2px solid #eaf2f6}.content table{margin-bottom:1em;overflow:auto}.content table th,.content table td{text-align:left;vertical-align:top;line-height:1.6}.content table th{padding:5px 10px;border-bottom:1px solid #ccc;vertical-align:bottom}.content table td{padding:10px}.content table tr:last-child{border-bottom:1px solid #ccc}.content table tr:nth-child(odd)>td{background-color:#f9fbfc}.content table tr:nth-child(even)>td{background-color:#f3f7fa}.content dt{font-weight:bold}.content dd{margin-left:15px}.content p,.content li,.content dt,.content dd{line-height:1.6;margin-top:0}.content img{max-width:100%}.content code{background-color:rgba(0,0,0,0.05);padding:3px;border-radius:3px}.content pre>code{background-color:transparent;padding:0}.content aside{padding-top:1em;padding-bottom:1em;text-shadow:0 1px 0 #c6dde9;margin-top:1.5em;margin-bottom:1.5em;background:#8fbcd4;line-height:1.6}.content aside.warning{background-color:#c97a7e;text-shadow:0 1px 0 #dfb0b3}.content aside.success{background-color:#6ac174;text-shadow:0 1px 0 #a0d7a6}.content aside:before{vertical-align:middle;padding-right:0.5em;font-size:14px}.content .search-highlight{padding:2px;margin:-2px;border-radius:4px;border:1px solid #F7E633;text-shadow:1px 1px 0 #666;background:linear-gradient(to top left, #f7e633 0%, #f1d32f 100%)}.content pre,.content blockquote{background-color:#292929;color:#fff;padding:2em 28px;margin:0;width:30%;float:right;clear:right;box-sizing:border-box;text-shadow:0px 1px 2px rgba(0,0,0,0.4)}.content pre>p,.content blockquote>p{margin:0}.content pre a,.content blockquote a{color:#fff;text-decoration:none;border-bottom:dashed 1px #ccc}.content blockquote>p{background-color:#1c1c1c;border-radius:5px;padding:13px;color:#ccc;border-top:1px solid #000;border-bottom:1px solid #404040}@media (max-width: 930px){.tocify-wrapper{left:-230px}.tocify-wrapper.open{left:0}.page-wrapper{margin-left:0}#nav-button{display:block}.tocify-wrapper .tocify-item>a{padding-top:0.3em;padding-bottom:0.3em}}@media (max-width: 700px){.dark-box{display:none}.navbar-container{display:none}.content>h1,.content>h2,.content>h3,.content>h4,.content>h5,.content>h6,.content>p,.content>table,.content>ul,.content>ol,.content>aside,.content>dl{margin-right:0}.tocify-wrapper .lang-selector{display:block}.page-wrapper .lang-selector{display:none}.content pre,.content blockquote{width:auto;float:none}.content>pre+h1,.content>blockquote+h1,.content>pre+h2,.content>blockquote+h2,.content>pre+h3,.content>blockquote+h3,.content>pre+h4,.content>blockquote+h4,.content>pre+h5,.content>blockquote+h5,.content>pre+h6,.content>blockquote+h6,.content>pre+p,.content>blockquote+p,.content>pre+table,.content>blockquote+table,.content>pre+ul,.content>blockquote+ul,.content>pre+ol,.content>blockquote+ol,.content>pre+aside,.content>blockquote+aside,.content>pre+dl,.content>blockquote+dl{margin-top:28px}} -------------------------------------------------------------------------------- /build/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body{background:url(../images/bg.jpg);text-shadow:1px 1px 0px white;margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333}h1,h2,h3,h4,h5,h6{margin:0;font-family:inherit;font-weight:bold;color:inherit;text-rendering:optimizelegibility}h1{font-size:30px;line-height:36px;padding:50px 0 20px}#websiteContainer{background:url(../images/bg2.png) top left no-repeat;height:529px}.containerRelease{width:780px;margin-left:230px} -------------------------------------------------------------------------------- /config.rb: -------------------------------------------------------------------------------- 1 | # Markdown 2 | set :markdown_engine, :redcarpet 3 | set :markdown, 4 | fenced_code_blocks: true, 5 | smartypants: true, 6 | disable_indented_code_blocks: true, 7 | prettify: true, 8 | tables: true, 9 | with_toc_data: true, 10 | no_intra_emphasis: true 11 | 12 | # Assets 13 | set :css_dir, 'stylesheets' 14 | set :js_dir, 'javascripts' 15 | set :images_dir, 'images' 16 | set :fonts_dir, 'fonts' 17 | 18 | # Activate the syntax highlighter 19 | activate :syntax 20 | 21 | activate :autoprefixer do |config| 22 | config.browsers = ['last 2 version', 'Firefox ESR'] 23 | config.cascade = false 24 | config.inline = true 25 | end 26 | 27 | # Github pages require relative links 28 | activate :relative_assets 29 | set :relative_links, true 30 | 31 | # Build Configuration 32 | configure :build do 33 | activate :minify_css 34 | activate :minify_javascript 35 | # activate :relative_assets 36 | # activate :asset_hash 37 | # activate :gzip 38 | end 39 | -------------------------------------------------------------------------------- /font-selection.json: -------------------------------------------------------------------------------- 1 | { 2 | "IcoMoonType": "selection", 3 | "icons": [ 4 | { 5 | "icon": { 6 | "paths": [ 7 | "M438.857 73.143q119.429 0 220.286 58.857t159.714 159.714 58.857 220.286-58.857 220.286-159.714 159.714-220.286 58.857-220.286-58.857-159.714-159.714-58.857-220.286 58.857-220.286 159.714-159.714 220.286-58.857zM512 785.714v-108.571q0-8-5.143-13.429t-12.571-5.429h-109.714q-7.429 0-13.143 5.714t-5.714 13.143v108.571q0 7.429 5.714 13.143t13.143 5.714h109.714q7.429 0 12.571-5.429t5.143-13.429zM510.857 589.143l10.286-354.857q0-6.857-5.714-10.286-5.714-4.571-13.714-4.571h-125.714q-8 0-13.714 4.571-5.714 3.429-5.714 10.286l9.714 354.857q0 5.714 5.714 10t13.714 4.286h105.714q8 0 13.429-4.286t6-10z" 8 | ], 9 | "attrs": [], 10 | "isMulticolor": false, 11 | "tags": [ 12 | "exclamation-circle" 13 | ], 14 | "defaultCode": 61546, 15 | "grid": 14 16 | }, 17 | "attrs": [], 18 | "properties": { 19 | "id": 100, 20 | "order": 4, 21 | "prevSize": 28, 22 | "code": 58880, 23 | "name": "exclamation-sign", 24 | "ligatures": "" 25 | }, 26 | "setIdx": 0, 27 | "iconIdx": 0 28 | }, 29 | { 30 | "icon": { 31 | "paths": [ 32 | "M585.143 786.286v-91.429q0-8-5.143-13.143t-13.143-5.143h-54.857v-292.571q0-8-5.143-13.143t-13.143-5.143h-182.857q-8 0-13.143 5.143t-5.143 13.143v91.429q0 8 5.143 13.143t13.143 5.143h54.857v182.857h-54.857q-8 0-13.143 5.143t-5.143 13.143v91.429q0 8 5.143 13.143t13.143 5.143h256q8 0 13.143-5.143t5.143-13.143zM512 274.286v-91.429q0-8-5.143-13.143t-13.143-5.143h-109.714q-8 0-13.143 5.143t-5.143 13.143v91.429q0 8 5.143 13.143t13.143 5.143h109.714q8 0 13.143-5.143t5.143-13.143zM877.714 512q0 119.429-58.857 220.286t-159.714 159.714-220.286 58.857-220.286-58.857-159.714-159.714-58.857-220.286 58.857-220.286 159.714-159.714 220.286-58.857 220.286 58.857 159.714 159.714 58.857 220.286z" 33 | ], 34 | "attrs": [], 35 | "isMulticolor": false, 36 | "tags": [ 37 | "info-circle" 38 | ], 39 | "defaultCode": 61530, 40 | "grid": 14 41 | }, 42 | "attrs": [], 43 | "properties": { 44 | "id": 85, 45 | "order": 3, 46 | "name": "info-sign", 47 | "prevSize": 28, 48 | "code": 58882 49 | }, 50 | "setIdx": 0, 51 | "iconIdx": 2 52 | }, 53 | { 54 | "icon": { 55 | "paths": [ 56 | "M733.714 419.429q0-16-10.286-26.286l-52-51.429q-10.857-10.857-25.714-10.857t-25.714 10.857l-233.143 232.571-129.143-129.143q-10.857-10.857-25.714-10.857t-25.714 10.857l-52 51.429q-10.286 10.286-10.286 26.286 0 15.429 10.286 25.714l206.857 206.857q10.857 10.857 25.714 10.857 15.429 0 26.286-10.857l310.286-310.286q10.286-10.286 10.286-25.714zM877.714 512q0 119.429-58.857 220.286t-159.714 159.714-220.286 58.857-220.286-58.857-159.714-159.714-58.857-220.286 58.857-220.286 159.714-159.714 220.286-58.857 220.286 58.857 159.714 159.714 58.857 220.286z" 57 | ], 58 | "attrs": [], 59 | "isMulticolor": false, 60 | "tags": [ 61 | "check-circle" 62 | ], 63 | "defaultCode": 61528, 64 | "grid": 14 65 | }, 66 | "attrs": [], 67 | "properties": { 68 | "id": 83, 69 | "order": 9, 70 | "prevSize": 28, 71 | "code": 58886, 72 | "name": "ok-sign" 73 | }, 74 | "setIdx": 0, 75 | "iconIdx": 6 76 | }, 77 | { 78 | "icon": { 79 | "paths": [ 80 | "M658.286 475.429q0-105.714-75.143-180.857t-180.857-75.143-180.857 75.143-75.143 180.857 75.143 180.857 180.857 75.143 180.857-75.143 75.143-180.857zM950.857 950.857q0 29.714-21.714 51.429t-51.429 21.714q-30.857 0-51.429-21.714l-196-195.429q-102.286 70.857-228 70.857-81.714 0-156.286-31.714t-128.571-85.714-85.714-128.571-31.714-156.286 31.714-156.286 85.714-128.571 128.571-85.714 156.286-31.714 156.286 31.714 128.571 85.714 85.714 128.571 31.714 156.286q0 125.714-70.857 228l196 196q21.143 21.143 21.143 51.429z" 81 | ], 82 | "width": 951, 83 | "attrs": [], 84 | "isMulticolor": false, 85 | "tags": [ 86 | "search" 87 | ], 88 | "defaultCode": 61442, 89 | "grid": 14 90 | }, 91 | "attrs": [], 92 | "properties": { 93 | "id": 2, 94 | "order": 1, 95 | "prevSize": 28, 96 | "code": 58887, 97 | "name": "icon-search" 98 | }, 99 | "setIdx": 0, 100 | "iconIdx": 7 101 | } 102 | ], 103 | "height": 1024, 104 | "metadata": { 105 | "name": "slate", 106 | "license": "SIL OFL 1.1" 107 | }, 108 | "preferences": { 109 | "showGlyphs": true, 110 | "showQuickUse": true, 111 | "showQuickUse2": true, 112 | "showSVGs": true, 113 | "fontPref": { 114 | "prefix": "icon-", 115 | "metadata": { 116 | "fontFamily": "slate", 117 | "majorVersion": 1, 118 | "minorVersion": 0, 119 | "description": "Based on FontAwesome", 120 | "license": "SIL OFL 1.1" 121 | }, 122 | "metrics": { 123 | "emSize": 1024, 124 | "baseline": 6.25, 125 | "whitespace": 50 126 | }, 127 | "resetPoint": 58880, 128 | "showSelector": false, 129 | "selector": "class", 130 | "classSelector": ".icon", 131 | "showMetrics": false, 132 | "showMetadata": true, 133 | "showVersion": true, 134 | "ie7": false 135 | }, 136 | "imagePref": { 137 | "prefix": "icon-", 138 | "png": true, 139 | "useClassSelector": true, 140 | "color": 4473924, 141 | "bgColor": 16777215 142 | }, 143 | "historySize": 100, 144 | "showCodes": true, 145 | "gridSize": 16, 146 | "showLiga": false 147 | } 148 | } 149 | -------------------------------------------------------------------------------- /fonts/slate.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddtalk/dingTalkDoc/ebfe662a78a81a67bd00733b850c25d0322a0e10/fonts/slate.eot -------------------------------------------------------------------------------- /fonts/slate.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Generated by IcoMoon 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /fonts/slate.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddtalk/dingTalkDoc/ebfe662a78a81a67bd00733b850c25d0322a0e10/fonts/slate.ttf -------------------------------------------------------------------------------- /fonts/slate.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddtalk/dingTalkDoc/ebfe662a78a81a67bd00733b850c25d0322a0e10/fonts/slate.woff -------------------------------------------------------------------------------- /fonts/slate.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddtalk/dingTalkDoc/ebfe662a78a81a67bd00733b850c25d0322a0e10/fonts/slate.woff2 -------------------------------------------------------------------------------- /gettoken: -------------------------------------------------------------------------------- 1 | {"errcode":40089,"errmsg":"不合法的corpid或corpsecret"} -------------------------------------------------------------------------------- /images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddtalk/dingTalkDoc/ebfe662a78a81a67bd00733b850c25d0322a0e10/images/favicon.ico -------------------------------------------------------------------------------- /images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddtalk/dingTalkDoc/ebfe662a78a81a67bd00733b850c25d0322a0e10/images/logo.png -------------------------------------------------------------------------------- /images/navbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddtalk/dingTalkDoc/ebfe662a78a81a67bd00733b850c25d0322a0e10/images/navbar.png -------------------------------------------------------------------------------- /javascripts/lib/marked.js: -------------------------------------------------------------------------------- 1 | /** 2 | * marked - A markdown parser (https://github.com/chjj/marked) 3 | * Copyright (c) 2011-2012, Christopher Jeffrey. (MIT Licensed) 4 | */ 5 | (function(){function e(){var e="(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+";return e}function t(e){return e=e.source,function t(n,r){return n?(e=e.replace(n,r.source||r),t):new RegExp(e)}}function n(){}var r={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:n,hr:/^( *[\-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,lheading:/^([^\n]+)\n *(=|-){3,} *\n*/,blockquote:/^( *>[^\n]+(\n[^\n]+)*\n*)+/,list:/^( *)([*+-]|\d+\.) [^\0]+?(?:\n{2,}(?! )(?!\1bullet)\n*|\s*$)/,html:/^ *(?:comment|closed|closing) *(?:\n{2,}|\s*$)/,def:/^ *\[([^\]]+)\]: *([^\s]+)(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,paragraph:/^([^\n]+\n?(?!body))+\n*/,text:/^[^\n]+/};r.list=t(r.list)("bullet",/(?:[*+-](?!(?: *[-*]){2,})|\d+\.)/)(),r.html=t(r.html)("comment",//)("closed",/<(tag)[^\0]+?<\/\1>/)("closing",/])*?>/)(/tag/g,e())(),r.paragraph=function(){var t=r.paragraph.source,n=[];return function s(e){return e=r[e]?r[e].source:e,n.push(e.replace(/(^|[^\[])\^/g,"$1")),s}("hr")("heading")("lheading")("blockquote")("<"+e())("def"),new RegExp(t.replace("body",n.join("|")))}(),r.normal={fences:r.fences,paragraph:r.paragraph},r.gfm={fences:/^ *``` *(\w+)? *\n([^\0]+?)\s*``` *(?:\n+|$)/,paragraph:/^/},r.gfm.paragraph=t(r.paragraph)("(?!","(?!"+r.gfm.fences.source.replace(/(^|[^\[])\^/g,"$1")+"|")(),r.lexer=function(e){var t=[];return t.links={},e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," "),r.token(e,t,!0)},r.token=function(e,t,n){for(var s,l,i,a,c,g,o,e=e.replace(/^ +$/gm,"");e;)if((i=r.newline.exec(e))&&(e=e.substring(i[0].length),i[0].length>1&&t.push({type:"space"})),i=r.code.exec(e))e=e.substring(i[0].length),i=i[0].replace(/^ {4}/gm,""),t.push({type:"code",text:f.pedantic?i:i.replace(/\n+$/,"")});else if(i=r.fences.exec(e))e=e.substring(i[0].length),t.push({type:"code",lang:i[1],text:i[2]});else if(i=r.heading.exec(e))e=e.substring(i[0].length),t.push({type:"heading",depth:i[1].length,text:i[2]});else if(i=r.lheading.exec(e))e=e.substring(i[0].length),t.push({type:"heading",depth:"="===i[2]?1:2,text:i[1]});else if(i=r.hr.exec(e))e=e.substring(i[0].length),t.push({type:"hr"});else if(i=r.blockquote.exec(e))e=e.substring(i[0].length),t.push({type:"blockquote_start"}),i=i[0].replace(/^ *> ?/gm,""),r.token(i,t,n),t.push({type:"blockquote_end"});else if(i=r.list.exec(e)){for(e=e.substring(i[0].length),t.push({type:"list_start",ordered:isFinite(i[2])}),i=i[0].match(/^( *)([*+-]|\d+\.) [^\n]*(?:\n(?!\1(?:[*+-]|\d+\.) )[^\n]*)*/gm),s=!1,o=i.length,g=0;o>g;g++)a=i[g],c=a.length,a=a.replace(/^ *([*+-]|\d+\.) +/,""),~a.indexOf("\n ")&&(c-=a.length,a=f.pedantic?a.replace(/^ {1,4}/gm,""):a.replace(new RegExp("^ {1,"+c+"}","gm"),"")),l=s||/\n\n(?!\s*$)/.test(a),g!==o-1&&(s="\n"===a[a.length-1],l||(l=s)),t.push({type:l?"loose_item_start":"list_item_start"}),r.token(a,t),t.push({type:"list_item_end"});t.push({type:"list_end"})}else(i=r.html.exec(e))?(e=e.substring(i[0].length),t.push({type:"html",pre:"pre"===i[1],text:i[0]})):n&&(i=r.def.exec(e))?(e=e.substring(i[0].length),t.links[i[1].toLowerCase()]={href:i[2],title:i[3]}):n&&(i=r.paragraph.exec(e))?(e=e.substring(i[0].length),t.push({type:"paragraph",text:i[0]})):(i=r.text.exec(e))&&(e=e.substring(i[0].length),t.push({type:"text",text:i[0]}));return t};var s={escape:/^\\([\\`*{}\[\]()#+\-.!_>])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:n,tag:/^|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([^\0]+?)__(?!_)|^\*\*([^\0]+?)\*\*(?!\*)/,em:/^\b_((?:__|[^\0])+?)_\b|^\*((?:\*\*|[^\0])+?)\*(?!\*)/,code:/^(`+)([^\0]*?[^`])\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,text:/^[^\0]+?(?=[\\?(?:\s+['"]([^\0]*?)['"])?\s*/,s.link=t(s.link)("inside",s._linkInside)("href",s._linkHref)(),s.reflink=t(s.reflink)("inside",s._linkInside)(),s.normal={url:s.url,strong:s.strong,em:s.em,text:s.text},s.pedantic={strong:/^__(?=\S)([^\0]*?\S)__(?!_)|^\*\*(?=\S)([^\0]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([^\0]*?\S)_(?!_)|^\*(?=\S)([^\0]*?\S)\*(?!\*)/},s.gfm={url:/^(https?:\/\/[^\s]+[^.,:;"')\]\s])/,text:/^[^\0]+?(?=[\\'+n+"";else if(i=s.url.exec(e))e=e.substring(i[0].length),n=u(i[1]),r=n,c+=''+n+"";else if(i=s.tag.exec(e))e=e.substring(i[0].length),c+=f.sanitize?u(i[0]):i[0];else if(i=s.link.exec(e))e=e.substring(i[0].length),c+=a(i,{href:i[2],title:i[3]});else if((i=s.reflink.exec(e))||(i=s.nolink.exec(e))){if(e=e.substring(i[0].length),t=(i[2]||i[1]).replace(/\s+/g," "),t=g[t.toLowerCase()],!t||!t.href){c+=i[0][0],e=i[0].substring(1)+e;continue}c+=a(i,t)}else(i=s.strong.exec(e))?(e=e.substring(i[0].length),c+=""+s.lexer(i[2]||i[1])+""):(i=s.em.exec(e))?(e=e.substring(i[0].length),c+=""+s.lexer(i[2]||i[1])+""):(i=s.code.exec(e))?(e=e.substring(i[0].length),c+=""+u(i[2],!0)+""):(i=s.br.exec(e))?(e=e.substring(i[0].length),c+="
    "):(i=s.text.exec(e))&&(e=e.substring(i[0].length),c+=u(i[0]));return c};var l,i,a=function(e,t){return"!"!==e[0][0]?'"+s.lexer(e[1])+"":''+u(e[1])+'"},c=function(){return i=l.pop()},g=function(){switch(i.type){case"space":return"";case"hr":return"
    \n";case"heading":return""+s.lexer(i.text)+"\n";case"code":return"
    "+(i.escaped?i.text:u(i.text,!0))+"
    \n";case"blockquote_start":for(var e="";"blockquote_end"!==c().type;)e+=g();return"
    \n"+e+"
    \n";case"list_start":for(var t=i.ordered?"ol":"ul",e="";"list_end"!==c().type;)e+=g();return"<"+t+">\n"+e+"\n";case"list_item_start":for(var e="";"list_item_end"!==c().type;)e+="text"===i.type?o():g();return"
  • "+e+"
  • \n";case"loose_item_start":for(var e="";"list_item_end"!==c().type;)e+=g();return"
  • "+e+"
  • \n";case"html":return f.sanitize?s.lexer(i.text):i.pre||f.pedantic?i.text:s.lexer(i.text);case"paragraph":return"

    "+s.lexer(i.text)+"

    \n";case"text":return"

    "+o()+"

    \n"}},o=function(){for(var e,t=i.text;(e=l[l.length-1])&&"text"===e.type;)t+="\n"+c().text;return s.lexer(t)},p=function(e){l=e.reverse();for(var t="";c();)t+=g();return l=null,i=null,t},u=function(e,t){return e.replace(t?/&/g:/&(?!#?\w+;)/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")},h=function(e){for(var t,n="",r=e.length,s=0;r>s;s++)t=e.charCodeAt(s),Math.random()>.5&&(t="x"+t.toString(16)),n+="&#"+t+";";return n};n.exec=n;var f,d,x=function(e,t){return m(t),p(r.lexer(e))},m=function(e){e||(e=d),f!==e&&(f=e,f.gfm?(r.fences=r.gfm.fences,r.paragraph=r.gfm.paragraph,s.text=s.gfm.text,s.url=s.gfm.url):(r.fences=r.normal.fences,r.paragraph=r.normal.paragraph,s.text=s.normal.text,s.url=s.normal.url),f.pedantic?(s.em=s.pedantic.em,s.strong=s.pedantic.strong):(s.em=s.normal.em,s.strong=s.normal.strong))};x.options=x.setOptions=function(e){d=e,m(e)},x.options({gfm:!0,pedantic:!1,sanitize:!1}),x.parser=function(e,t){return m(t),p(e)},x.lexer=function(e,t){return m(t),r.lexer(e)},x.parse=x,"undefined"!=typeof module?module.exports=x:this.marked=x}).call(this); -------------------------------------------------------------------------------- /javascripts/lib/modernizr-2.0.6.min.js: -------------------------------------------------------------------------------- 1 | /* Modernizr 2.0.6 | MIT & BSD 2 | * Contains: All core tests, html5shiv, yepnope, respond.js. Get your own custom build at www.modernizr.com/download/ 3 | */ 4 | 5 | ;window.Modernizr=function(a,b,c){function I(){e.input=function(a){for(var b=0,c=a.length;b",a,""].join(""),k.id=i,k.innerHTML+=f,g.appendChild(k),h=c(k,a),k.parentNode.removeChild(k);return!!h},w=function(b){if(a.matchMedia)return matchMedia(b).matches;var c;v("@media "+b+" { #"+i+" { position: absolute; } }",function(b){c=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle).position=="absolute"});return c},x=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=D(e[d],"function"),D(e[d],c)||(e[d]=c),e.removeAttribute(d))),e=null;return f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),y,z={}.hasOwnProperty,A;!D(z,c)&&!D(z.call,c)?A=function(a,b){return z.call(a,b)}:A=function(a,b){return b in a&&D(a.constructor.prototype[b],c)};var H=function(c,d){var f=c.join(""),g=d.length;v(f,function(c,d){var f=b.styleSheets[b.styleSheets.length-1],h=f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"",i=c.childNodes,j={};while(g--)j[i[g].id]=i[g];e.touch="ontouchstart"in a||j.touch.offsetTop===9,e.csstransforms3d=j.csstransforms3d.offsetLeft===9,e.generatedcontent=j.generatedcontent.offsetHeight>=1,e.fontface=/src/i.test(h)&&h.indexOf(d.split(" ")[0])===0},g,d)}(['@font-face {font-family:"font";src:url("https://")}',["@media (",o.join("touch-enabled),("),i,")","{#touch{top:9px;position:absolute}}"].join(""),["@media (",o.join("transform-3d),("),i,")","{#csstransforms3d{left:9px;position:absolute}}"].join(""),['#generatedcontent:after{content:"',m,'";visibility:hidden}'].join("")],["fontface","touch","csstransforms3d","generatedcontent"]);r.flexbox=function(){function c(a,b,c,d){a.style.cssText=o.join(b+":"+c+";")+(d||"")}function a(a,b,c,d){b+=":",a.style.cssText=(b+o.join(c+";"+b)).slice(0,-b.length)+(d||"")}var d=b.createElement("div"),e=b.createElement("div");a(d,"display","box","width:42px;padding:0;"),c(e,"box-flex","1","width:10px;"),d.appendChild(e),g.appendChild(d);var f=e.offsetWidth===42;d.removeChild(e),g.removeChild(d);return f},r.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},r.canvastext=function(){return!!e.canvas&&!!D(b.createElement("canvas").getContext("2d").fillText,"function")},r.webgl=function(){return!!a.WebGLRenderingContext},r.touch=function(){return e.touch},r.geolocation=function(){return!!navigator.geolocation},r.postmessage=function(){return!!a.postMessage},r.websqldatabase=function(){var b=!!a.openDatabase;return b},r.indexedDB=function(){for(var b=-1,c=p.length;++b7)},r.history=function(){return!!a.history&&!!history.pushState},r.draganddrop=function(){return x("dragstart")&&x("drop")},r.websockets=function(){for(var b=-1,c=p.length;++b";return(a.firstChild&&a.firstChild.namespaceURI)==q.svg},r.smil=function(){return!!b.createElementNS&&/SVG/.test(n.call(b.createElementNS(q.svg,"animate")))},r.svgclippaths=function(){return!!b.createElementNS&&/SVG/.test(n.call(b.createElementNS(q.svg,"clipPath")))};for(var J in r)A(r,J)&&(y=J.toLowerCase(),e[y]=r[J](),u.push((e[y]?"":"no-")+y));e.input||I(),e.addTest=function(a,b){if(typeof a=="object")for(var d in a)A(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return;b=typeof b=="boolean"?b:!!b(),g.className+=" "+(b?"":"no-")+a,e[a]=b}return e},B(""),j=l=null,a.attachEvent&&function(){var a=b.createElement("div");a.innerHTML="";return a.childNodes.length!==1}()&&function(a,b){function s(a){var b=-1;while(++b=u.minw)&&(!u.maxw||u.maxw&&l<=u.maxw))m[u.media]||(m[u.media]=[]),m[u.media].push(f[u.rules])}for(var t in g)g[t]&&g[t].parentNode===j&&j.removeChild(g[t]);for(var t in m){var v=c.createElement("style"),w=m[t].join("\n");v.type="text/css",v.media=t,v.styleSheet?v.styleSheet.cssText=w:v.appendChild(c.createTextNode(w)),n.appendChild(v),g.push(v)}j.insertBefore(n,o.nextSibling)}},s=function(a,b){var c=t();if(!!c){c.open("GET",a,!0),c.onreadystatechange=function(){c.readyState==4&&(c.status==200||c.status==304)&&b(c.responseText)};if(c.readyState==4)return;c.send()}},t=function(){var a=!1,b=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new XMLHttpRequest}],c=b.length;while(c--){try{a=b[c]()}catch(d){continue}break}return function(){return a}}();m(),respond.update=m,a.addEventListener?a.addEventListener("resize",u,!1):a.attachEvent&&a.attachEvent("onresize",u)}}(this,Modernizr.mq("only all")),function(a,b,c){function k(a){return!a||a=="loaded"||a=="complete"}function j(){var a=1,b=-1;while(p.length- ++b)if(p[b].s&&!(a=p[b].r))break;a&&g()}function i(a){var c=b.createElement("script"),d;c.src=a.s,c.onreadystatechange=c.onload=function(){!d&&k(c.readyState)&&(d=1,j(),c.onload=c.onreadystatechange=null)},m(function(){d||(d=1,j())},H.errorTimeout),a.e?c.onload():n.parentNode.insertBefore(c,n)}function h(a){var c=b.createElement("link"),d;c.href=a.s,c.rel="stylesheet",c.type="text/css";if(!a.e&&(w||r)){var e=function(a){m(function(){if(!d)try{a.sheet.cssRules.length?(d=1,j()):e(a)}catch(b){b.code==1e3||b.message=="security"||b.message=="denied"?(d=1,m(function(){j()},0)):e(a)}},0)};e(c)}else c.onload=function(){d||(d=1,m(function(){j()},0))},a.e&&c.onload();m(function(){d||(d=1,j())},H.errorTimeout),!a.e&&n.parentNode.insertBefore(c,n)}function g(){var a=p.shift();q=1,a?a.t?m(function(){a.t=="c"?h(a):i(a)},0):(a(),j()):q=0}function f(a,c,d,e,f,h){function i(){!o&&k(l.readyState)&&(r.r=o=1,!q&&j(),l.onload=l.onreadystatechange=null,m(function(){u.removeChild(l)},0))}var l=b.createElement(a),o=0,r={t:d,s:c,e:h};l.src=l.data=c,!s&&(l.style.display="none"),l.width=l.height="0",a!="object"&&(l.type=d),l.onload=l.onreadystatechange=i,a=="img"?l.onerror=i:a=="script"&&(l.onerror=function(){r.e=r.r=1,g()}),p.splice(e,0,r),u.insertBefore(l,s?null:n),m(function(){o||(u.removeChild(l),r.r=r.e=o=1,j())},H.errorTimeout)}function e(a,b,c){var d=b=="c"?z:y;q=0,b=b||"j",C(a)?f(d,a,b,this.i++,l,c):(p.splice(this.i++,0,a),p.length==1&&g());return this}function d(){var a=H;a.loader={load:e,i:0};return a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=r&&!s,u=s?l:n.parentNode,v=a.opera&&o.call(a.opera)=="[object Opera]",w="webkitAppearance"in l.style,x=w&&"async"in b.createElement("script"),y=r?"object":v||x?"img":"script",z=w?"img":y,A=Array.isArray||function(a){return o.call(a)=="[object Array]"},B=function(a){return Object(a)===a},C=function(a){return typeof a=="string"},D=function(a){return o.call(a)=="[object Function]"},E=[],F={},G,H;H=function(a){function f(a){var b=a.split("!"),c=E.length,d=b.pop(),e=b.length,f={url:d,origUrl:d,prefixes:b},g,h;for(h=0;hs?1:s>n?-1:0},sortLabel:function(e,t){return e.labels.length?t.labels.length?e.labels[0].name>t.labels[0].name?1:e.labels[0].name

    '+t.title+'

    \u53d1\u5e03\u65e5\u671f: '+t.prettyDate+'

    ').data("milestone",t)},issue:function(t){var s="",n=this;return e.each(t.labels,function(e,t){s+=n.label(t)}),null!==t.body&&void 0!==t.body&&""!==t.body&&"#"==t.body.substring(0,1)?e('
    • '+s+" "+e("").html(t.title).text()+"

    ").data("issue",t):e('
    • '+s+" "+e("").html(t.title).text()+"

    ").data("issue",t)},label:function(e){return""+e.name+""},bigIssue:function(){},comment:function(){}}}(jQuery); -------------------------------------------------------------------------------- /source/fonts/slate.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddtalk/dingTalkDoc/ebfe662a78a81a67bd00733b850c25d0322a0e10/source/fonts/slate.eot -------------------------------------------------------------------------------- /source/fonts/slate.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Generated by IcoMoon 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /source/fonts/slate.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddtalk/dingTalkDoc/ebfe662a78a81a67bd00733b850c25d0322a0e10/source/fonts/slate.ttf -------------------------------------------------------------------------------- /source/fonts/slate.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddtalk/dingTalkDoc/ebfe662a78a81a67bd00733b850c25d0322a0e10/source/fonts/slate.woff -------------------------------------------------------------------------------- /source/fonts/slate.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddtalk/dingTalkDoc/ebfe662a78a81a67bd00733b850c25d0322a0e10/source/fonts/slate.woff2 -------------------------------------------------------------------------------- /source/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddtalk/dingTalkDoc/ebfe662a78a81a67bd00733b850c25d0322a0e10/source/images/logo.png -------------------------------------------------------------------------------- /source/images/navbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddtalk/dingTalkDoc/ebfe662a78a81a67bd00733b850c25d0322a0e10/source/images/navbar.png -------------------------------------------------------------------------------- /source/includes/_blog.md: -------------------------------------------------------------------------------- 1 | # 联系我们 2 | 3 | - 讨论区:[开发者论坛](http://bbs.aliyun.com/thread/276.html?spm=5176.7189909.0.0.bq46VP) 4 | 5 | - 开放平台邮件组: open-dingtalk@list.alibaba-inc.com 6 | 7 | - 团队博客:[钉钉开放平台团队博客](http://ddtalk.github.io/blog/) -------------------------------------------------------------------------------- /source/includes/_cdn.md: -------------------------------------------------------------------------------- 1 | # 调试工具和性能优化 2 | ## 调试工具 3 | - [钉钉服务端API调试工具](https://debug.dingtalk.com) 4 | 5 | - [ISV接入调试工具](https://debug.dingtalk.com/isv.html) 6 | 7 | - [JSAPI调试工具](http://wsdebug.dingtalk.com/)(打开页面后,手机扫描二维码,然后在页面上配置参数,即可调试) 8 | 9 | ## H5性能优化方案 10 | 11 | 在钉钉移动客户端上的微应用通过H5来实现,当前H5的渲染性能相较native的app有一定差距,为了提升H5的性能,从体验上与native app缩短差距,我们提供了一份H5性能优化的方案,详细内容见blog中的[ H5性能优化方案](http://ddtalk.github.io/blog/2015/09/07/dingding-first/)。 12 | 13 | ## 微应用性能评测 14 | 15 | 微应用的性能测验主要是对微应用的整体性能进行评分,这其中包括但不仅限于首屏打开时间等指标。
    16 | 17 | 流程如下:
    18 | 19 | 1、微应用进行性能评测前首先需要确保我们的测试帐号被加入到将要测验的企业里。目前的测试帐号有以下几个: 13291824394, 15210137915,15810497158。
    20 | 21 | 2、点击打开测验页面
    22 | 23 | 3、然后,按照提示,输入要测试的H5应用地址,下一步选择手机即可开始测验。
    24 | 25 | 4、测验完成之后,就可以看到测试报告了。测试报告会给出被测试的微应用的整体打分。(打分机制还在不断优化,欢迎大家针对特殊的case提出建议)。测试报告同时会给出被测验的微应用需要优化的内容,开发者可以根据测试报告的优化建议进行相关优化,待优化完成可以再次发起测验流程,并查看报告。
    26 | 27 | 28 | 29 | ## CDN服务 30 | 31 | 钉钉开放平台为常用的js库提供了CDN加速服务,这样做不仅可以为您节省流量,还可以获得更快的访问速度。 32 | 33 | ### backbone 34 | 35 | [http://g.alicdn.com/ilw/cdnjs/backbone/1.2.1/backbone-min.js](http://g.alicdn.com/ilw/cdnjs/backbone/1.2.1/backbone-min.js) 36 | 37 | [http://g.alicdn.com/ilw/cdnjs/backbone/1.2.1/backbone.js](http://g.alicdn.com/ilw/cdnjs/backbone/1.2.1/backbone.js) 38 | 39 | ### jquery 40 | 41 | [http://g.alicdn.com/ilw/cdnjs/jquery/2.1.4/jquery.min.js](http://g.alicdn.com/ilw/cdnjs/jquery/2.1.4/jquery.min.js) 42 | 43 | [http://g.alicdn.com/ilw/cdnjs/jquery/2.1.4/jquery.js](http://g.alicdn.com/ilw/cdnjs/jquery/2.1.4/jquery.js) 44 | 45 | [http://g.alicdn.com/ilw/cdnjs/jquery/1.8.3/jquery.min.js](http://g.alicdn.com/ilw/cdnjs/jquery/1.8.3/jquery.min.js) 46 | 47 | [http://g.alicdn.com/ilw/cdnjs/jquery/1.8.3/jquery.js](http://g.alicdn.com/ilw/cdnjs/jquery/1.8.3/jquery.js) 48 | 49 | ### underscore 50 | 51 | [http://g.alicdn.com/ilw/cdnjs/underscore/1.8.3/underscore-min.js](http://g.alicdn.com/ilw/cdnjs/underscore/1.8.3/underscore-min.js) 52 | 53 | [http://g.alicdn.com/ilw/cdnjs/underscore/1.8.3/underscore.js](http://g.alicdn.com/ilw/cdnjs/underscore/1.8.3/underscore.js) 54 | 55 | ### zepto 56 | 57 | [http://g.alicdn.com/ilw/cdnjs/zepto/1.1.6/zepto.min.js](http://g.alicdn.com/ilw/cdnjs/zepto/1.1.6/zepto.min.js) 58 | 59 | [http://g.alicdn.com/ilw/cdnjs/zepto/1.1.6/zepto.js](http://g.alicdn.com/ilw/cdnjs/zepto/1.1.6/zepto.js) -------------------------------------------------------------------------------- /source/includes/_faq.md: -------------------------------------------------------------------------------- 1 | # FAQ 2 | 3 | ### Q:从哪里可以获得CorpID和CorpSecret? 4 | 5 | A:在钉钉管理后台的微应用设置页面可以获取,详细方法请参见[《接入指南-获取CorpID和CorpSecret》](#获取corpid和corpsecret)。 6 | 7 | ### Q:『计算解密文字错误』怎么解决? 8 | A:查看[加解密库和demo下载](#加解密库和demo下载)第二个步骤 9 | 10 | 11 | ### Q:调用管理通讯录接口返回430004,无效的HTTP HEADER Content-Type如何解决? 12 | 13 | A:管理通讯录的部分接口采用了POST请求,请求体使用JSON格式,请在HTTP请求头中设置Content-Type:application/json。 14 | 15 | ### Q:如何试用套件 16 | 17 | A:参见[套件试用流程](http://download.taobaocdn.com/freedom/31112/pdf/p1a01o2gfr4q811go5fq19i5ni14.pdf) 18 | 19 | 20 | 21 | ### Q:部署阿里云ssl证书出现问题如何解决? 22 | 23 | A:参见[阿里云证书配置-slb(负载均衡)](http://ddtalk.github.io/blog/2015/09/24/dingtalk/) 24 | 25 | 26 | ### Q:jsapi权限校验时返回{message:"权限校验失败",errorCode:3} 27 | 28 | A:首先检查用来生成签名(signature)的jsapi_ticket是否过期(jsapi_ticket有效期为7200秒,而且当你请求了新的ticket之后,旧的ticket就失效了)。 29 | 30 | 然后检查生成签名的Url参数,与调用dd.config 所在的url是否一致 31 | 32 | (生成签名用的url需要去除hash部分,e.g. 如果当前页面url是http://abc.def/ghi/jkl?m=123&n=456#opq,则用于生成签名的url是http://abc.def/ghi/jkl?m=123&n=456) 33 | 34 | 可以使用[调试工具](https://debug.dingtalk.com)来生成jsapi_ticket和signature,并和你实际使用的进行对比。 35 | 36 | ### Q:jsapi调用时返回{errorCode:7} 37 | 38 | 首先检查dd.config是否配置了相应的jsapi,再检查dd.ready是否已经进入 39 | 40 | 41 | ### Q:上传文件不成功 42 | A:使用multipart/form-data请求上传文件,需要附加文件标示信息,参数名为media,java示例代码为 43 | 44 | ` 45 | HttpEntity requestEntity =MultipartEntityBuilder.create().addPart("media", 46 | new FileBody(file, ContentType.APPLICATION_OCTET_STREAM, file.getName())).build(); 47 | ` 48 | 49 | ### Q:ISV如何在App及后台获取企业及用户相关信息 50 | 51 | A:微应用主页支持使用$CORPID$模板参数表示corpid,用户访问微应用的时候钉钉将把$CORPID$替换成用户所属企业的corpid,例如http://www.dingtalk.com/index?corpid=$CORPID$。 52 | 53 | 获取用户信息请参考[免登服务](#免登服务) 54 | 55 | 56 | ### Q:ISV接入回调接口没有suiteticket推送,为什么? 57 | 58 | A:当你注册套件之后,钉钉服务器会向你填写的回调接口推送suite_ticket。接收到推送之后需要返回加密后的字符串“success”,如果不返回,钉钉服务器将连续推送,直到推送次数超过100次,就不再推送。 59 | 此时您需要进入[开发者后台](http://console.d.aliyun.com),进入套件管理页面,点击『重新推送』按钮,即可重新推送。 60 | ![repush](https://img.alicdn.com/tps/TB15j7OJFXXXXckXXXXXXXXXXXX-1121-124.jpg) 61 | 62 | ### Q:ISV套件回调url验证有效性失败 63 | 64 | A:在填写套件回调url的时候,需要ISV填写回调url是可用的。 65 | 66 | 钉钉服务器通过向回调url推送一条『验证回调URL有效性事件』来判断回调url是否可用,具体流程请参见[回调接口](#5-回调接口(分为五个回调类型)) 67 | 68 | ### Q:不存在的临时授权码 69 | 70 | 当您通过临时授权码(tmp_auth_code)和套件token(suite_access_token)去换取永久授权码(permanent_code)之时,需要保证suite_access_token,tmp_auth_code都没有过期。 71 | 72 | ### Q:钉钉发送会话消息时候,cid怎么获取? 73 | A:请查看 74 | [jsapi-获取会话信息](#获取会话信息)。 75 | 76 | 使用场景示例:用户在微应用中拉起本地聊天窗口列表(通过调用jsapi-获取会话信息),选择某一个聊天窗口,微应用将收到钉钉返回的cid,通过这个cid会送会话消息。 77 | 78 | 如果希望在后台直接发送消息,请查看服务端开发文档-[发送企业会话消息](#发送企业会话消息)。 79 | 80 | ### Q:新增部门和员工信息为中文时,创建不成功 81 | A:请检查编码格式,需要是UTF-8编码 82 | 83 | 84 | ### Q:使用JSAPI返回签名或者Ticket获取失败 85 | A:JSAPI返回失败主要有两种错误 86 | 87 | [错误码:52011] [jsapi ticket 读取失败] 88 | 89 | 1)确认agentId参数正确传入 90 | 91 | 2)确认以传入agentId对应的企业身份获取过jsapi_ticket,也就是调用过get_jsapi_ticket方法 92 | 93 | 3)确认agentId对应的企业身份获取的jsapi_ticket没有过期.即在两个小时的有效期之内 94 | 95 | [错误码:52013][签名校验失败] 96 | 97 | 1)确认agentId参数正确传入 98 | 99 | 2)确认获得的jsapi_ticket为最新的,没有其他服务同时调用get_jsapi_ticket方法,导致生成签名的jsapi_ticket过期 100 | 101 | 3)确认生成jsapi签名正确,可以使用debug工具进行调试https://debug.dingtalk.com/ 102 | 103 | 104 | ### Q:开发遇到困难怎样反馈给你们? 105 | 106 | A:我们目前在阿里云开发者论坛开放了一个[钉钉开放平台](http://bbs.aliyun.com/thread/276.html?spm=5176.7189909.0.0.bq46VP)模块,你可以按照以下格式发帖到这个模块,我们会定期搜集和解决。 107 | 108 | 请编辑如下信息,发到论坛,这样便于快速解决问题。 109 | 110 | 企业完整名称 | 例如 阿里巴巴 111 | ---------- | ------- 112 | 访问接口的路径 | 例如 https://oapi.dingtalk.com/gettoken,不需要把token之类的信息附上 113 | 输入参数 | 需要提供CorpId,不需要提供AccessToken及CorpSecret 114 | 发起请求的服务器的外网IP地址 | 115 | 发起请求的时间点 | 例如 2015-6-16 10:03:50 116 | 返回的错误结果 | 例如 系统繁忙 117 | 118 | 119 | -------------------------------------------------------------------------------- /source/includes/_guide.md: -------------------------------------------------------------------------------- 1 | # 企业接入指南 2 | 3 | 此处为企业接入微应用的快速指南,按照此处的实现步骤,您(企业)可以将已有系统快速接入钉钉,您也可以独立开发一个微应用按照此步骤接入钉钉。您需要经过以下几步: 4 | 5 | - [Step 1 -- 注册钉钉企业](#step-1-注册钉钉企业) 6 | - [Step 2 -- 新增微应用](#step-2-新增微应用) 7 | - [Step 3 -- 开发微应用](#step-3-开发微应用) 8 | 9 |
    10 | 11 | ## Step 1 -- 注册钉钉企业 12 | 13 | ### 注册钉钉企业 14 | 15 | 一、进入 [钉钉管理后台](https://oa.dingtalk.com) 页面, 点击 [企业注册](https://oa.dingtalk.com/register.html?spm=0.0.0.0.dL51oc);(已经注册可跳过此步骤) 16 | 17 | ![enterprise_register_entry](https://img.alicdn.com/tps/TB14kI8IFXXXXciapXXXXXXXXXX.jpg) 18 | 19 | 二、填写注册手机号码和短信验证码; 20 | 21 | 三、输入企业基本信息和管理员帐号和密码,点击 *注册* 按钮完成注册过程。 22 | 23 | ![input_enterprise_info](https://img.alicdn.com/tps/TB1bru8JFXXXXXcXFXXXXXXXXXX-1171-807.png) 24 | 25 |
    26 | 通过钉钉移动客户端创建的企业默认没有设置钉钉后台管理员,需要通过以上流程注册管理员帐号。 27 |
    28 | ### 设置企业通讯录 29 | - 您可以通过进入 [钉钉管理后台](https://oa.dingtalk.com) 页面,登陆成功后,点击点击 [通讯录](https://oa.dingtalk.com/#/home#deptId=-1)可以看到如下图所示的组织架构操作进行添加或导入员工进行设置 30 | 31 | ![input_communication_info](https://img.alicdn.com/tps/TB1E.TpLFXXXXcpXpXXXXXXXXXX-301-184.png) 32 | 33 | - 您也可以通过[调用通讯录接口](#管理通讯录)进行创建、更新、删除、获取进行企业通讯录设置 34 | 35 | ## Step 2 -- 创建微应用 36 | 37 | - 如果您还没有注册钉钉企业账号,您需要通过[Step 1 -- 注册钉钉企业](#step-1-注册钉钉企业)完成钉钉企业账号注册;已注册则继续完成当前步骤您就可以在钉钉上使用微应用了 38 | ### 新增微应用 39 | 您登录钉钉管理后台后可以进入 *应用中心* 页面对添加微应用 40 | 41 | ![enter_microapp_center](https://img.alicdn.com/tps/TB1GqkTLXXXXXcsXFXXXXXXXXXX-1122-641.jpg) 42 | 43 | 点击上图中 *新增微应用* 按钮,按下图填写微应用信息,点击确定后可以新增微应用。 44 | 45 | ![add_micro_app](https://img.alicdn.com/tps/TB1Qe_XJFXXXXalXpXXXXXXXXXX-598-477.png) 46 | 47 | *首页地址* : 以`http://`或者`https://` 开头的URL,是微应用的首页地址;在移动设备上打开微应用Tab页,点击微应用列表中的微应用将访问这个URL指向的页面。 48 | 49 | *后台地址* : 以`http://`或者`https://` 开头的URL,是微应用的后台管理页面地址;配置后台地址后可以通过应用中心页面进入到微应用的管理后台。 50 | 51 |
    52 | 首页地址 的URL域名务必保证真实有效,否则会导致钉钉用户无法正常使用微应用。 53 |
    54 | 55 | ![get_micro_app_agentID](https://img.alicdn.com/tps/TB1N490JFXXXXceXFXXXXXXXXXX-602-524.png) 56 | 57 | 您在应用中心创建微应用后,如上图所示可获取到微应用的AgentID,AgentID可用于发送企业会话消息等场景。 58 | 59 |
    60 | 61 | 您也可以通过调用[创建微应用](#创建微应用)接口进行微应用创建。 62 | 63 | 创建成功之后将会在手机的工作tab上显示出来 64 | 65 | ![createMi](https://img.alicdn.com/tps/TB1xStVKpXXXXbjXFXXXXXXXXXX-361-640.jpg) 66 | 67 | 68 | 至此您已经可以在钉钉上使用微应用了,如果您需要对微应用与钉钉有进一步的融合,请进行定制开发,参考[开发微应用](#step-3-开发微应用) 69 | 70 | ## Step 3 -- 开发微应用 71 | 72 | - 您需要通过[新增微应用](#新增微应用)获取微应用的AgentID,用来在微应用开发时调用开放平台的接口 73 | 74 | 钉钉开放提供丰富的接口、工具供您使用,用以降低您的开发成本: 75 | 76 | - 钉钉开放平台提供了企业通讯录管理、文件管理、发送企业会话消息等功能,接口使用可以参考[服务端开发文档](#服务端开发文档); 77 | 78 | - 钉钉开放平台提供了定制的微应用在钉钉客户端的专用运行容器,并提供了一组可以调用钉钉的本地能力和业务能力的JSApi接口,您可以通过这些接口使用钉钉的本地能力或者钉钉的业务逻辑,进行微应用与钉钉功能的结合;接口使用可以参考[客户端开发文档](#客户端开发文档)。 79 | 80 | - 钉钉开放平台提供了与钉钉PC版本集成的能力,接口使用可以参考[PC端开发文档](#pc端开发文档); 81 | 82 | - 钉钉开放平台提供了开发过程中需要的调试工具和性能优化的建议,您可以参考[调试工具&性能优化](#调试工具-amp-性能优化); 83 | 84 | 85 | ### 实现免登 86 | 87 | 您的微应用接入钉钉后,通过钉钉实现免登无需让员工进行二次登录,员工在进入微应用的时可以获取当前用户的信息实现与原系统中的账户打通。详细文档请参阅[免登服务](#免登服务)。 88 | 89 | 90 |
    91 | 92 | 93 | ### 调用API接口 94 | 95 | 您在调用钉钉开放平台接口时需要附加AccessToken,AccessToken可以通过CorpID和CorpSecret获取。 96 | 97 | #### 获取CorpID和CorpSecret 98 | 99 | CorpID是企业的唯一标识,获取CorpID和CorpSecret的步骤如下: 100 | 101 | 一、使用管理员帐号登录 [钉钉管理后台](https://oa.dingtalk.com) ; 102 | 103 | 二、选择顶部菜单 **微应用** 进入微应用页面,在左侧菜单选择 **微应用设置** 进入微应用设置页; 104 | 105 | 三、在微应用设置页面底部可看见CorpID和CorpSecret。 106 | 107 | ![get_scecret_corpId](https://img.alicdn.com/tps/TB1iZprJFXXXXbGXpXXXXXXXXXX-1186-512.jpg) 108 | 109 |
    110 | 钉钉开放平台提供了获取和修改企业(团队)的组织结构信息、人员信息等功能,所以请妥善保管CorpID和CorpSecret,避免外泄影响企业信息安全。 111 |
    112 | 113 | #### 获取AccessToken 114 | 115 | 开发者在调用开放平台接口前需要通过CorpID和CorpSecret获取AccessToken。获取AccessToken的方法是向 `https://oapi.dingtalk.com/gettoken?corpid=id&corpsecret=secrect` GET请求。 116 | 117 | 开发者获取AccessToken后便可以调用开放平台其他接口。 118 | 119 | 以获取部门列表接口为例,获取部门列表接口为: 120 | 121 | `oapi.dingtalk.com/department/list` 122 | 123 | 在请求该接口时,需要将获取的AccessToken作为请求参数拼装到URL中: 124 | 125 | `https://oapi.dingtalk.com/department/list?access_token=ACCESS_TOKEN` 126 | 127 | 更多关于AccessToken的信息请参考[《服务端开发文档-建立连接》](#建立连接)一节。 128 | 129 |
    130 | 131 | 132 | ### 发送企业会话消息 133 | 134 | 用户可以在企业会话中查看微应用发送的消息,开发者可以通过发送消息接口将消息发送到企业会话中。 135 | 136 | ![send_micro_app_message](https://img.alicdn.com/tps/TB1X.m6JFXXXXX0XFXXXXXXXXXX-1089-652.jpg) 137 | 138 | 调用消息发送接口时需要使用`HTTPS`协议,发送的数据包为`JSON`格式。目前钉钉开放平台支持文本、图片、声音、文件、链接、办公消息等消息类型。 139 | 140 | ### 示例程序 141 | 142 | 在[《Open API - 代码示例》](#demo)中有发送消息的代码演示,开发者可以下载参考。 143 | 144 | 如果在使用开放平台中遇到困难请浏览[《常见问题》](#faq)一节,若仍不能解决请按概述中的提供的反馈方式联系我们。 145 | 146 | 147 | -------------------------------------------------------------------------------- /source/includes/_identityverify.md: -------------------------------------------------------------------------------- 1 | # 免登服务 2 | 3 | 通过免登服务,在企业微应用的H5中,无需重复输入用户名和密码,可以通过身份认证获取当前使用钉钉的用户身份及相关信息。 4 | 5 | 具体流程为: 6 | 7 | 1.获取CODE(免登授权码),获取CODE的方式是调用js-api接口。 8 | 9 | 2.通过CODE换取用户身份。 10 | 11 | 12 | 通过CODE获取用户身份会有一定的时间开销。对于频繁获取用户身份的场景,建议采用如下方案: 13 | 14 | 1. 用户跳转到企业页面时,企业校验是否有代表用户身份的cookie,此cookie由企业生成 15 | 2. 如果没有获取到cookie,调用免登服务,获取用户身份后,由企业生成代表用户身份的cookie 16 | 3. 根据cookie获取用户身份,进入相应的页面 17 | 18 | ## 手机客户端微应用中调用免登 19 | 20 | ### 使用JS-API 21 | 22 | 步骤一:首先需要获取当前用户的corpid。ISV开发者请在微应用主页地址使用$CORPID$模板参数表示corpid,用户访问微应用的时候钉钉服务器将把$CORPID$替换成用户所属企业的corpid,例如原本的主页地址是http://www.dingtalk.com/index,则能获取用户corpid的主页地址为http://www.dingtalk.com/index?corpid=$CORPID$ 23 | 24 | 步骤二:使用钉钉js-api提供的[获取免登授权码](#获取免登授权码)接口获取CODE 25 | 26 | 步骤二:[通过CODE换取身份](#通过code换取用户身份) 27 | 28 | demo地址:[https://github.com/injekt/openapi-demo-php/blob/master/corp/public/javascripts/demo.js](https://github.com/injekt/openapi-demo-php/blob/master/corp/public/javascripts/demo.js) 29 | 30 | 31 | ## 钉钉PC版微应用中调用免登 32 | 33 | ### 使用JS-API 34 | 35 | 步骤一:首先需要获取当前用户的corpid。ISV开发者请在微应用主页地址使用$CORPID$模板参数表示corpid,用户访问微应用的时候钉钉服务器将把$CORPID$替换成用户所属企业的corpid,例如原本的主页地址是http://www.dingtalk.com/index,则能获取用户corpid的主页地址为http://www.dingtalk.com/index?corpid=$CORPID$ 36 | 37 | 步骤二:使用钉钉js-api提供的[PC版获取免登授权码](#pc版获取免登授权码)接口获取CODE 38 | 39 | 步骤二:[通过CODE换取身份](#通过code换取用户身份) 40 | 41 | demo: 可参考手机客户端免登demo,但全局变量dd替换成DingTalkPC 42 | 43 | 44 | 45 | ## 微应用后台管理员免登 46 | 实现微应用后台管理系统与钉钉OA后台的免登 47 | 48 | 应用场景示例如下图: 49 | 50 | ![normalcorp](https://img.alicdn.com/tps/TB1iw.4KFXXXXXoXFXXXXXXXXXX-594-302.png) 51 | 52 | **准备工作**: 53 | 54 | 1: 配置微应用后台地址 55 | 56 | 普通企业在[OA后台](https://oa.dingtalk.com/#/microApp/microAppList)添加微应用配置如左图,ISV在[开发者后台](http://console.d.aliyun.com)添加微应用配置如下图 57 | 58 | ![oaback](https://img.alicdn.com/tps/TB15zWTKFXXXXcEXVXXXXXXXXXX-642-367.jpg) 59 | 60 | 2: 获取完成免登过程中验证身份的密钥(SSOSecret) 61 | 62 | 重要说明:企业和ISV获取的方法一致,都是通过OA后台获取,ISV开发套件微应用的管理后台,使用自己企业的SSOSecret即可完成身份认证 63 | 64 | 在[OA后台](https://oa.dingtalk.com/#/microApp/microAppSet)获取SSOSecret的方法如下: 65 | 66 | 67 | ![normalcorp](https://img.alicdn.com/tps/TB1y_xcKVXXXXa6XXXXXXXXXXXX-1084-621.jpg) 68 | 69 | 70 | 71 | **使用方法(钉钉管理员登陆态)** 72 | 73 | 74 | 步骤一:在OA后台,点击微应用的“进入后台”,自动跳转到准备工作1中配置的微应用后台地址,开发者从跳转的URL中解析code参数,获取CODE并保存下来,通过此CODE获取管理员的身份信息 75 | 76 | 步骤二:通过[获取微应用后台管理Token](#获取微应用后台管理token)获取AccessToken 77 | 78 | 步骤三:使用AccessToken[通过步骤一获取的CODE换取微应用管理员的身份信息](#通过code换取微应用管理员的身份信息) 79 | 80 | 81 | **更多用法** 82 | 83 | 在钉钉管理员非登陆态,使用钉钉管理后台的Oauth身份认证可以通过下面方法: 84 | 85 | 在管理员访问后台地址的时候,企业在后台构造一个连接,通过HTTP 302跳转方式,让用户访问钉钉开放平台授权网址,构造的地址如下: 86 | 87 | `https://oa.dingtalk.com/omp/api/micro_app/admin/landing?corpid=CORPID&redirect_url=REDIRECT_URL` 88 | 89 | 参数 | 说明 90 | ---------- | ------ 91 | corpid | 开发此微应用的公司corpid,ISV填写自己企业的CorpID 92 | redirect_url | 重定向地址(需要urlencode编码) 93 | 94 | 95 | REDIRECT_URL为微应用后台地址,首先跳转到钉钉OA管理后台登录页,登陆成功后,会再次通过HTTP 302跳转回微应用的后台地址(即REDIRECT_URL),并在REDIRECT_URL后面追加参数code=CODE,即 96 | 97 | `REDIRECT_URL?code=CODE` 98 | 99 | 开发者从URL中解析code参数,获取CODE并保存下来,再按照上面使用方法中的步骤二和步骤三 获得管理员信息 100 | 101 | demo查看:[https://github.com/injekt/openapi-demo-java/tree/master/src/com/alibaba/dingtalk/openapi/servlet](https://github.com/injekt/openapi-demo-java/tree/master/src/com/alibaba/dingtalk/openapi/servlet) 102 | 103 | ## 普通钉钉用户账号开放及免登 104 | 105 | 第三方web服务提供者,通过此项服务,可以使用普通钉钉用户账号登录自有的系统,并可将自有系统的账号与钉钉账号进行绑定,同时还能够获取钉钉用户的个人及企业数据,如姓名、手机号、对应企业的名称、企业是否认证过、企业的权益等级、其在企业内是否为管理人员等信息(取决于用户最终授权)。 106 | 107 | 注:此功能与ISV没有关系,任何外部系统都可以使用。 108 | 109 | 1: 在钉钉用户访问你的Web系统时,如果用户选择使用钉钉账号登录,则需要由你构造并引导用户跳转到如下链接。 110 | 111 | https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=APPID&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=REDIRECT_URI 112 | 113 | 参数 | 说明 114 | ---------- | ------ 115 | appid | 参看第2步获取,代表了你提供的服务,必填 116 | redirect_uri | 重定向地址(需要urlencode编码),该地址所在域名需要配置为appid对应的安全域名,必填 117 | state | 用于防止重放攻击,选填 118 | response_type | 固定为code,必填 119 | scope | 固定为snsapi_login,必填 120 | 121 | 2: 获取完成免登过程中验证身份的appId及appSecret。 122 | 123 | 请加入钉钉"沟通组":https://t.dingtalk.com/invite/index?code=86d9eaf4ff 点击该链接申请加入 124 | 125 | 在您基本完成开发后,可在"沟通组"里的审批中申请获得appId及appSecret。 126 | 127 | 3: 使用appid及appSecret访问如下接口,获取accesstoken,此处获取的token有效期为2小时,有效期内重复获取,返回相同值,并自动续期,如果在有效期外获取会获得新的token值,建议定时获取本token,不需要用户登录时再获取。 128 | 129 | [https://oapi.dingtalk.com/sns/gettoken?appid=APPID&appsecret=APPSECRET](#获取钉钉开放应用的access_token) 130 | 131 | 4:在钉钉用户登录钉钉系统后,会302到你指定的redirect_uri,并向url参数中追加code及state两个参数。 132 | 133 | 5:在你的web系统获取到代表用户的code之后,使用第3步获取的AccessToken及code获取当前钉钉用户授权给你的持久授权码,此授权码目前无过期时间,可反复使用,参数code只能使用一次。 134 | 135 | [https://oapi.dingtalk.com/sns/get_persistent_code?access_token=ACCESS_TOKEN](#获取用户授权的持久授权码) 136 | 137 | 6:在获得钉钉用户的持久授权码后,通过以下接口获取该用户授权的SNS_TOKEN,此token的有效时间为2小时,重复获取不会续期。 138 | 139 | [https://oapi.dingtalk.com/sns/get_sns_token?access_token=ACCESS_TOKEN](#获取用户授权的sns_token) 140 | 141 | 7:在获得钉钉用户的SNS_TOKEN后,通过以下接口获取该用户的个人信息。 142 | 143 | [https://oapi.dingtalk.com/sns/getuserinfo?sns_token=SNS_TOKEN](#获取用户授权的个人信息) 144 | 145 | ## 网站应用钉钉扫码登录开发指南 146 | 147 | 第三方web服务提供者,通过此项服务,可以使用钉钉用户扫码登录自有的系统,并可将自有系统的账号与钉钉账号进行绑定,同时还能够获取钉钉用户的个人及企业数据,如姓名、手机号、对应企业的名称、企业是否认证过、企业的权益等级、其在企业内是否为管理人员等信息(取决于用户最终授权)。 148 | 149 | 注:此功能与ISV没有关系,任何外部系统都可以使用。 150 | 151 | 1: 你的Web系统可以通过两种方式实现钉钉扫码登录,如下: 152 | 153 | 1.1: 第一种方式是直接使用钉钉提供的扫码登录页面,在企业Web系统里,用户点击使用钉钉扫描登录,第三方Web系统跳转到如下地址: 154 | 155 | https://oapi.dingtalk.com/connect/qrconnect?appid=APPID&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=REDIRECT_URI 156 | 157 | url里的参数需要换成第三方Web系统对应的参数。 158 | 159 | 在钉钉用户扫码登录并确认后,会302到你指定的redirect_uri,并向url参数中追加code及state两个参数。 160 | 161 | 1.2: 第二种方式是支持网站将钉钉登录二维码内嵌到自己页面中,用户使用钉钉扫码登录后JS会将loginTmpCode返回给网站。 162 | 163 | JS钉钉登录主要用途:网站希望用户在网站内就能完成登录,无需跳转到钉钉域下登录后再返回,提升钉钉登录的流畅性与成功率。 网站内嵌二维码钉钉登录JS实现办法: 164 | 165 | 步骤1:在页面中先引入如下JS文件(支持https): 166 | 167 | 168 | ``` 169 | ``` 170 | 171 | 步骤2:在需要使用钉钉登录的地方实例以下JS对象: 172 | 173 | 174 | var obj = DDLogin({
    175 |    id:"login_container",
    176 |    goto: "",
    177 |    style: "",
    178 |    href: "",
    179 |    width : "300px",
    180 |    height: "300px"
    181 | });
    182 |
    183 | 其中goto参数需要这样构造:https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=APPID&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=REDIRECT_URI 184 | 并且要将goto参数urlencode编码 185 | 186 | 参数说明见下方 187 | 188 | 您引入的js会在获取用户扫描之后将获取的loginTmpCode通过window.parent.postMessage(loginTmpCode,'*');返回给您的网站。您可以通过以下代码获取这个loginTmpCode: 189 | 190 |
    191 | var hanndleMessage = function (event) {
    192 |    var data = event.data;
    193 |    var origin = event.origin;
    194 | };
    195 | if (typeof window.addEventListener != 'undefined') {
    196 |    window.addEventListener('message', hanndleMessage, false);
    197 | } else if (typeof window.attachEvent != 'undefined') {
    198 |    window.attachEvent('onmessage', hanndleMessage);
    199 | }
    200 |
    201 | 202 | 通过JS获取到loginTmpCode后,需要由你构造并跳转到如下链接。 203 | https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=APPID&response_type=code&scope=snsapi_login 204 | &state=STATE&redirect_uri=REDIRECT_URI&loginTmpCode=loginTmpCode 205 | 206 | 参数 | 说明 207 | ---------- | ------ 208 | appid | 参看第2步获取,代表了你提供的服务,必填 209 | redirect_uri | 重定向地址(如果是第一种方式需要urlencode编码,如果是第二种方式则需要将JS goto参数整体urlencode编码,不要单独对redirect_uri编码),该地址所在域名需要配置为appid对应的安全域名,必填 210 | state | 用于防止重放攻击,选填 211 | response_type | 固定为code,必填 212 | scope | 固定为snsapi_login,必填 213 | loginTmpCode | 通过js获取到的loginTmpCode,必填 214 | 215 | 2: 获取完成免登过程中验证身份的appId及appSecret。 216 | 217 | 请加入钉钉"扫码登录沟通组":https://t.dingtalk.com/invite/index?code=86d9eaf4ff 点击该链接申请加入 218 | 219 | 在您基本完成开发后,可在"扫码登录沟通组"里的审批中申请获得appId及appSecret。 220 | 221 | 3: 使用appid及appSecret访问如下接口,获取accesstoken,此处获取的token有效期为2小时,有效期内重复获取,返回相同值,并自动续期,如果在有效期外获取会获得新的token值,建议定时获取本token,不需要用户登录时再获取。 222 | 223 | [https://oapi.dingtalk.com/sns/gettoken?appid=APPID&appsecret=APPSECRET](#获取钉钉开放应用的access_token) 224 | 225 | 4:在你的web系统获取到代表用户的code之后,使用第3步获取的AccessToken及code获取当前钉钉用户授权给你的持久授权码,此授权码目前无过期时间,可反复使用,参数code只能使用一次。 226 | 227 | [https://oapi.dingtalk.com/sns/get_persistent_code?access_token=ACCESS_TOKEN](#获取用户授权的持久授权码) 228 | 229 | 5:在获得钉钉用户的持久授权码后,通过以下接口获取该用户授权的SNS_TOKEN,此token的有效时间为2小时,重复获取不会续期。 230 | 231 | [https://oapi.dingtalk.com/sns/get_sns_token?access_token=ACCESS_TOKEN](#获取用户授权的sns_token) 232 | 233 | 6:在获得钉钉用户的SNS_TOKEN后,通过以下接口获取该用户的个人信息。 234 | 235 | [https://oapi.dingtalk.com/sns/getuserinfo?sns_token=SNS_TOKEN](#获取用户授权的个人信息) 236 | -------------------------------------------------------------------------------- /source/includes/_overview.md: -------------------------------------------------------------------------------- 1 | # 概述 2 | 3 | 欢迎您成为钉钉开放平台的开发者。 4 | 5 | 钉钉是阿里巴巴专为中小企业和团队打造的沟通、协同的多端平台,钉钉开放平台旨在为企业提供更为丰富的办公协同解决方案。通过钉钉开放平台,企业或第三方合作伙伴可以帮助企业快速、低成本的实现高质量的移动微应用,实现生产、管理、协作、运营的移动化。钉钉开放平台依托阿里巴巴多年的技术积累,建立业界一流的开放技术体系,帮助每一位开发者,提升开发效率,降低开发成本与难度。钉钉开放平台能帮助您获得更多的商业机会,服务更多的企业客户,从而不断的提升你的价值。 6 | 7 | 当您成功注册为开发者,可以通过本文档所描述的接口创建钉钉微应用,为企业实现更多丰富且个性化的企业移动应用。 8 | 9 | 10 | 11 | 12 | 13 | ## 企业微应用 14 | 钉钉企业微应用是企业在钉钉上建立的微应用,只提供给自己企业内部使用。它帮助企业建立员工考勤、审批、员工通讯录管理以及与企业IT系统间的连接。使用企业微应用可以帮助企业快速、低成本的实现高质量的移动办公服务,实现员工沟通、员工协作、产品运营的移动化。我们有信心,帮助每一位企业微应用开发者,提升开发效率,降低开发成本与难度,确保企业微应用的稳定运行。 当你注册成为一个企业微应用开发者之后,你可以登录企业的管理页面,导入通讯录、配置微应用,也可以通过应用向公司员工发送文本、图文、文件、视频、音频等多媒体消息。 15 | 16 | 假如你是企业用户,要为自己的公司开发微应用,查看[企业接入指南](#企业接入指南)。 17 | 18 | 19 | ## ISV微应用 20 | ISV是Independent Software Vendors 的英文缩写,意为“独立软件开发商”,特指专门从事软件的开发、生产、销售和服务的企业。 钉钉ISV是独立于企业、钉钉之外的第三方软件开发商,愿意和钉钉一起共建各个行业的移动办公服务,ISV开发的微应用通过审核后会在钉钉应用中心展示,企业管理员可以在钉钉应用中心添加ISV微应用到自己企业的工作面板供企业所有员工使用。ISV开发者体系比企业应用开发者体系复杂一些,ISV必须获得企业的授权才能获取企业用户的通讯录等信息并为企业的用户提供服务。 当你注册成为一个ISV微应用开发者之后,你可以在阿里云开发者平台上创建套件、创建微应用,并通过授权已有企业来调试和预览ISV微应用。 21 | 假如你是ISV(服务提供商),作为第三方要给其他公司提供微应用,先查看[ISV接入指南](#isv接入指南)。 22 | ## 更多 23 | 开发者可以通过以下方式了解更多关于钉钉开放平台的消息: 24 | 25 | - [开发者论坛](http://bbs.aliyun.com/thread/276.html?spm=5176.7189909.0.0.bq46VP) 26 | - 邮件组: open-dingtalk@list.alibaba-inc.com 27 | -------------------------------------------------------------------------------- /source/includes/_serverdebug.md: -------------------------------------------------------------------------------- 1 | # 调试工具 2 | 3 | -------------------------------------------------------------------------------- /source/includes/_share.md: -------------------------------------------------------------------------------- 1 | # 分享SDK 2 | 3 | 该功能是钉钉团队为开发者提供,帮助移动应用通过用户社交快速传播的功能。 4 | 5 | “分享SDK”需要客户端接入,请将对应SDK集成至开发者移动端应用中。 6 | 7 | ## 场景介绍 8 | 9 | 用户使用开发者制作的移动应用时,可以将自己喜欢的内容,通过该功能快速地转发给自己在钉钉内的好友。好友点击打开内容链接, 10 | 将通过钉钉内置浏览器打开网页的形式进行呈现。在传播内容的同时,也会同时露出应用的名称与logo,起到品牌传播的效果。 11 | 12 | ## 应用范例 13 | 14 | ### 支付宝 15 | 16 | 从支付宝发送红包可以分享给钉钉同事,用户分享后,钉钉好友可以通过这个分享直接打开支付宝抢红包。 17 | 18 | ## 渠道显示说明 19 | 20 | 1、当用户手机安装钉钉2.7及以上版本,正常分享; 21 | 22 | 2、当用户手机没有安装钉钉,点击分享渠道可以弹出提示,也可以引导用户下载钉钉。IOS引导至appstore,安卓引导至:http://www.dingtalk.com/index-b.html 23 | 24 | 3、当用户手机安装钉钉版本低于2.7,点击分享渠道出提示升级钉钉。 25 | 26 | ## 分享sdk接入前准备 27 | 28 | 分享到钉钉好友的所有接口功能,均需要使用在开放平台上创建的应用进行调用。目前仅支持阿里内部渠道的线下接入。线上的应用创建流程还在开发中。请随时关注文档更新。 29 | 30 | ## 接入流程 31 | 32 | ### Android接入流程 33 | 34 | 1、搭建开发环境 35 | 36 | [1] 推荐用Android Studio建立工程。 37 | 38 | [2] 在工程中新建一个libs目录,将开发工具包中libs目录下的libddshare.jar复制到该目录中(如下图所示,建立了一个名为DDShareDemo 的工程,并把jar包复制到libs目录下)。 39 | 40 | 41 | 42 | [3] 将libs目录下的libddshare.jar文件添加到工程依赖中。 43 | 44 | 2、 在代码中使用开发工具包 45 | 46 | [1] 具体可参考demo的代码。 47 | 48 | [2] 接收钉钉的回调 49 | 如果你的程序需要接收钉钉发送的请求,或者接收发送到钉钉请求的响应结果,需要下面3步操作: 50 | 51 | a. 在你的包名相应目录下新建一个ddshare包,并在该ddshare目录下新增一个DDShareActivity类,该类继承自Activity(例如应用程序的包名为com.laiwang.ding.share.openapi.ddshareopenapi,则新添加的类如下图所示) 52 | 53 | 54 | 55 | 并在AndroidManifest文件里面加上exported属性,设置为true,例如: 56 | 57 | 58 | 59 | b. 实现IDDAPIEventHandler接口,发送到定递给你请求的响应结果将回调到onResp方法 60 | 61 | c. 在DDShareActivity中将接收到的intent及实现了IDDAPIEventHandler接口的对象传递给IDDShareApi接口的handleIntent方法,示例如下图: 62 | 63 | 64 | 65 | 应用请求钉钉的响应结果将通过onResp回调。 66 | 注意 67 | 如果需要混淆代码,为了保证sdk的正常使用,需要在proguard.cfg加上下面两行配置: 68 | -keep class com.android.dingtalk.share.ddsharemodule.** { 69 | *; 70 | } 71 | 72 | 3、 判断当前设备是否支持分享 73 | 74 | 钉钉从2.7版本开始支持分享,api中提供了接口来判断当前设备是否能够支持分享到钉钉 75 | 76 | [1]判断当前设备是否已经安装钉钉 77 | 78 | boolean isInstalled = iddShareApi.isDDAppInstalled(); 79 | 80 | [2]判断当前设备是否支持分享到钉钉(已经安装钉钉&&钉钉版本支持分享) 81 | 82 | boolean isSupport = iddShareApi.isDDSupportAPI(); 83 | 84 | 4、 分享支持的类型 85 | 86 | 支持文本、图片、链接以及特殊的支付宝红包类型,具体使用可参考Demo 87 | 88 | ### iOS接入流程 89 | 90 | 准备工作 91 | 92 | - 申请AppID, 申请时请提供,应用的BundleID,应用名称和应用图标,图标需要提供两个尺寸:28x28px和 108x108px,格式为PNG; 93 | - 下载DTShareSDK;DTShareSDK最低部署系统版本为iOS7.0,包含 `armv7, i386, x86_64, arm64` 架构; 94 | - 安装钉钉iOS客户端2.7.0及以后的版本; 95 | 96 | 步骤1:将SDK的下列文件导入到工程中; 97 | 98 | ![share_sdk_import](https://img.alicdn.com/tps/TB1hydHLXXXXXXFXXXXXXXXXXXX-290-97.png) 99 | 100 | 步骤2:配置工程 101 | 102 | - 在Other Linker Flags添加 `-all_load`选项; 103 | 104 | ![other_linker_flags](https://img.alicdn.com/tps/TB118c9KVXXXXcIaXXXXXXXXXXX-808-201.png) 105 | 106 | - 将申请的appId添加到URL Types中作为钉钉回调的scheme, `identifier` 填写`dingtalk`; `URL Schemes`填写申请的AppId。 iOS9及以后的系统需要将钉钉和分享SDK的scheme配置在Info.plist的LSApplicationQueriesSchemes列表中,scheme分别为 `dingtalk, dingtalk-open` 107 | 108 | ![Alt text](https://img.alicdn.com/tps/TB1QyhdLXXXXXbZXVXXXXXXXXXX-973-709.png) 109 | 110 | 步骤4:注册应用并添加必要的URL Handler 111 | 112 | 如示例中,在AppDelegate.m文件中引用`AppDelegate.h`,在@implementation AppDelegate中增加如下代码: 113 | 114 | ![share_sdk_code_sample](https://img.alicdn.com/tps/TB1F7xvLXXXXXbHXpXXXXXXXXXX-999-554.png) 115 | 116 | 步骤4:分享数据到钉钉客户端 117 | 118 | 发送分享请求的过程主要分为两部分: 119 | 120 | - 组装DTMediaMessage对象; 121 | - 调用+[DTOpenAPI sendReq:]发送数据; 122 | 123 | 不同类型的分享数据通过DTMediaMessage的mediaObject区分: 124 | 125 | - DTMediaTextObject 纯文本数据; 126 | - DTMediaImageObject 纯图片数据; 127 | - DTMediaWebObject Web页面数据; 128 | 129 | 下面是分享文本部分代码,其它类型请参考Demo示例: 130 | 131 | ![share_sdk_text_sample_code](https://img.alicdn.com/tps/TB1ZWthLXXXXXbxXVXXXXXXXXXX-595-257.png) 132 | 133 | **注意:分享纯图片数据和Web页面缩略图时,可以使用两种形式:图片URL和图片Data,钉钉内优先使用图片Data形式;分享数据的数据量限制在SDK的头文件中均有描述,超过限制的数据不会发送到钉钉客户端。** 134 | 135 | #### 判断当前设备是否支持分享到钉钉 136 | 137 | 钉钉从2.7版本开始支持分享,SDK中提供了接口来判断当前设备是否能够支持分享到钉钉。 138 | 139 | ![share_sdk_check_dingtalk_api](https://img.alicdn.com/tps/TB1zfhBLXXXXXXpXpXXXXXXXXXX-556-288.png) 140 | 141 | **注意:在iOS9上需要将钉钉SDK相关的Scheme注册到Info.plist的LSApplicationQueriesSchemes明代中,否则会导致检测方法总是返回NO。** 142 | 143 | ## Demo下载 144 | 145 | [Android Demo 下载](http://download.taobaocdn.com/freedom/31112/compress/p1acmghvmm1sfd2oe167ih5617o34.zip) 146 | 147 | [iOS Demo 下载](http://download.taobaocdn.com/freedom/31112/compress/DTShareKit.zip) -------------------------------------------------------------------------------- /source/includes/_standar.md: -------------------------------------------------------------------------------- 1 | # 标准规范 2 | 3 | ## 成为ISV的必要条件 4 | 5 | 开发者在成为钉钉应用服务商时需要满足以下条件: 6 | 7 | - 1,ISV必须注册钉钉企业并通过认证; 8 | - 2,ISV必须注册阿里云账号并通过企业认证; 9 | 10 | 开发者可以从 [钉钉管理后台](https://oa.dingtalk.com) 进行注册/认证/登录钉钉企业管理后台 11 | 开发者可以通过[控制台](http://console.d.aliyun.com),进行注册/认证/登录开发者平台 12 | 13 | ## 产品标准 14 | 15 | ### 命名规范 16 | 套件/微应用命名规范: #### 1.不能使用通用名词命名,包括拼音谐音,如墨迹天气、滴滴打车,不能命名为天气,打车 #### 2.不能带有钉钉,阿里,淘宝,等阿里巴巴关联产品和企业文字 #### 3.应用不得包含虚假、欺骗或误导的陈述,或是使用的名称与其他应用类似 #### 4.命名必须符合开发者相关协议条款,不得带有影射竞争对手,触犯法律和道德的文字 #### 5.命名不能重名,一旦应用审核通过,则不允许同名应用提交申请 #### 6.应用的名字、描述和截图与应用内容相关 #### 7.应用不得包括符号,和任何“beta”、“demo”、“trial”或“test”版本的应用 #### 8.建议不超过6个汉字 17 | #### 9.更名:线上商品更名,不允许自行更名,现阶段必须进行邮件审核,发送邮箱至open-dingtalk@list.alibaba-inc.com申请,审核通过后才可更名 18 | 19 | ### 套件规范 20 | #### 市场上展示的套件,原则上不允许,相同微应用出现在不同的套件中,比如a应用已经独立组成套件A,不允许a应用组成套件B(线下快速部署的除外),运营审核套件和微应用的从属关系,不通过,则退回修改 21 | 22 | ### 场景规范 23 | 24 | #### 场景化与钉钉统一通讯能力结合,比如消息,会话,钉,通讯录,群等如: 25 | 26 | ![product_scene1](https://img.alicdn.com/tps/TB1FUmiLXXXXXauXFXXXXXXXXXX-431-613.png) 27 | ![product_scene2](https://img.alicdn.com/tps/TB1EgabLXXXXXXIXVXXXXXXXXXX-467-556.png) 28 | 29 | ### 功能规范 30 | 31 | #### 需要在钉钉上形成完整的业务闭环,用户可以在钉钉手机端上解决完整的业务刚需 32 | 33 | #### 如果已有原生APP, 建议ISV在钉钉版本上保留原生APP的核心价值,并积极实现和原生APP相同或更好的用户体验 34 | 35 | ### UI规范 36 | 需要按照钉钉UI规范进行产品设计,[请下载](http://download.taobaocdn.com/freedom/30563/compress/p1a5tl8v1d1fk91l9l15cu1vnp54l4.zip) 37 | ![product_UI](https://img.alicdn.com/tps/TB18eWkLXXXXXcnXpXXXXXXXXXX-528-223.png) 38 | 39 | ### 免登及注册 40 | 降低用户使用门槛,原则上不出现任何注册功能,必须实现移动端应用无需注册,直接开通使用和免登,如有PC版,需要实现PC端的免登,但此功能非开始共创和灰度的必要条件,可以后续迭代完善 41 | ![product_use](https://img.alicdn.com/tps/TB1ZNx3LXXXXXaIaXXXXXXXXXXX-644-575.png) 42 | 43 | ### 用户引导 44 | 钉钉不会以任何方式提供客户的联系方式(包括手机,固定电话等),ISV产品设计上也不能误导客户提供联系方式,如业务需要,则必须向客户明确说明,联系方式的真实使用目的,范围和场景,并让客户自行选择是否提供联系方式 45 | 46 | ![product_ feedback](https://img.alicdn.com/tps/TB17mSwLXXXXXXeXXXXXXXXXXXX-419-505.png) 47 | 48 | ### 迭代计划 49 | 商品上架前,提供产品的下一阶段的迭代计划;例如: 50 | ![product_plan](https://img.alicdn.com/tps/TB17mSwLXXXXXXeXXXXXXXXXXXX-419-505.png) 51 | 52 | ### PC桌面版 53 | ISV在10家企业共创阶段,如提供PC版,必须完成钉钉桌面版免登接入,并且需要按照以下标准进行产品验收 54 | #### 1.全部页面嵌入钉钉桌面版,如审批和通达应用 55 | ![product_PC1](https://img.alicdn.com/tps/TB1WAkELpXXXXXjXFXXXXXXXXXX-865-588.png) 56 | #### 2.跳出钉钉桌面版,新开浏览器窗口,免登进入ISV web版页面 57 | - 在保持较好体验前提下,建议ISV web版页面,全部嵌入钉钉桌面版,并实现免登,如果嵌入体验较差,可以点击具体功能后,跳出到浏览器 - 从钉钉桌面跳出,必须从对用户有业务意义的页面,点击具体功能后,无缝跳出,不能有业务断点,比如可以嵌入报表导航页面,在进行查询/新增/编辑/删除时,跳出到浏览器,不允许通过只有登录按钮的空页面,进行跳出 58 | 59 | ![product_PC2](https://img.alicdn.com/tps/TB1nJcCLpXXXXamXFXXXXXXXXXX-865-588.png) 60 | 61 | ## 技术标准 62 | 63 | ### 质量标准 #### TC验收标准:覆盖率大于等于95% - 必要的输入:ISV开开发阶段提供《TC文档》,《需求规格说明书》 - TC中必须包含但不限于场景要求: 64 | 1.输入框必须校验:长度限制,特殊字符控制 65 | 2.网络情况:WiFi,2G,3G,4G 66 | 3.机型适配:见《附录3 适配机型列表》 67 | 4.钉钉版本适配:包含对钉钉版本支持的说明 68 | 5.图片:尺寸限制,大小限制 69 | 6.多端:PC与移动关联的功能场景 70 | 7.必须实现免登陆 71 | 72 | 8.PC功能支持确认 73 | 74 | 9.不能有注册流程 75 | 76 | 10.不能出现竞品字样及logo 77 | 78 | 11.统一的交互,统一的导航栏,问号标识,反馈入口 79 | 80 | 12.选人场景必须用钉钉提供的选人组件 81 | 82 | 13.不能出现用户填写手机号的场景 83 | 84 | 14.必须有授权与解授权、激活的测试报告 85 | #### 测试验收评分标准:验收评分必须大于90分验收通过,小于则不通过(一个版本验收不超过2次) - 必要的输入:ISV提供《测试报告》,《bug列表》 - 评分细则(详细说明见《附录1 质量评分细则说明》): 1.Blocker:功能主流程无法走通(验收不通过) 86 | 2.Critical:系统无法执行、崩溃或严重资源不足、应用模块无法启动或异常退出、无法测试、造成系统不稳定。(验收不通过) 87 | 3.Major:部分非祝流程功能存在严重缺陷,但不会影响到系统稳定性(扣7分) 88 | 4.Minor:界面、性能缺陷(扣2分) 89 | 5.Trivial:易用性问题(扣1分) #### 应用线上质量标准: 1.ISV需按照《附录2线上故障定义表》 中的故障等级定义解决线上问题 90 | 2.P1/P2类bug 处理 原则当天发现当天解决不得过夜 91 | 3.P3类bug 处理 原则不得超过3天 92 | 4.P4类bug 处理 原则可在下个迭代发布中解决 93 | 94 | ### 性能标准 95 | #### 服务端响应时间 96 | isv服务端授权激活响应时间整体小于3s #### 页面大小 首屏页面大小小于200k #### 加载时间 首屏加载时间小于2s #### 微应用性能检测 使用钉钉官方提供的微应用性能检测工具,检测评分大于90分,评分工具地址:http://mqc.aliyun.com/hfive.htm?from=dingtalk;您需要使用阿里云帐号进行登陆 97 | 98 | ### 安全标准 #### 应用服务安全标准: 1.应用必须部署在阿里云(适用范围:SAAS类应用适用;独立部署应用不做此限制) 99 | 2.开启云盾全部防御功能,开启云监控,实时监控线上服务状况保障7*24小时防控 #### 代码安全标准: 1.符合[《钉钉开放平台编码规范》](http://download.taobaocdn.com/freedom/30563/compress/p1a5tl8v1f1n1b1a4hk6vbl01nnv5.zip) 100 | 2.通过钉钉官方安全扫描 101 | ### 数据采集标准 102 | #### 数据指标: 1.操作用户数:指每日在应用内重要按钮有操作行为的去重用户数 103 | 2.操作企业数:指每日在应用内重要按钮有操作行为的用户所在企业去重统计数 104 | 3.重要按钮: 105 | 1).重要的TAB页面切换,比如 应用有5个浏览页面,每次切换页面需要记录一个操作 106 | 2).向服务端有数据上传的点击,比如 表单保存,提交数据,页面修改,新增内容,上传图片等 107 | 108 | 109 | ## 运营标准 110 | 111 | ### 新用户引导 112 | 113 | 如: 114 | 115 | ![operation_newuser](https://img.alicdn.com/tps/TB1BEuXLXXXXXbtXVXXXXXXXXXX-337-392.png) 116 | 117 | ### 版本更新用户引导 118 | 如: 119 | 120 | ![operation_newrelease](https://img.alicdn.com/tps/TB1.9KrLXXXXXXCXpXXXXXXXXXX-375-434.png) 121 | 122 | ### 用户反馈 123 | 124 | 在应用中需要有方便用户反馈的入口,并确保可以及时给用户反馈,例如: 125 | ![operation_feedback](https://img.alicdn.com/tps/TB11uirLXXXXXXGXpXXXXXXXXXX-375-617.png) 126 | 127 | ### 用户使用手册 128 | 129 | 简单应用仅需提供H5使用手册,复杂并涉及到管理后台配置及操作的,需要提供PC端及H5使用手册。可参考钉钉现有体验站,或提供图文、视频等应用使用说明,方便用户参看或企业内传阅。参考[《钉钉体验站模板及提交规范》](http://download.taobaocdn.com/freedom/30563/compress/p1a5tl8v1libr132t1khc1gvi1nhr8.zip);例如: 130 | 131 | ![operation_usemanual](https://img.alicdn.com/tps/TB1Zjh7LXXXXXcrXVXXXXXXXXXX-393-550.png) 132 | 133 | ## 上架(应用中心)标准 134 | 135 | ### 服务提供商资质审核标准 136 | 137 | 1、符合国家相关法律、法规规定,拥有正规的公司资质,具有15人以上的技术及客服团队; 138 | 2、拥有一年以上的该行业的服务经验; 139 | 3、可提供不少于5*8小时的客服在线服务; 140 | 4、提供的应用均以钉钉产品为使用场景; 141 | 5、接受《云市场服务商入驻协议 》以及 《云市场平台服务协议 》并按照协议相互约束的条款开展业务合作; 142 | 6、接受阿里云云市场的相关协议及管理规范; ### 保证金规则 143 | 为了更好地保障阿里云用户及钉钉的权益,提升云市场应用提供商的服务水平和商品质量。发布钉钉商品前,其服务商需缴纳保证金;如果服务商未缴纳保证金,其名下的商品不得上架售卖。 144 | 145 | 线下布暑非钉钉市场上架商品暂时不需要缴纳保证金,以上保证金金额根据业务量变化适度调整,最终解释权归钉钉事业部所有; 146 | 147 | ### 保证金缴纳 148 | 149 | 分类 | 保证金金额 150 | ----------- | ------------- 151 | A、免费应用 | 5万元 B、收费应用 | 累计交易额 0<X≤500(万元) | 10万 累计交易额 500<X≤1000(万元) | 50万 累计交易额 1000万元以上 | 100万 152 | 153 | 保证金缴纳账号为: 154 | 155 | 淘宝(中国)软件有限公司 156 | 157 | 开户行:招商银行杭州高新支行 158 | 159 | 账号: 571904478110101 160 | 161 | ### 应用收费规则 162 | 163 | 支持按次售卖或按周期售卖 164 | 1.如果选择按次售卖,则请设置商品单次价格。免费商品价格设置0元,联系小二进行操作设置 165 | 2.如果选择按周期售卖,则需要设置允许订购的周期,新购价格,续费价格。新购、续费价格以单月为基价,不同订购周期的价格为基价*订购周期的月份数。如果需要设置优惠,请联系小二操作 166 | ### 结算方式 167 | 168 | #### 按月结算 169 | 次月底前阿里云为ISV结算上月全部交易额 170 | #### 开票方式 171 | ISV开全额发票给企业用户 172 | 1.分成:2016年3月份之前不进行分成,分成之后,分成部分的发票由阿里云为ISV进行开票 173 | 174 | ## 附录1:质量评分细则说明 175 | 1) Blocker:阻碍开发或测试工作的问题。(这个测试人员通常很少遇到)(验收不通过) 176 | 2) Critical:系统无法执行、崩溃或严重资源不足、应用模块无法启动或异常退出、无法测试、造成系统不稳定。(验收不通过) 具体为: 177 | ○ 严重花屏 178 | ○ 内存泄漏 179 | ○ 用户数据丢失或破坏 180 | ○ 系统崩溃/死机/冻结 181 | ○ 模块无法启动或异常退出 182 | ○ 严重的数值计算错误 183 | ○ 功能设计与需求严重不符 184 | ○ 用户权限问题 185 | ○ 安全问题 186 | ○ 其它导致无法测试的错误 187 | 3) Major:非祝流程功能存在严重缺陷,但不会影响到系统稳定性(验收不通过) 具体为: 188 | ○功能未实现 189 | ○ 功能错误 190 | ○ 系统刷新错误 191 | ○ 语音或数据通讯错误 192 | ○ 轻微的数值计算错误 193 | ○ 系统所提供的功能或服务受明显的影响 194 | 4) Minor:界面、性能缺陷(扣2分) 具体为: 195 | ○ 操作界面错误(包括数据窗口内列名定义、含义是否一致) 196 | ○ 边界条件下错误 197 | ○ 提示信息错误(包括未给出信息、信息提示错误等) 198 | ○ 长时间操作无进度提示 199 | ○ 系统未优化(性能问题) 200 | ○ 光标跳转设置不好,鼠标(光标)定位错误 201 | 5) Trivial:易用性及建议性问题(扣1分) 具体为: 202 | ○ 界面格式等不规范 203 | ○ 辅助说明描述不清楚 204 | ○ 操作时未给用户提示 205 | ○ 可输入区域和只读区域没有明显的区分标志 206 | ○ 个别不影响产品理解的错别字 207 | ○ 文字排列不整齐等一些小问题 208 | ○ 建议 209 | 210 | ## 附录2:线上故障定义表 211 | 212 | ![fault_list](https://img.alicdn.com/tps/TB1mWJ.LXXXXXbHXVXXXXXXXXXX-632-486.png) 213 | 214 | 215 | ## 附录3:适配机型列表 216 | 217 | Android:(Android4.1及以上版本) 218 | 1、htc x920e 219 | 2. LG G2 A8 220 | 3. Coolpad A6 221 | 4. huawei g3 222 | 5. Moto G 223 | 6、OPPO U705T Android 4.1.1 224 | 7、三星 s4 I9500 Android4.2.2 225 | 8、华为H60-L02 226 | 9、华为H30-L01 227 | 10、nexus 5 A10 5.1.1 228 | 11、coolpad 8720 Android 4.3 229 | 12、nexus 4 230 | 13、魅族MX4 Android 4.4.2 231 | 14、魅族MX4 Pro Android 4.4.4 232 | 15、三星Note 3 Android 4.3 233 | 16、Oppo813t 小屏 234 | 17、vivo S9t Android 4.1.2 235 | 18、三星GT-N7100 Android 4.1.2 236 | 19、魅族 M1 note Android 4.4.4 237 | 20、华为Mate 7 5.1.1 238 | 21、联想A820t Android 4.1.2 239 | iPhone:(IOS 7及以上版本) 240 | iPhone 4s 241 | iPhone 5 242 | iPhone 5c 243 | iPhone 5s 244 | iPhone6 245 | iPhone 6plus 246 | iPhone 6s 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | -------------------------------------------------------------------------------- /source/includes/_updatelog.md: -------------------------------------------------------------------------------- 1 | # Release Notes 2 |
    3 |
    4 |
    5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
    14 |
    15 |
    16 |
    17 |
    18 |
    19 |
    20 |
    21 |
    22 |
    23 |
    24 |
    25 |
    26 |
    27 |
    28 |
    29 |
    30 |
    31 |
    32 |
    33 |
    34 |
    35 |
    36 |
    37 |
    38 |
    39 |
    40 |
    41 |
    42 |
    43 |
    44 |
    45 |
    46 |
    47 |
    48 |
    49 |
    50 |
    51 |
    52 |
    53 |
    54 |
    55 |
    56 |
    57 | 58 | -------------------------------------------------------------------------------- /source/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 钉钉开放平台 3 | 4 | toc_footers: 5 | 6 | includes: 7 | 8 | - overview 9 | 10 | - guide 11 | 12 | - isvguide 13 | 14 | - standar 15 | 16 | - identityverify 17 | 18 | - server 19 | 20 | - client 21 | 22 | - pc 23 | 24 | - cdn 25 | 26 | - share 27 | 28 | - blog 29 | 30 | - faq 31 | 32 | - updatelog 33 | 34 | search: false 35 | --- 36 | 37 | -------------------------------------------------------------------------------- /source/javascripts/all.js: -------------------------------------------------------------------------------- 1 | //= require ./lib/_energize 2 | //= require ./app/_lang 3 | //= require ./app/_search 4 | //= require ./app/_toc 5 | -------------------------------------------------------------------------------- /source/javascripts/all_nosearch.js: -------------------------------------------------------------------------------- 1 | //= require ./lib/_energize 2 | //= require ./app/_lang 3 | //= require ./app/_toc 4 | -------------------------------------------------------------------------------- /source/javascripts/app/_lang.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2008-2013 Concur Technologies, Inc. 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); you may 5 | not use this file except in compliance with the License. You may obtain 6 | a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | License for the specific language governing permissions and limitations 14 | under the License. 15 | */ 16 | (function (global) { 17 | 'use strict'; 18 | 19 | var languages = []; 20 | 21 | global.setupLanguages = setupLanguages; 22 | global.activateLanguage = activateLanguage; 23 | 24 | function activateLanguage(language) { 25 | if (!language) return; 26 | if (language === "") return; 27 | 28 | $(".lang-selector a").removeClass('active'); 29 | $(".lang-selector a[data-language-name='" + language + "']").addClass('active'); 30 | for (var i=0; i < languages.length; i++) { 31 | $(".highlight." + languages[i]).hide(); 32 | } 33 | $(".highlight." + language).show(); 34 | 35 | global.toc.calculateHeights(); 36 | 37 | // scroll to the new location of the position 38 | if ($(window.location.hash).get(0)) { 39 | $(window.location.hash).get(0).scrollIntoView(true); 40 | } 41 | } 42 | 43 | // parseURL and stringifyURL are from https://github.com/sindresorhus/query-string 44 | // MIT licensed 45 | // https://github.com/sindresorhus/query-string/blob/7bee64c16f2da1a326579e96977b9227bf6da9e6/license 46 | function parseURL(str) { 47 | if (typeof str !== 'string') { 48 | return {}; 49 | } 50 | 51 | str = str.trim().replace(/^(\?|#|&)/, ''); 52 | 53 | if (!str) { 54 | return {}; 55 | } 56 | 57 | return str.split('&').reduce(function (ret, param) { 58 | var parts = param.replace(/\+/g, ' ').split('='); 59 | var key = parts[0]; 60 | var val = parts[1]; 61 | 62 | key = decodeURIComponent(key); 63 | // missing `=` should be `null`: 64 | // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters 65 | val = val === undefined ? null : decodeURIComponent(val); 66 | 67 | if (!ret.hasOwnProperty(key)) { 68 | ret[key] = val; 69 | } else if (Array.isArray(ret[key])) { 70 | ret[key].push(val); 71 | } else { 72 | ret[key] = [ret[key], val]; 73 | } 74 | 75 | return ret; 76 | }, {}); 77 | }; 78 | 79 | function stringifyURL(obj) { 80 | return obj ? Object.keys(obj).sort().map(function (key) { 81 | var val = obj[key]; 82 | 83 | if (Array.isArray(val)) { 84 | return val.sort().map(function (val2) { 85 | return encodeURIComponent(key) + '=' + encodeURIComponent(val2); 86 | }).join('&'); 87 | } 88 | 89 | return encodeURIComponent(key) + '=' + encodeURIComponent(val); 90 | }).join('&') : ''; 91 | }; 92 | 93 | // gets the language set in the query string 94 | function getLanguageFromQueryString() { 95 | if (location.search.length >= 1) { 96 | var language = parseURL(location.search).language 97 | if (language) { 98 | return language; 99 | } else if (jQuery.inArray(location.search.substr(1), languages) != -1) { 100 | return location.search.substr(1); 101 | } 102 | } 103 | 104 | return false; 105 | } 106 | 107 | // returns a new query string with the new language in it 108 | function generateNewQueryString(language) { 109 | var url = parseURL(location.search); 110 | if (url.language) { 111 | url.language = language; 112 | return stringifyURL(url); 113 | } 114 | return language; 115 | } 116 | 117 | // if a button is clicked, add the state to the history 118 | function pushURL(language) { 119 | if (!history) { return; } 120 | var hash = window.location.hash; 121 | if (hash) { 122 | hash = hash.replace(/^#+/, ''); 123 | } 124 | history.pushState({}, '', '?' + generateNewQueryString(language) + '#' + hash); 125 | 126 | // save language as next default 127 | localStorage.setItem("language", language); 128 | } 129 | 130 | function setupLanguages(l) { 131 | var defaultLanguage = localStorage.getItem("language"); 132 | 133 | languages = l; 134 | 135 | var presetLanguage = getLanguageFromQueryString(); 136 | if (presetLanguage) { 137 | // the language is in the URL, so use that language! 138 | activateLanguage(presetLanguage); 139 | 140 | localStorage.setItem("language", presetLanguage); 141 | } else if ((defaultLanguage !== null) && (jQuery.inArray(defaultLanguage, languages) != -1)) { 142 | // the language was the last selected one saved in localstorage, so use that language! 143 | activateLanguage(defaultLanguage); 144 | } else { 145 | // no language selected, so use the default 146 | activateLanguage(languages[0]); 147 | } 148 | } 149 | 150 | // if we click on a language tab, activate that language 151 | $(function() { 152 | $(".lang-selector a").on("click", function() { 153 | var language = $(this).data("language-name"); 154 | pushURL(language); 155 | activateLanguage(language); 156 | return false; 157 | }); 158 | window.onpopstate = function() { 159 | activateLanguage(getLanguageFromQueryString()); 160 | }; 161 | }); 162 | })(window); 163 | -------------------------------------------------------------------------------- /source/javascripts/app/_search.js: -------------------------------------------------------------------------------- 1 | //= require ../lib/_lunr 2 | //= require ../lib/_jquery.highlight 3 | (function () { 4 | 'use strict'; 5 | 6 | var content, searchResults; 7 | var highlightOpts = { element: 'span', className: 'search-highlight' }; 8 | 9 | var index = new lunr.Index(); 10 | 11 | index.ref('id'); 12 | index.field('title', { boost: 10 }); 13 | index.field('body'); 14 | index.pipeline.add(lunr.trimmer, lunr.stopWordFilter); 15 | 16 | $(populate); 17 | $(bind); 18 | 19 | function populate() { 20 | $('h1, h2').each(function() { 21 | var title = $(this); 22 | var body = title.nextUntil('h1, h2'); 23 | index.add({ 24 | id: title.prop('id'), 25 | title: title.text(), 26 | body: body.text() 27 | }); 28 | }); 29 | } 30 | 31 | function bind() { 32 | content = $('.content'); 33 | searchResults = $('.search-results'); 34 | 35 | $('#input-search').on('keyup', search); 36 | } 37 | 38 | function search(event) { 39 | unhighlight(); 40 | searchResults.addClass('visible'); 41 | 42 | // ESC clears the field 43 | if (event.keyCode === 27) this.value = ''; 44 | 45 | if (this.value) { 46 | var results = index.search(this.value).filter(function(r) { 47 | return r.score > 0.0001; 48 | }); 49 | 50 | if (results.length) { 51 | searchResults.empty(); 52 | $.each(results, function (index, result) { 53 | var elem = document.getElementById(result.ref); 54 | searchResults.append("
  • " + $(elem).text() + "
  • "); 55 | }); 56 | highlight.call(this); 57 | } else { 58 | searchResults.html('
  • '); 59 | $('.search-results li').text('No Results Found for "' + this.value + '"'); 60 | } 61 | } else { 62 | unhighlight(); 63 | searchResults.removeClass('visible'); 64 | } 65 | } 66 | 67 | function highlight() { 68 | if (this.value) content.highlight(this.value, highlightOpts); 69 | } 70 | 71 | function unhighlight() { 72 | content.unhighlight(highlightOpts); 73 | } 74 | })(); 75 | -------------------------------------------------------------------------------- /source/javascripts/app/_toc.js: -------------------------------------------------------------------------------- 1 | //= require ../lib/_jquery_ui 2 | //= require ../lib/_jquery.tocify 3 | (function (global) { 4 | 'use strict'; 5 | 6 | var closeToc = function() { 7 | $(".tocify-wrapper").removeClass('open'); 8 | $("#nav-button").removeClass('open'); 9 | }; 10 | 11 | var makeToc = function() { 12 | global.toc = $("#toc").tocify({ 13 | selectors: 'h1, h2, h3', 14 | extendPage: false, 15 | theme: 'none', 16 | smoothScroll: false, 17 | showEffectSpeed: 0, 18 | hideEffectSpeed: 180, 19 | ignoreSelector: '.toc-ignore', 20 | highlightOffset: 60, 21 | scrollTo: -1, 22 | scrollHistory: true, 23 | hashGenerator: function (text, element) { 24 | return element.prop('id'); 25 | } 26 | }).data('toc-tocify'); 27 | 28 | $("#nav-button").click(function() { 29 | $(".tocify-wrapper").toggleClass('open'); 30 | $("#nav-button").toggleClass('open'); 31 | return false; 32 | }); 33 | 34 | $(".page-wrapper").click(closeToc); 35 | $(".tocify-item").click(closeToc); 36 | }; 37 | 38 | // Hack to make already open sections to start opened, 39 | // instead of displaying an ugly animation 40 | function animate () { 41 | setTimeout(function() { 42 | toc.setOption('showEffectSpeed', 180); 43 | }, 50); 44 | } 45 | 46 | $(makeToc); 47 | $(animate); 48 | 49 | })(window); 50 | 51 | -------------------------------------------------------------------------------- /source/javascripts/lib/_energize.js: -------------------------------------------------------------------------------- 1 | /** 2 | * energize.js v0.1.0 3 | * 4 | * Speeds up click events on mobile devices. 5 | * https://github.com/davidcalhoun/energize.js 6 | */ 7 | 8 | (function() { // Sandbox 9 | /** 10 | * Don't add to non-touch devices, which don't need to be sped up 11 | */ 12 | if(!('ontouchstart' in window)) return; 13 | 14 | var lastClick = {}, 15 | isThresholdReached, touchstart, touchmove, touchend, 16 | click, closest; 17 | 18 | /** 19 | * isThresholdReached 20 | * 21 | * Compare touchstart with touchend xy coordinates, 22 | * and only fire simulated click event if the coordinates 23 | * are nearby. (don't want clicking to be confused with a swipe) 24 | */ 25 | isThresholdReached = function(startXY, xy) { 26 | return Math.abs(startXY[0] - xy[0]) > 5 || Math.abs(startXY[1] - xy[1]) > 5; 27 | }; 28 | 29 | /** 30 | * touchstart 31 | * 32 | * Save xy coordinates when the user starts touching the screen 33 | */ 34 | touchstart = function(e) { 35 | this.startXY = [e.touches[0].clientX, e.touches[0].clientY]; 36 | this.threshold = false; 37 | }; 38 | 39 | /** 40 | * touchmove 41 | * 42 | * Check if the user is scrolling past the threshold. 43 | * Have to check here because touchend will not always fire 44 | * on some tested devices (Kindle Fire?) 45 | */ 46 | touchmove = function(e) { 47 | // NOOP if the threshold has already been reached 48 | if(this.threshold) return false; 49 | 50 | this.threshold = isThresholdReached(this.startXY, [e.touches[0].clientX, e.touches[0].clientY]); 51 | }; 52 | 53 | /** 54 | * touchend 55 | * 56 | * If the user didn't scroll past the threshold between 57 | * touchstart and touchend, fire a simulated click. 58 | * 59 | * (This will fire before a native click) 60 | */ 61 | touchend = function(e) { 62 | // Don't fire a click if the user scrolled past the threshold 63 | if(this.threshold || isThresholdReached(this.startXY, [e.changedTouches[0].clientX, e.changedTouches[0].clientY])) { 64 | return; 65 | } 66 | 67 | /** 68 | * Create and fire a click event on the target element 69 | * https://developer.mozilla.org/en/DOM/event.initMouseEvent 70 | */ 71 | var touch = e.changedTouches[0], 72 | evt = document.createEvent('MouseEvents'); 73 | evt.initMouseEvent('click', true, true, window, 0, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null); 74 | evt.simulated = true; // distinguish from a normal (nonsimulated) click 75 | e.target.dispatchEvent(evt); 76 | }; 77 | 78 | /** 79 | * click 80 | * 81 | * Because we've already fired a click event in touchend, 82 | * we need to listed for all native click events here 83 | * and suppress them as necessary. 84 | */ 85 | click = function(e) { 86 | /** 87 | * Prevent ghost clicks by only allowing clicks we created 88 | * in the click event we fired (look for e.simulated) 89 | */ 90 | var time = Date.now(), 91 | timeDiff = time - lastClick.time, 92 | x = e.clientX, 93 | y = e.clientY, 94 | xyDiff = [Math.abs(lastClick.x - x), Math.abs(lastClick.y - y)], 95 | target = closest(e.target, 'A') || e.target, // needed for standalone apps 96 | nodeName = target.nodeName, 97 | isLink = nodeName === 'A', 98 | standAlone = window.navigator.standalone && isLink && e.target.getAttribute("href"); 99 | 100 | lastClick.time = time; 101 | lastClick.x = x; 102 | lastClick.y = y; 103 | 104 | /** 105 | * Unfortunately Android sometimes fires click events without touch events (seen on Kindle Fire), 106 | * so we have to add more logic to determine the time of the last click. Not perfect... 107 | * 108 | * Older, simpler check: if((!e.simulated) || standAlone) 109 | */ 110 | if((!e.simulated && (timeDiff < 500 || (timeDiff < 1500 && xyDiff[0] < 50 && xyDiff[1] < 50))) || standAlone) { 111 | e.preventDefault(); 112 | e.stopPropagation(); 113 | if(!standAlone) return false; 114 | } 115 | 116 | /** 117 | * Special logic for standalone web apps 118 | * See http://stackoverflow.com/questions/2898740/iphone-safari-web-app-opens-links-in-new-window 119 | */ 120 | if(standAlone) { 121 | window.location = target.getAttribute("href"); 122 | } 123 | 124 | /** 125 | * Add an energize-focus class to the targeted link (mimics :focus behavior) 126 | * TODO: test and/or remove? Does this work? 127 | */ 128 | if(!target || !target.classList) return; 129 | target.classList.add("energize-focus"); 130 | window.setTimeout(function(){ 131 | target.classList.remove("energize-focus"); 132 | }, 150); 133 | }; 134 | 135 | /** 136 | * closest 137 | * @param {HTMLElement} node current node to start searching from. 138 | * @param {string} tagName the (uppercase) name of the tag you're looking for. 139 | * 140 | * Find the closest ancestor tag of a given node. 141 | * 142 | * Starts at node and goes up the DOM tree looking for a 143 | * matching nodeName, continuing until hitting document.body 144 | */ 145 | closest = function(node, tagName){ 146 | var curNode = node; 147 | 148 | while(curNode !== document.body) { // go up the dom until we find the tag we're after 149 | if(!curNode || curNode.nodeName === tagName) { return curNode; } // found 150 | curNode = curNode.parentNode; // not found, so keep going up 151 | } 152 | 153 | return null; // not found 154 | }; 155 | 156 | /** 157 | * Add all delegated event listeners 158 | * 159 | * All the events we care about bubble up to document, 160 | * so we can take advantage of event delegation. 161 | * 162 | * Note: no need to wait for DOMContentLoaded here 163 | */ 164 | document.addEventListener('touchstart', touchstart, false); 165 | document.addEventListener('touchmove', touchmove, false); 166 | document.addEventListener('touchend', touchend, false); 167 | document.addEventListener('click', click, true); // TODO: why does this use capture? 168 | 169 | })(); -------------------------------------------------------------------------------- /source/javascripts/lib/_jquery.highlight.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery Highlight plugin 3 | * 4 | * Based on highlight v3 by Johann Burkard 5 | * http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html 6 | * 7 | * Code a little bit refactored and cleaned (in my humble opinion). 8 | * Most important changes: 9 | * - has an option to highlight only entire words (wordsOnly - false by default), 10 | * - has an option to be case sensitive (caseSensitive - false by default) 11 | * - highlight element tag and class names can be specified in options 12 | * 13 | * Usage: 14 | * // wrap every occurrance of text 'lorem' in content 15 | * // with (default options) 16 | * $('#content').highlight('lorem'); 17 | * 18 | * // search for and highlight more terms at once 19 | * // so you can save some time on traversing DOM 20 | * $('#content').highlight(['lorem', 'ipsum']); 21 | * $('#content').highlight('lorem ipsum'); 22 | * 23 | * // search only for entire word 'lorem' 24 | * $('#content').highlight('lorem', { wordsOnly: true }); 25 | * 26 | * // don't ignore case during search of term 'lorem' 27 | * $('#content').highlight('lorem', { caseSensitive: true }); 28 | * 29 | * // wrap every occurrance of term 'ipsum' in content 30 | * // with 31 | * $('#content').highlight('ipsum', { element: 'em', className: 'important' }); 32 | * 33 | * // remove default highlight 34 | * $('#content').unhighlight(); 35 | * 36 | * // remove custom highlight 37 | * $('#content').unhighlight({ element: 'em', className: 'important' }); 38 | * 39 | * 40 | * Copyright (c) 2009 Bartek Szopka 41 | * 42 | * Licensed under MIT license. 43 | * 44 | */ 45 | 46 | jQuery.extend({ 47 | highlight: function (node, re, nodeName, className) { 48 | if (node.nodeType === 3) { 49 | var match = node.data.match(re); 50 | if (match) { 51 | var highlight = document.createElement(nodeName || 'span'); 52 | highlight.className = className || 'highlight'; 53 | var wordNode = node.splitText(match.index); 54 | wordNode.splitText(match[0].length); 55 | var wordClone = wordNode.cloneNode(true); 56 | highlight.appendChild(wordClone); 57 | wordNode.parentNode.replaceChild(highlight, wordNode); 58 | return 1; //skip added node in parent 59 | } 60 | } else if ((node.nodeType === 1 && node.childNodes) && // only element nodes that have children 61 | !/(script|style)/i.test(node.tagName) && // ignore script and style nodes 62 | !(node.tagName === nodeName.toUpperCase() && node.className === className)) { // skip if already highlighted 63 | for (var i = 0; i < node.childNodes.length; i++) { 64 | i += jQuery.highlight(node.childNodes[i], re, nodeName, className); 65 | } 66 | } 67 | return 0; 68 | } 69 | }); 70 | 71 | jQuery.fn.unhighlight = function (options) { 72 | var settings = { className: 'highlight', element: 'span' }; 73 | jQuery.extend(settings, options); 74 | 75 | return this.find(settings.element + "." + settings.className).each(function () { 76 | var parent = this.parentNode; 77 | parent.replaceChild(this.firstChild, this); 78 | parent.normalize(); 79 | }).end(); 80 | }; 81 | 82 | jQuery.fn.highlight = function (words, options) { 83 | var settings = { className: 'highlight', element: 'span', caseSensitive: false, wordsOnly: false }; 84 | jQuery.extend(settings, options); 85 | 86 | if (words.constructor === String) { 87 | words = [words]; 88 | } 89 | words = jQuery.grep(words, function(word, i){ 90 | return word != ''; 91 | }); 92 | words = jQuery.map(words, function(word, i) { 93 | return word.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 94 | }); 95 | if (words.length == 0) { return this; }; 96 | 97 | var flag = settings.caseSensitive ? "" : "i"; 98 | var pattern = "(" + words.join("|") + ")"; 99 | if (settings.wordsOnly) { 100 | pattern = "\\b" + pattern + "\\b"; 101 | } 102 | var re = new RegExp(pattern, flag); 103 | 104 | return this.each(function () { 105 | jQuery.highlight(this, re, settings.element, settings.className); 106 | }); 107 | }; 108 | 109 | -------------------------------------------------------------------------------- /source/javascripts/releasenotes.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright, Cedric Dugas, 3 | * Do not sell or redistribute 4 | */ 5 | 6 | 7 | (function($) 8 | { 9 | // mardown parser options, do not touch 10 | marked.setOptions({ 11 | gfm: true, 12 | pedantic: false, 13 | sanitize: true 14 | }); 15 | var issueClick = function issueOnclick(hashValue) 16 | {location.hash = "#" + hashValue;} 17 | 18 | // Default setting 19 | var defaultSettings = { 20 | milestonesShown : 10, 21 | // If you want to show private repo 22 | // You need to add repo credentials in api.php 23 | phpApi : false, 24 | phpApiPath : '/', 25 | showDescription : true, 26 | showComments : true, 27 | // Used if phpAPI is false 28 | repo : 'appstore', 29 | username : 'ddtalk' 30 | }; 31 | 32 | $.fn.releaseNotes = function(settings){ 33 | settings = $.extend({}, defaultSettings, settings || {}); 34 | var apiPath = settings.phpApiPath+"api.php"; 35 | var respType = (settings.phpApi) ? "json" : "jsonp"; 36 | 37 | var releases = { 38 | load: function(el){ 39 | var _this = this; 40 | this.$el = $(el); 41 | this.loadEvents(); 42 | 43 | var options = $.extend(settings, { 44 | state: "closed", 45 | action: "milestones", 46 | sort:"due_date" 47 | }); 48 | 49 | this.callApi(options).success(function(resp){ 50 | if(resp.data) resp= resp.data; 51 | _this.showMilestones(resp); 52 | }).error(function(resp){ 53 | console.log(resp) 54 | }); 55 | }, 56 | loadEvents : function(){ 57 | var _this = this; 58 | if(settings.showDescription) this.$el.delegate(".issue", "click", function(){ _this.loadIssueDesc(this); return false;}); 59 | if(settings.showComments) this.$el.delegate(".btnComments", "click", function(){ _this.loadComments(this); return false;}); 60 | }, 61 | loadIssueDesc : function(el){ 62 | var $issue = $(el); 63 | var data = $issue.data("issue"); 64 | $bigIssue = $issue.find(".issueBig"); 65 | 66 | if(!$bigIssue.is(":visible")){ 67 | $(".issueBig").not($bigIssue).slideUp(); 68 | $bigIssue.find(".container").html(components.bigIssue(data, settings.showComments)); 69 | $bigIssue.slideDown(); 70 | }else{ 71 | $bigIssue.slideUp(); 72 | } 73 | }, 74 | showMilestones : function(milestones){ 75 | var _this = this; 76 | milestones.sort(this.sortDate); 77 | $.each(milestones, function(i, milestone){ 78 | if(i == settings.milestonesShown) return false; 79 | milestone.prettyDate = (milestone.due_on) ? _this.getPrettyDate(milestone.due_on) : _this.getPrettyDate(milestone.created_at); 80 | _this.$el.append(components.milestone(milestone)); 81 | var options = $.extend(settings, { 82 | milestone: milestone.number, 83 | sort:"created", 84 | action:"issues", 85 | state:"closed" 86 | }); 87 | _this.callApi(options).success(function(resp, textStatus, jqXHR){ 88 | if(resp.data) resp= resp.data; 89 | _this.showIssues(resp); 90 | }); 91 | 92 | }); 93 | }, 94 | loadComments : function(el){ 95 | 96 | var _this =this; 97 | var issueid =$(el).attr("data-issue-id"); 98 | $(el).fadeOut().slideUp(); 99 | 100 | var options = $.extend(settings, { 101 | issueid:issueid, 102 | action:"comments" 103 | }); 104 | 105 | this.callApi(options).success(function(resp, textStatus, jqXHR){ 106 | if(resp.data) resp= resp.data; 107 | _this.showComments(resp, issueid); 108 | }); 109 | }, 110 | showComments : function(comments,issueid){ 111 | var _this = this; 112 | 113 | var $commentContainer = _this.$el.find("#issue"+issueid).find(".comments").empty(); 114 | $.each(comments, function(i, comment){ 115 | comment.prettyDate = _this.getPrettyDate(comment.created_at); 116 | $commentContainer.append(components.comment(comment, issueid)); 117 | }); 118 | $commentContainer.slideDown(); 119 | }, 120 | showIssues : function(issues){ 121 | var _this = this; 122 | var jqMilestone = _this.$el.find("[data-id-milestone="+issues[0].milestone.number+"]"); 123 | var jqMilestoneIssues = jqMilestone.find(".issues"); 124 | issues.sort(this.sortLabel); 125 | $.each(issues, function(i, issue){ 126 | issue.prettyDate = _this.getPrettyDate(issue.closed_at); 127 | jqMilestoneIssues.append(components.issue(issue)); 128 | //$('#issue'+issue.number).onclick = issueClick(issue.body); 129 | }); 130 | jqMilestone.addClass("separator"); 131 | if(settings.showDescription) jqMilestone.find(".issue").addClass("cursor"); 132 | }, 133 | getPrettyDate : function(date){ 134 | var dateFormat = ""; 135 | var date = date.split("T"); 136 | var dateArray = date[0].split("-"); 137 | var dateObj = new Date(dateArray[0],(dateArray[1]-1),dateArray[2]); 138 | 139 | var weekday=new Array("Sunday","Monday","Tuesday","Wednesday","Thursday", "Friday","Saturday"); 140 | var monthname=new Array("January","February","March","April","May","June","July","August", "September","October","November","December"); 141 | dateFormat += weekday[dateObj.getDay()] + ", "; 142 | dateFormat += monthname[dateObj.getMonth()] + " "; 143 | dateFormat += dateObj.getDate() + ", "; 144 | dateFormat += dateObj.getFullYear(); 145 | return dateFormat; 146 | }, 147 | sortDate : function (milestone1, milestone2) { 148 | 149 | milestone1.dateTest = (milestone1.due_on) ? milestone1.due_on : milestone1.created_at; 150 | milestone2.dateTest = (milestone2.due_on) ? milestone2.due_on : milestone2.created_at; 151 | 152 | var date1 = new Date(milestone1.dateTest ); 153 | var date2 = new Date(milestone2.dateTest ); 154 | 155 | if (date1 < date2) return 1; 156 | if (date1 > date2) return -1; 157 | return 0; 158 | }, 159 | sortLabel :function(thisObject,thatObject) { 160 | if(!thisObject.labels.length) return 1; 161 | if(!thatObject.labels.length) return -1; 162 | if (thisObject.labels[0].name > thatObject.labels[0].name){ 163 | return 1; 164 | } 165 | else if (thisObject.labels[0].name < thatObject.labels[0].name){ 166 | return -1; 167 | } 168 | return 0; 169 | }, 170 | callApi: function(options){ 171 | var myoption = $.extend({}, options); 172 | if(myoption.repo) delete myoption.repo; 173 | return $.ajax({ 174 | url:this.urls[options.action](options), 175 | dataType:respType, 176 | data:myoption 177 | }); 178 | }, 179 | urls : { 180 | domainName : "https://api.github.com", 181 | milestones : function(){ 182 | if(!settings.phpApi){ 183 | return $url = this.domainName+ "/repos/"+settings.username +"/"+ settings.repo +"/milestones"; 184 | }else{ 185 | return apiPath; 186 | }; 187 | }, 188 | issues : function(){ 189 | if(!settings.phpApi){ 190 | return $url = this.domainName+"/repos/"+ settings.username +"/"+ settings.repo +"/issues"; 191 | }else{ 192 | return apiPath; 193 | }; 194 | }, 195 | comments : function(options){ 196 | if(!settings.phpApi){ 197 | return $url = this.domainName+"/repos/"+ settings.username +"/"+ settings.repo+"/issues/"+ options.issueid +"/comments"; 198 | }else{ 199 | return apiPath; 200 | } 201 | } 202 | } 203 | }; 204 | 205 | return this.each(function(){ 206 | releases.load(this, settings); 207 | }); 208 | }; 209 | var components = { 210 | milestone : function(data){ 211 | return $('
    \ 212 |

    '+data.title+'

    \ 213 |

    发布日期: '+data.prettyDate+'

    \ 214 |
    \ 215 |
    ').data("milestone", data); 216 | }, 217 | issue : function(data){ 218 | var labels = "", 219 | _this = this; 220 | 221 | $.each(data.labels, function(i, label){ labels += _this.label(label); }); 222 | 223 | 224 | if (data.body !== null && data.body !== undefined && data.body !== '' && data.body.substring(0,1) == "#"){ 225 | return $('
    \ 226 |
      \ 227 |
    • '+labels+' '+$("").html(data.title).text()+'

    • \ 228 |
    \ 229 | ').data("issue", data); 230 | 231 | }else{ 232 | return $('
    \ 233 |
      \ 234 |
    • '+labels+' '+$("").html(data.title).text()+'

    • \ 235 |
    \ 236 | ').data("issue", data); 237 | 238 | } 239 | 240 | return $('
    \ 241 |
      \ 242 |
    • '+labels+' '+$("").html(data.title).text()+'

    • \ 243 |
    \ 244 | ').data("issue", data); 245 | //return $('
    \ 246 | // '+labels+' '+$("").html(data.title).text()+' \ 247 | // ').data("issue", data); 248 | 249 | 250 | 251 | // return $('
    \ 252 | //
    \ 253 | //
    '+labels+' '+$("").html(data.title).text()+'
    \ 254 | //
    \ 255 | //
    \ 256 | //
    \ 257 | //
    \ 258 | //
    ').data("issue", data); 259 | }, 260 | label : function(data){ 261 | return ''+data.name+''; 262 | }, 263 | bigIssue : function(data, showComment){ 264 | // var commentLink = (data.comments != 0 && showComment) ? 'See Comments' : ""; 265 | 266 | // return $('
    \ 267 | // \ 268 | //
    \ 269 | //
    \ 270 | //
    \ 271 | //

    Opened by '+data.user.login+', issue closed on '+data.prettyDate+'

    \ 272 | //

    '+$("").html(data.title).text()+'

    \ 273 | //
    \ 274 | //
    \ 275 | // '+marked(data.body)+'\ 276 | //
    \ 277 | //
    \ 278 | //
    \ 279 | //
    \ 280 | //
    \ 281 | //
    '+commentLink).data("issue", data); 282 | }, 283 | comment : function(data){ 284 | // return '
    \ 285 | // \ 286 | //
    \ 287 | //
    \ 288 | //
    \ 289 | //

    \ 290 | // \ 291 | // '+data.user.login+'\ 292 | // \ 293 | // commented\ 294 | // \ 295 | //

    \ 296 | //

    \ 297 | // '+data.prettyDate+'\ 298 | //

    \ 299 | //
    \ 300 | //
    \ 301 | //
    \ 302 | //
    '+marked(data.body)+'
    \ 303 | //
    \ 304 | //
    \ 305 | //
    \ 306 | //
    \ 307 | //
    '; 308 | } 309 | } 310 | })(jQuery); -------------------------------------------------------------------------------- /source/layouts/layout.erb: -------------------------------------------------------------------------------- 1 | <%# 2 | Copyright 2008-2013 Concur Technologies, Inc. 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); you may 5 | not use this file except in compliance with the License. You may obtain 6 | a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | License for the specific language governing permissions and limitations 14 | under the License. 15 | %> 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | <%= current_page.data.title || "钉钉开放平台" %> 24 | 25 | <%= stylesheet_link_tag :screen, media: :screen %> 26 | <%= stylesheet_link_tag :print, media: :print %> 27 | <%= stylesheet_link_tag :nav, media: :nav %> 28 | 29 | <% if current_page.data.search %> 30 | <%= javascript_include_tag "all" %> 31 | <% else %> 32 | <%= javascript_include_tag "all_nosearch" %> 33 | <% end %> 34 | 35 | 38 | 39 | 40 | 56 | 57 | 58 | 59 | 60 | 61 |
    62 |
    63 | 64 |
    65 |
    66 |
      67 |
    • 概述
    • 68 |
    • 接入指南
    • 69 |
    • 服务端开发文档 70 |
    • 71 |
    • 客户端开发文档 72 |
    • 73 |
    • FAQ
    • 74 |
    75 |
    76 |
    77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 菜单 85 | <%= image_tag('navbar.png') %> 86 | 87 | 88 |
    89 | <%= image_tag "logo.png" %> 90 |
    91 |
    92 | <% if current_page.data.toc_footers %> 93 |
      94 | <% current_page.data.toc_footers.each do |footer| %> 95 |
    • <%= footer %>
    • 96 | <% end %> 97 |
    98 | <% end %> 99 |
    100 |
    101 |
    102 |
    103 | <%= yield %> 104 | <% current_page.data.includes && current_page.data.includes.each do |include| %> 105 | <%= partial "includes/#{include}" %> 106 | <% end %> 107 |
    108 |
    110 | 111 | -------------------------------------------------------------------------------- /source/stylesheets/_icon-font.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'slate'; 3 | src:font-url('slate.eot?-syv14m'); 4 | src:font-url('slate.eot?#iefix-syv14m') format('embedded-opentype'), 5 | font-url('slate.woff2?-syv14m') format('woff2'), 6 | font-url('slate.woff?-syv14m') format('woff'), 7 | font-url('slate.ttf?-syv14m') format('truetype'), 8 | font-url('slate.svg?-syv14m#slate') format('svg'); 9 | font-weight: normal; 10 | font-style: normal; 11 | } 12 | 13 | %icon { 14 | font-family: 'slate'; 15 | speak: none; 16 | font-style: normal; 17 | font-weight: normal; 18 | font-variant: normal; 19 | text-transform: none; 20 | line-height: 1; 21 | } 22 | 23 | %icon-exclamation-sign { 24 | @extend %icon; 25 | content: "\e600"; 26 | } 27 | %icon-info-sign { 28 | @extend %icon; 29 | content: "\e602"; 30 | } 31 | %icon-ok-sign { 32 | @extend %icon; 33 | content: "\e606"; 34 | } 35 | %icon-search { 36 | @extend %icon; 37 | content: "\e607"; 38 | } 39 | -------------------------------------------------------------------------------- /source/stylesheets/_nav.scss: -------------------------------------------------------------------------------- 1 | .navbar { 2 | width: 100%; } 3 | 4 | nav { 5 | display: -webkit-flex; 6 | display: -ms-flexbox; 7 | display: flex; 8 | position: absolute; 9 | top: 0; 10 | left: 0; } 11 | @media (min-width: 48em) { 12 | nav { 13 | -webkit-justify-content: space-between; 14 | -ms-flex-pack: justify; 15 | justify-content: space-between; } } 16 | nav .logo-container { 17 | width: 100%; } 18 | @media (min-width: 48em) { 19 | nav .logo-container { 20 | width: auto; } } 21 | nav .logo { 22 | height: 60px; 23 | width: 200px; 24 | margin: 0 auto; 25 | /* background-image: url("../images/logo.svg"); */ 26 | background-repeat: no-repeat; 27 | background-position: center center; 28 | background-size: 100%; 29 | color: transparent; 30 | text-shadow: none; 31 | position: relative; } 32 | @media (min-width: 48em) { 33 | nav .logo { 34 | display: inline-block; 35 | margin: 6px 0 0 15px; } } 36 | 37 | nav li { 38 | list-style: none !important; 39 | color: #FFF; 40 | padding: 10px; 41 | font-size: 12px; 42 | letter-spacing: 1px; 43 | font-family: 'proxima-nova'; 44 | font-weight: bold; 45 | text-transform: uppercase; 46 | text-decoration: none; } 47 | 48 | .caret { 49 | margin-top: 4px; 50 | margin-left: 4px; 51 | display: inline-block; 52 | width: 0; 53 | height: 0; 54 | vertical-align: top; 55 | border-top: 4px solid white; 56 | border-right: 4px solid transparent; 57 | border-left: 4px solid transparent; 58 | content: ""; } 59 | 60 | nav li > a:only-child:after { 61 | content: ''; } 62 | 63 | nav li { 64 | list-style: none !important; 65 | color: #FFF; 66 | padding: 10px; 67 | text-decoration: none; } 68 | 69 | nav ul { 70 | padding: 0; 71 | margin-top: 20px; 72 | display: none; } 73 | @media (min-width: 48em) { 74 | nav ul { 75 | display: block; } } 76 | 77 | nav ul li { 78 | list-style: none; 79 | float: left; } 80 | 81 | nav ul li a { 82 | color: #fff; 83 | padding: 10px; 84 | text-decoration: none; } 85 | 86 | nav ul li ul { 87 | display: none; } 88 | 89 | nav ul li:hover ul { 90 | position: absolute; 91 | z-index: 1000; 92 | margin-top: 10px; 93 | margin-left: 8px; 94 | list-style: none; 95 | display: list-item !important; 96 | border-radius: 2px; 97 | background-color: white; 98 | box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.25); } 99 | nav ul li:hover ul:before { 100 | display: block; 101 | position: absolute; 102 | top: -5px; 103 | left: 12px; 104 | width: 10px; 105 | height: 10px; 106 | background-color: white; 107 | content: ''; 108 | -webkit-transform: rotate(45deg); 109 | transform: rotate(45deg); } 110 | 111 | nav ul li ul li a { 112 | text-transform: none; 113 | letter-spacing: 0; 114 | color: #3e4552; 115 | font-family: 'Microsoft YaHei','Helvetica Neue', 'Helvetica', 'Arial', 'sans-serif'; 116 | font-weight: 500; } 117 | 118 | nav ul li:hover ul li { 119 | padding-left: 0px; 120 | float: none; } -------------------------------------------------------------------------------- /source/stylesheets/_normalize.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v3.0.2 | MIT License | git.io/normalize */ 2 | 3 | /** 4 | * 1. Set default font family to sans-serif. 5 | * 2. Prevent iOS text size adjust after orientation change, without disabling 6 | * user zoom. 7 | */ 8 | 9 | html { 10 | font-family: sans-serif; /* 1 */ 11 | -ms-text-size-adjust: 100%; /* 2 */ 12 | -webkit-text-size-adjust: 100%; /* 2 */ 13 | } 14 | 15 | /** 16 | * Remove default margin. 17 | */ 18 | 19 | body { 20 | margin: 0; 21 | } 22 | 23 | /* HTML5 display definitions 24 | ========================================================================== */ 25 | 26 | /** 27 | * Correct `block` display not defined for any HTML5 element in IE 8/9. 28 | * Correct `block` display not defined for `details` or `summary` in IE 10/11 29 | * and Firefox. 30 | * Correct `block` display not defined for `main` in IE 11. 31 | */ 32 | 33 | article, 34 | aside, 35 | details, 36 | figcaption, 37 | figure, 38 | footer, 39 | header, 40 | hgroup, 41 | main, 42 | menu, 43 | nav, 44 | section, 45 | summary { 46 | display: block; 47 | } 48 | 49 | /** 50 | * 1. Correct `inline-block` display not defined in IE 8/9. 51 | * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. 52 | */ 53 | 54 | audio, 55 | canvas, 56 | progress, 57 | video { 58 | display: inline-block; /* 1 */ 59 | vertical-align: baseline; /* 2 */ 60 | } 61 | 62 | /** 63 | * Prevent modern browsers from displaying `audio` without controls. 64 | * Remove excess height in iOS 5 devices. 65 | */ 66 | 67 | audio:not([controls]) { 68 | display: none; 69 | height: 0; 70 | } 71 | 72 | /** 73 | * Address `[hidden]` styling not present in IE 8/9/10. 74 | * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. 75 | */ 76 | 77 | [hidden], 78 | template { 79 | display: none; 80 | } 81 | 82 | /* Links 83 | ========================================================================== */ 84 | 85 | /** 86 | * Remove the gray background color from active links in IE 10. 87 | */ 88 | 89 | a { 90 | background-color: transparent; 91 | } 92 | 93 | /** 94 | * Improve readability when focused and also mouse hovered in all browsers. 95 | */ 96 | 97 | a:active, 98 | a:hover { 99 | outline: 0; 100 | } 101 | 102 | /* Text-level semantics 103 | ========================================================================== */ 104 | 105 | /** 106 | * Address styling not present in IE 8/9/10/11, Safari, and Chrome. 107 | */ 108 | 109 | abbr[title] { 110 | border-bottom: 1px dotted; 111 | } 112 | 113 | /** 114 | * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. 115 | */ 116 | 117 | b, 118 | strong { 119 | font-weight: bold; 120 | } 121 | 122 | /** 123 | * Address styling not present in Safari and Chrome. 124 | */ 125 | 126 | dfn { 127 | font-style: italic; 128 | } 129 | 130 | /** 131 | * Address variable `h1` font-size and margin within `section` and `article` 132 | * contexts in Firefox 4+, Safari, and Chrome. 133 | */ 134 | 135 | h1 { 136 | font-size: 2em; 137 | margin: 0.67em 0; 138 | } 139 | 140 | /** 141 | * Address styling not present in IE 8/9. 142 | */ 143 | 144 | mark { 145 | background: #ff0; 146 | color: #000; 147 | } 148 | 149 | /** 150 | * Address inconsistent and variable font size in all browsers. 151 | */ 152 | 153 | small { 154 | font-size: 80%; 155 | } 156 | 157 | /** 158 | * Prevent `sub` and `sup` affecting `line-height` in all browsers. 159 | */ 160 | 161 | sub, 162 | sup { 163 | font-size: 75%; 164 | line-height: 0; 165 | position: relative; 166 | vertical-align: baseline; 167 | } 168 | 169 | sup { 170 | top: -0.5em; 171 | } 172 | 173 | sub { 174 | bottom: -0.25em; 175 | } 176 | 177 | /* Embedded content 178 | ========================================================================== */ 179 | 180 | /** 181 | * Remove border when inside `a` element in IE 8/9/10. 182 | */ 183 | 184 | img { 185 | border: 0; 186 | } 187 | 188 | /** 189 | * Correct overflow not hidden in IE 9/10/11. 190 | */ 191 | 192 | svg:not(:root) { 193 | overflow: hidden; 194 | } 195 | 196 | /* Grouping content 197 | ========================================================================== */ 198 | 199 | /** 200 | * Address margin not present in IE 8/9 and Safari. 201 | */ 202 | 203 | figure { 204 | margin: 1em 40px; 205 | } 206 | 207 | /** 208 | * Address differences between Firefox and other browsers. 209 | */ 210 | 211 | hr { 212 | -moz-box-sizing: content-box; 213 | box-sizing: content-box; 214 | height: 0; 215 | } 216 | 217 | /** 218 | * Contain overflow in all browsers. 219 | */ 220 | 221 | pre { 222 | overflow: auto; 223 | } 224 | 225 | /** 226 | * Address odd `em`-unit font size rendering in all browsers. 227 | */ 228 | 229 | code, 230 | kbd, 231 | pre, 232 | samp { 233 | font-family: monospace, monospace; 234 | font-size: 1em; 235 | } 236 | 237 | /* Forms 238 | ========================================================================== */ 239 | 240 | /** 241 | * Known limitation: by default, Chrome and Safari on OS X allow very limited 242 | * styling of `select`, unless a `border` property is set. 243 | */ 244 | 245 | /** 246 | * 1. Correct color not being inherited. 247 | * Known issue: affects color of disabled elements. 248 | * 2. Correct font properties not being inherited. 249 | * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. 250 | */ 251 | 252 | button, 253 | input, 254 | optgroup, 255 | select, 256 | textarea { 257 | color: inherit; /* 1 */ 258 | font: inherit; /* 2 */ 259 | margin: 0; /* 3 */ 260 | } 261 | 262 | /** 263 | * Address `overflow` set to `hidden` in IE 8/9/10/11. 264 | */ 265 | 266 | button { 267 | overflow: visible; 268 | } 269 | 270 | /** 271 | * Address inconsistent `text-transform` inheritance for `button` and `select`. 272 | * All other form control elements do not inherit `text-transform` values. 273 | * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. 274 | * Correct `select` style inheritance in Firefox. 275 | */ 276 | 277 | button, 278 | select { 279 | text-transform: none; 280 | } 281 | 282 | /** 283 | * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` 284 | * and `video` controls. 285 | * 2. Correct inability to style clickable `input` types in iOS. 286 | * 3. Improve usability and consistency of cursor style between image-type 287 | * `input` and others. 288 | */ 289 | 290 | button, 291 | html input[type="button"], /* 1 */ 292 | input[type="reset"], 293 | input[type="submit"] { 294 | -webkit-appearance: button; /* 2 */ 295 | cursor: pointer; /* 3 */ 296 | } 297 | 298 | /** 299 | * Re-set default cursor for disabled elements. 300 | */ 301 | 302 | button[disabled], 303 | html input[disabled] { 304 | cursor: default; 305 | } 306 | 307 | /** 308 | * Remove inner padding and border in Firefox 4+. 309 | */ 310 | 311 | button::-moz-focus-inner, 312 | input::-moz-focus-inner { 313 | border: 0; 314 | padding: 0; 315 | } 316 | 317 | /** 318 | * Address Firefox 4+ setting `line-height` on `input` using `!important` in 319 | * the UA stylesheet. 320 | */ 321 | 322 | input { 323 | line-height: normal; 324 | } 325 | 326 | /** 327 | * It's recommended that you don't attempt to style these elements. 328 | * Firefox's implementation doesn't respect box-sizing, padding, or width. 329 | * 330 | * 1. Address box sizing set to `content-box` in IE 8/9/10. 331 | * 2. Remove excess padding in IE 8/9/10. 332 | */ 333 | 334 | input[type="checkbox"], 335 | input[type="radio"] { 336 | box-sizing: border-box; /* 1 */ 337 | padding: 0; /* 2 */ 338 | } 339 | 340 | /** 341 | * Fix the cursor style for Chrome's increment/decrement buttons. For certain 342 | * `font-size` values of the `input`, it causes the cursor style of the 343 | * decrement button to change from `default` to `text`. 344 | */ 345 | 346 | input[type="number"]::-webkit-inner-spin-button, 347 | input[type="number"]::-webkit-outer-spin-button { 348 | height: auto; 349 | } 350 | 351 | /** 352 | * 1. Address `appearance` set to `searchfield` in Safari and Chrome. 353 | * 2. Address `box-sizing` set to `border-box` in Safari and Chrome 354 | * (include `-moz` to future-proof). 355 | */ 356 | 357 | input[type="search"] { 358 | -webkit-appearance: textfield; /* 1 */ 359 | -moz-box-sizing: content-box; 360 | -webkit-box-sizing: content-box; /* 2 */ 361 | box-sizing: content-box; 362 | } 363 | 364 | /** 365 | * Remove inner padding and search cancel button in Safari and Chrome on OS X. 366 | * Safari (but not Chrome) clips the cancel button when the search input has 367 | * padding (and `textfield` appearance). 368 | */ 369 | 370 | input[type="search"]::-webkit-search-cancel-button, 371 | input[type="search"]::-webkit-search-decoration { 372 | -webkit-appearance: none; 373 | } 374 | 375 | /** 376 | * Define consistent border, margin, and padding. 377 | */ 378 | 379 | fieldset { 380 | border: 1px solid #c0c0c0; 381 | margin: 0 2px; 382 | padding: 0.35em 0.625em 0.75em; 383 | } 384 | 385 | /** 386 | * 1. Correct `color` not being inherited in IE 8/9/10/11. 387 | * 2. Remove padding so people aren't caught out if they zero out fieldsets. 388 | */ 389 | 390 | legend { 391 | border: 0; /* 1 */ 392 | padding: 0; /* 2 */ 393 | } 394 | 395 | /** 396 | * Remove default vertical scrollbar in IE 8/9/10/11. 397 | */ 398 | 399 | textarea { 400 | overflow: auto; 401 | } 402 | 403 | /** 404 | * Don't inherit the `font-weight` (applied by a rule above). 405 | * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. 406 | */ 407 | 408 | optgroup { 409 | font-weight: bold; 410 | } 411 | 412 | /* Tables 413 | ========================================================================== */ 414 | 415 | /** 416 | * Remove most spacing between table cells. 417 | */ 418 | 419 | table { 420 | border-collapse: collapse; 421 | border-spacing: 0; 422 | } 423 | 424 | td, 425 | th { 426 | padding: 0; 427 | } 428 | -------------------------------------------------------------------------------- /source/stylesheets/_syntax.scss.erb: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2008-2013 Concur Technologies, Inc. 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); you may 5 | not use this file except in compliance with the License. You may obtain 6 | a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | License for the specific language governing permissions and limitations 14 | under the License. 15 | */ 16 | 17 | @import 'variables'; 18 | 19 | <%= Rouge::Themes::Base16::Monokai.render(:scope => '.highlight') %> 20 | 21 | .highlight .c, .highlight .cm, .highlight .c1, .highlight .cs { 22 | color: #909090; 23 | } 24 | 25 | .highlight, .highlight .w { 26 | background-color: $code-bg; 27 | } -------------------------------------------------------------------------------- /source/stylesheets/_variables.scss: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2008-2013 Concur Technologies, Inc. 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); you may 5 | not use this file except in compliance with the License. You may obtain 6 | a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | License for the specific language governing permissions and limitations 14 | under the License. 15 | */ 16 | 17 | 18 | //////////////////////////////////////////////////////////////////////////////// 19 | // CUSTOMIZE SLATE 20 | //////////////////////////////////////////////////////////////////////////////// 21 | // Use these settings to help adjust the appearance of Slate 22 | 23 | 24 | // BACKGROUND COLORS 25 | //////////////////// 26 | $nav-bg: #393939; 27 | $examples-bg: #393939; 28 | $code-bg: #292929; 29 | $code-annotation-bg: #1c1c1c; 30 | $nav-subitem-bg: #262626; 31 | $nav-active-bg: #2467af; 32 | $lang-select-border: #000; 33 | $lang-select-bg: #222; 34 | $lang-select-active-bg: $examples-bg; // feel free to change this to blue or something 35 | $lang-select-pressed-bg: #111; // color of language tab bg when mouse is pressed 36 | $main-bg: #eaf2f6; 37 | $aside-notice-bg: #8fbcd4; 38 | $aside-warning-bg: #c97a7e; 39 | $aside-success-bg: #6ac174; 40 | $search-notice-bg: #c97a7e; 41 | 42 | 43 | // TEXT COLORS 44 | //////////////////// 45 | $main-text: #333; // main content text color 46 | $nav-text: #fff; 47 | $nav-active-text: #fff; 48 | $lang-select-text: #fff; // color of unselected language tab text 49 | $lang-select-active-text: #fff; // color of selected language tab text 50 | $lang-select-pressed-text: #fff; // color of language tab text when mouse is pressed 51 | 52 | 53 | // SIZES 54 | //////////////////// 55 | $nav-width: 230px; // width of the navbar 56 | $examples-width: 30%; // portion of the screen taken up by code examples 57 | $logo-margin: 20px; // margin between nav items and logo, ignored if search is active 58 | $main-padding: 28px; // padding to left and right of content & examples 59 | $nav-padding: 15px; // padding to left and right of navbar 60 | $nav-v-padding: 10px; // padding used vertically around search boxes and results 61 | $nav-indent: 10px; // extra padding for ToC subitems 62 | $code-annotation-padding: 13px; // padding inside code annotations 63 | $h1-margin-bottom: 21px; // padding under the largest header tags 64 | $tablet-width: 930px; // min width before reverting to tablet size 65 | $phone-width: $tablet-width - $nav-width; // min width before reverting to mobile size 66 | 67 | 68 | // FONTS 69 | //////////////////// 70 | %default-font { 71 | font-family: 'Microsoft YaHei','Helvetica Neue', 'Helvetica', 'Arial', 'sans-serif'; 72 | font-size: 14px; 73 | } 74 | 75 | %header-font { 76 | @extend %default-font; 77 | font-weight: bold; 78 | } 79 | 80 | %code-font { 81 | font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, serif; 82 | font-size: 12px; 83 | line-height: 1.5; 84 | } 85 | 86 | 87 | // OTHER 88 | //////////////////// 89 | $nav-active-shadow: #000; 90 | $nav-footer-border-color: #666; 91 | $nav-embossed-border-top: #000; 92 | $nav-embossed-border-bottom: #939393; 93 | $main-embossed-text-shadow: 0px 1px 0px #fff; 94 | $search-box-border-color: #666; 95 | 96 | 97 | //////////////////////////////////////////////////////////////////////////////// 98 | // INTERNAL 99 | //////////////////////////////////////////////////////////////////////////////// 100 | // These settings are probably best left alone. 101 | 102 | %break-words { 103 | word-break: break-all; 104 | 105 | /* Non standard for webkit */ 106 | word-break: break-word; 107 | 108 | hyphens: auto; 109 | } 110 | -------------------------------------------------------------------------------- /source/stylesheets/nav.scss: -------------------------------------------------------------------------------- 1 | .navbar { 2 | width: 100%; } 3 | 4 | nav { 5 | display: -webkit-flex; 6 | display: -ms-flexbox; 7 | display: flex; 8 | position: absolute; 9 | top: 0; 10 | left: 0; } 11 | @media (min-width: 48em) { 12 | nav { 13 | -webkit-justify-content: space-between; 14 | -ms-flex-pack: justify; 15 | justify-content: space-between; } } 16 | nav .logo-container { 17 | width: 100%; } 18 | @media (min-width: 48em) { 19 | nav .logo-container { 20 | width: auto; } } 21 | nav .logo { 22 | height: 60px; 23 | width: 200px; 24 | margin: 0 auto; 25 | /* background-image: url("../images/logo.svg"); */ 26 | background-repeat: no-repeat; 27 | background-position: center center; 28 | background-size: 100%; 29 | color: #fff; 30 | font-size: 28px; 31 | line-height: 60px; 32 | text-shadow: none; 33 | position: relative; } 34 | @media (min-width: 48em) { 35 | nav .logo { 36 | display: inline-block; 37 | margin: 6px 0 0 15px; } } 38 | 39 | nav li { 40 | list-style: none !important; 41 | color: #FFF; 42 | padding: 10px; 43 | font-size: 12px; 44 | letter-spacing: 1px; 45 | font-family: 'proxima-nova'; 46 | font-weight: bold; 47 | text-transform: uppercase; 48 | text-decoration: none; } 49 | 50 | .caret { 51 | margin-top: 4px; 52 | margin-left: 4px; 53 | display: inline-block; 54 | width: 0; 55 | height: 0; 56 | vertical-align: top; 57 | border-top: 4px solid white; 58 | border-right: 4px solid transparent; 59 | border-left: 4px solid transparent; 60 | content: ""; } 61 | 62 | nav li > a:only-child:after { 63 | content: ''; } 64 | 65 | nav li { 66 | list-style: none !important; 67 | color: #FFF; 68 | padding: 10px; 69 | text-decoration: none; } 70 | 71 | nav ul { 72 | padding: 0; 73 | margin-top: 20px; 74 | display: none; } 75 | @media (min-width: 48em) { 76 | nav ul { 77 | display: block; } } 78 | 79 | nav ul li { 80 | list-style: none; 81 | float: left; } 82 | 83 | nav ul li a { 84 | color: #fff; 85 | padding: 10px; 86 | text-decoration: none; } 87 | 88 | nav ul li ul { 89 | display: none; } 90 | 91 | nav ul li:hover ul { 92 | position: absolute; 93 | z-index: 1000; 94 | margin-top: 10px; 95 | margin-left: 8px; 96 | list-style: none; 97 | display: list-item !important; 98 | border-radius: 2px; 99 | background-color: white; 100 | box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.25); } 101 | nav ul li:hover ul:before { 102 | display: block; 103 | position: absolute; 104 | top: -5px; 105 | left: 12px; 106 | width: 10px; 107 | height: 10px; 108 | background-color: white; 109 | content: ''; 110 | -webkit-transform: rotate(45deg); 111 | transform: rotate(45deg); } 112 | 113 | nav ul li ul li a { 114 | text-transform: none; 115 | letter-spacing: 0; 116 | color: #3e4552; 117 | font-family: 'Microsoft YaHei','Helvetica Neue', 'Helvetica', 'Arial', 'sans-serif'; 118 | font-weight: 500; } 119 | 120 | nav ul li:hover ul li { 121 | padding-left: 0px; 122 | float: none; } -------------------------------------------------------------------------------- /source/stylesheets/print.css.scss: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | @import 'normalize'; 3 | @import 'compass'; 4 | @import 'variables'; 5 | @import 'icon-font'; 6 | 7 | /* 8 | Copyright 2008-2013 Concur Technologies, Inc. 9 | 10 | Licensed under the Apache License, Version 2.0 (the "License"); you may 11 | not use this file except in compliance with the License. You may obtain 12 | a copy of the License at 13 | 14 | http://www.apache.org/licenses/LICENSE-2.0 15 | 16 | Unless required by applicable law or agreed to in writing, software 17 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 18 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 19 | License for the specific language governing permissions and limitations 20 | under the License. 21 | */ 22 | 23 | $print-color: #999; 24 | $print-color-light: #ccc; 25 | $print-font-size: 12px; 26 | 27 | body { 28 | @extend %default-font; 29 | } 30 | 31 | .tocify, .toc-footer, .lang-selector, .search, #nav-button { 32 | display: none; 33 | } 34 | 35 | .tocify-wrapper>img { 36 | margin: 0 auto; 37 | display: block; 38 | } 39 | 40 | .content { 41 | font-size: 12px; 42 | 43 | pre, code { 44 | @extend %code-font; 45 | @extend %break-words; 46 | border: 1px solid $print-color; 47 | border-radius: 5px; 48 | font-size: 0.8em; 49 | } 50 | 51 | pre { 52 | padding: 1.3em; 53 | } 54 | 55 | code { 56 | padding: 0.2em; 57 | } 58 | 59 | table { 60 | border: 1px solid $print-color; 61 | tr { 62 | border-bottom: 1px solid $print-color; 63 | } 64 | td,th { 65 | padding: 0.7em; 66 | } 67 | } 68 | 69 | p { 70 | line-height: 1.5; 71 | } 72 | 73 | a { 74 | text-decoration: none; 75 | color: #000; 76 | } 77 | 78 | h1 { 79 | @extend %header-font; 80 | font-size: 2.5em; 81 | padding-top: 0.5em; 82 | padding-bottom: 0.5em; 83 | margin-top: 1em; 84 | margin-bottom: $h1-margin-bottom; 85 | border: 2px solid $print-color-light; 86 | border-width: 2px 0; 87 | text-align: center; 88 | } 89 | 90 | h2 { 91 | @extend %header-font; 92 | font-size: 1.8em; 93 | margin-top: 2em; 94 | border-top: 2px solid $print-color-light; 95 | padding-top: 0.8em; 96 | } 97 | 98 | h1+h2, h1+div+h2 { 99 | border-top: none; 100 | padding-top: 0; 101 | margin-top: 0; 102 | } 103 | 104 | h3, h4 { 105 | @extend %header-font; 106 | font-size: 0.8em; 107 | margin-top: 1.5em; 108 | margin-bottom: 0.8em; 109 | text-transform: uppercase; 110 | } 111 | 112 | h5, h6 { 113 | text-transform: uppercase; 114 | } 115 | 116 | aside { 117 | padding: 1em; 118 | border: 1px solid $print-color-light; 119 | border-radius: 5px; 120 | margin-top: 1.5em; 121 | margin-bottom: 1.5em; 122 | line-height: 1.6; 123 | } 124 | 125 | aside:before { 126 | vertical-align: middle; 127 | padding-right: 0.5em; 128 | font-size: 14px; 129 | } 130 | 131 | aside.notice:before { 132 | @extend %icon-info-sign; 133 | } 134 | 135 | aside.warning:before { 136 | @extend %icon-exclamation-sign; 137 | } 138 | 139 | aside.success:before { 140 | @extend %icon-ok-sign; 141 | } 142 | } -------------------------------------------------------------------------------- /source/stylesheets/releasenotes.plugin.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | .milestoneContainer{ 6 | padding-bottom:35px; 7 | margin-bottom:10px; 8 | } 9 | .milestoneContainer.separator{background:url("../images/lineseparator.png") bottom center no-repeat;} 10 | .milestoneContainer .cursor:hover{cursor:pointer;} 11 | 12 | h3.release {margin:0 0 2px 0;font-size:18px;} 13 | p.dateRelease{margin:0 0 10px 0; font-size:14px;} 14 | 15 | .milestoneContainer .body p{padding:5px 0; margin:0;} 16 | .milestoneContainer pre { 17 | display: block; 18 | padding: 8.5px; 19 | margin: 0 0 9px; 20 | font-size: 12.025px; 21 | line-height: 18px; 22 | background-color: whiteSmoke; 23 | border: 1px solid #CCC; 24 | border: 1px solid rgba(0, 0, 0, 0.15); 25 | -webkit-border-radius: 4px; 26 | -moz-border-radius: 4px; 27 | border-radius: 4px; 28 | white-space: pre; 29 | white-space: pre-wrap; 30 | word-break: break-all; 31 | word-wrap: break-word; 32 | } 33 | .milestoneContainer code, .milestoneContainer pre { 34 | padding: 0 3px 2px; 35 | font-family: Menlo,Monaco,"Courier New",monospace; 36 | font-size: 12px; 37 | color: #333; 38 | -webkit-border-radius: 3px; 39 | -moz-border-radius: 3px; 40 | border-radius: 3px; 41 | } 42 | 43 | 44 | /* BUTTONS */ 45 | .milestoneContainer .btn { 46 | display: inline-block; 47 | text-decoration:none; 48 | *display: inline; 49 | /* IE7 inline-block hack */ 50 | 51 | *zoom: 1; 52 | padding: 4px 10px 4px; 53 | margin-bottom: 0; 54 | font-size: 13px; 55 | line-height: 18px; 56 | color: #333333; 57 | text-align: center; 58 | text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); 59 | vertical-align: middle; 60 | background-color: #f5f5f5; 61 | background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); 62 | background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); 63 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); 64 | background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); 65 | background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); 66 | background-image: linear-gradient(top, #ffffff, #e6e6e6); 67 | background-repeat: repeat-x; 68 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); 69 | border-color: #e6e6e6 #e6e6e6 #bfbfbf; 70 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 71 | filter: progid:dximagetransform.microsoft.gradient(enabled=false); 72 | border: 1px solid #cccccc; 73 | border-bottom-color: #b3b3b3; 74 | -webkit-border-radius: 4px; 75 | -moz-border-radius: 4px; 76 | border-radius: 4px; 77 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 78 | -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 79 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 80 | cursor: pointer; 81 | *margin-left: .3em; 82 | } 83 | .milestoneContainer .btn:hover, 84 | .milestoneContainer .btn:active{ 85 | background-color: #e6e6e6; 86 | } 87 | .milestoneContainer .btn:active, 88 | .milestoneContainer .btn.active { 89 | background-color: #cccccc \9; 90 | } 91 | .milestoneContainer .btn:first-child { 92 | *margin-left: 0; 93 | } 94 | .milestoneContainer .btn:hover { 95 | color: #333333; 96 | text-decoration: none; 97 | background-color: #e6e6e6; 98 | background-position: 0 -15px; 99 | -webkit-transition: background-position 0.1s linear; 100 | -moz-transition: background-position 0.1s linear; 101 | -ms-transition: background-position 0.1s linear; 102 | -o-transition: background-position 0.1s linear; 103 | transition: background-position 0.1s linear; 104 | } 105 | .milestoneContainer .btn:focus { 106 | outline: thin dotted #333; 107 | outline: 5px auto -webkit-focus-ring-color; 108 | outline-offset: -2px; 109 | } 110 | .milestoneContainer .btn:active { 111 | background-image: none; 112 | -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); 113 | -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); 114 | box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); 115 | background-color: #e6e6e6; 116 | background-color: #d9d9d9 \9; 117 | outline: 0; 118 | } 119 | 120 | 121 | /* ISSUE DESCRIPTION */ 122 | .milestoneContainer .date{ 123 | font-size:14px; 124 | } 125 | .milestoneContainer .cmeta .date {font-size:11px;} 126 | .milestoneContainer .issue{ 127 | padding-bottom: 3px; 128 | } 129 | .milestoneContainer .issues{ 130 | color:#555; 131 | } 132 | .milestoneContainer .issueTitle{ 133 | line-height:24px; 134 | font-size:13px; 135 | } 136 | .milestoneContainer .label{ 137 | display:inline-block; 138 | font-family: arial; 139 | font-weight:normal; 140 | line-height: 13px; 141 | color: white; 142 | vertical-align: middle; 143 | white-space: nowrap; 144 | font-size:12px; 145 | color:#fff; 146 | text-shadow: 1px 1px 1px #333; 147 | padding:3px 4px; 148 | border-radius:5px; 149 | margin-top: -6px; 150 | margin-right:5px; 151 | } 152 | 153 | 154 | .milestoneContainer .btnComments{ 155 | margin:-8px 0 15px 63px ; 156 | } 157 | 158 | .milestoneContainer .hidden{display:none;} 159 | .milestoneContainer .content-body{ 160 | padding-top:10px; 161 | margin-top:15px; 162 | border-top:1px solid #CACACA; 163 | } 164 | .milestoneContainer .normal-comment .content-body{ 165 | padding-top: 0px; 166 | margin-top: 0px; 167 | border-top: none; 168 | } 169 | 170 | /* COMMENTS */ 171 | 172 | .milestoneContainer .new-comments .bubble .comment { margin: 0 } 173 | .milestoneContainer .view-pull-request .new-comments .bubble .commit-comment { margin-top: 3px } 174 | .milestoneContainer .new-comments .bubble .commit-comment.thread-start { margin-top: 0 } 175 | .milestoneContainer .bubble .comment-form { margin: 0 } 176 | 177 | .milestoneContainer .avatar-bubble { 178 | margin: 20px 0; 179 | padding-left: 60px; 180 | background: url('../images/bubble-arrow.png') 51px 20px no-repeat; 181 | } 182 | .milestoneContainer .avatar-bubble>.avatar { 183 | position: relative; 184 | float: left; 185 | margin-left: -60px; 186 | } 187 | .bubble { 188 | padding: 3px; 189 | background: #eee; 190 | border-radius: 3px; 191 | } 192 | .milestoneContainer .avatar-bubble .form-actions { margin-top: 10px } 193 | .milestoneContainer .bubble .file-box { margin-bottom: 0 } 194 | 195 | .milestoneContainer .avatar img { border-radius: 3px } 196 | 197 | .milestoneContainer .starting-comment { 198 | margin: 0; 199 | background: #fff; 200 | padding:0px; 201 | border: 1px solid #CACACA; 202 | border-radius: 2px; 203 | } 204 | .milestoneContainer .normal-comment .starting-comment{ padding:10px;} 205 | .milestoneContainer .starting-comment .content-title { border-bottom: none } 206 | .milestoneContainer .starting-comment h2.content-title { 207 | margin: 0 0 -6px; 208 | font-size: 20px; 209 | font-weight: bold; 210 | } 211 | .milestoneContainer .starting-comment .body p.author { 212 | margin: 0px 0 0; 213 | color: #666; 214 | font-size: 12px; 215 | } 216 | .milestoneContainer .starting-comment p.author a { 217 | font-weight: bold; 218 | color: #666; 219 | } 220 | .milestoneContainer .new-comments .starting-comment .body { 221 | padding: 0 10px; 222 | font-size: 13px; 223 | background: #fff; 224 | } 225 | .milestoneContainer .comment .cmeta { 226 | height: 33px; 227 | padding: 0 10px; 228 | border-bottom: 1px solid #CCC; 229 | background-color: #F8F8F8; 230 | background-image: -moz-linear-gradient(#F8F8F8,#E1E1E1); 231 | background-image: -webkit-linear-gradient(#F8F8F8,#E1E1E1); 232 | -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8f8f8',endColorstr='#e1e1e1',GradientType=0)"; 233 | } 234 | .milestoneContainer .comment .cmeta p.author { 235 | margin: 0; 236 | float: left; 237 | max-width: 600px; 238 | font-size: 12px; 239 | height: 33px; 240 | line-height: 33px; 241 | text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); 242 | overflow: hidden; 243 | white-space: nowrap; 244 | text-overflow: ellipsis; 245 | } 246 | 247 | .milestoneContainer .comment .cmeta .icon { 248 | display: inline-block; 249 | margin-top: -2px; 250 | margin-left: 0px; 251 | width: 16px; 252 | height: 16px; 253 | vertical-align: middle; 254 | background: url('../images/icons.png') 0 0 no-repeat; 255 | } 256 | .milestoneContainer .comment .cmeta p.author a { 257 | color: #222; 258 | } 259 | 260 | .milestoneContainer .comment .cmeta p.info { 261 | float: right; 262 | margin: 0; 263 | font-size: 11px; 264 | height: 33px; 265 | line-height: 33px; 266 | } 267 | 268 | .milestoneContainer .comment > .body { 269 | position: relative; 270 | padding: 10px; 271 | color: #333; 272 | font-size: 12px; 273 | background: #FBFBFB; 274 | } -------------------------------------------------------------------------------- /source/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body{ 2 | background:url(../images/bg.jpg); 3 | text-shadow: 1px 1px 0px white; 4 | margin: 0; 5 | font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; 6 | font-size: 13px; 7 | line-height: 18px; 8 | color: #333; 9 | } 10 | 11 | h1, h2, h3, h4, h5, h6 { 12 | margin: 0; 13 | font-family: inherit; 14 | font-weight: bold; 15 | color: inherit; 16 | text-rendering: optimizelegibility; 17 | } 18 | h1 { 19 | font-size: 30px; 20 | line-height: 36px; 21 | padding: 50px 0 20px; 22 | } 23 | #websiteContainer{ 24 | background:url(../images/bg2.png) top left no-repeat; 25 | height: 529px; 26 | } 27 | .containerRelease{ 28 | width:780px; 29 | margin-left:230px; 30 | } 31 | -------------------------------------------------------------------------------- /stylesheets/nav.css: -------------------------------------------------------------------------------- 1 | .navbar{width:100%}nav{display:-webkit-flex;display:-ms-flexbox;display:flex;position:absolute;top:0;left:0}@media (min-width: 48em){nav{-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}}nav .logo-container{width:100%}@media (min-width: 48em){nav .logo-container{width:auto}}nav .logo{height:60px;width:200px;margin:0 auto;background-repeat:no-repeat;background-position:center center;background-size:100%;color:#fff;font-size:28px;line-height:60px;text-shadow:none;position:relative}@media (min-width: 48em){nav .logo{display:inline-block;margin:6px 0 0 15px}}nav li{list-style:none !important;color:#FFF;padding:10px;font-size:12px;letter-spacing:1px;font-family:'proxima-nova';font-weight:bold;text-transform:uppercase;text-decoration:none}.caret{margin-top:4px;margin-left:4px;display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid white;border-right:4px solid transparent;border-left:4px solid transparent;content:""}nav li>a:only-child:after{content:''}nav li{list-style:none !important;color:#FFF;padding:10px;text-decoration:none}nav ul{padding:0;margin-top:20px;display:none}@media (min-width: 48em){nav ul{display:block}}nav ul li{list-style:none;float:left}nav ul li a{color:#fff;padding:10px;text-decoration:none}nav ul li ul{display:none}nav ul li:hover ul{position:absolute;z-index:1000;margin-top:10px;margin-left:8px;list-style:none;display:list-item !important;border-radius:2px;background-color:white;box-shadow:0px 2px 3px rgba(0,0,0,0.25)}nav ul li:hover ul:before{display:block;position:absolute;top:-5px;left:12px;width:10px;height:10px;background-color:white;content:'';-webkit-transform:rotate(45deg);transform:rotate(45deg)}nav ul li ul li a{text-transform:none;letter-spacing:0;color:#3e4552;font-family:'Microsoft YaHei','Helvetica Neue', 'Helvetica', 'Arial', 'sans-serif';font-weight:500}nav ul li:hover ul li{padding-left:0px;float:none} -------------------------------------------------------------------------------- /stylesheets/print.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.content h1,.content h2,.content h3,.content h4,body{font-family:'Microsoft YaHei','Helvetica Neue', 'Helvetica', 'Arial', 'sans-serif';font-size:14px}.content h1,.content h2,.content h3,.content h4{font-weight:bold}.content pre,.content code{font-family:Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, serif;font-size:12px;line-height:1.5}.content pre,.content code{word-break:break-all;word-break:break-word;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto}@font-face{font-family:'slate';src:url("../fonts/slate.eot?-syv14m");src:url("../fonts/slate.eot?#iefix-syv14m") format("embedded-opentype"),url("../fonts/slate.woff2?-syv14m") format("woff2"),url("../fonts/slate.woff?-syv14m") format("woff"),url("../fonts/slate.ttf?-syv14m") format("truetype"),url("../fonts/slate.svg?-syv14m#slate") format("svg");font-weight:normal;font-style:normal}.content aside.warning:before,.content aside.notice:before,.content aside.success:before{font-family:'slate';speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1}.content aside.warning:before{content:"\e600"}.content aside.notice:before{content:"\e602"}.content aside.success:before{content:"\e606"}.tocify,.toc-footer,.lang-selector,.search,#nav-button{display:none}.tocify-wrapper>img{margin:0 auto;display:block}.content{font-size:12px}.content pre,.content code{border:1px solid #999;border-radius:5px;font-size:0.8em}.content pre{padding:1.3em}.content code{padding:0.2em}.content table{border:1px solid #999}.content table tr{border-bottom:1px solid #999}.content table td,.content table th{padding:0.7em}.content p{line-height:1.5}.content a{text-decoration:none;color:#000}.content h1{font-size:2.5em;padding-top:0.5em;padding-bottom:0.5em;margin-top:1em;margin-bottom:21px;border:2px solid #ccc;border-width:2px 0;text-align:center}.content h2{font-size:1.8em;margin-top:2em;border-top:2px solid #ccc;padding-top:0.8em}.content h1+h2,.content h1+div+h2{border-top:none;padding-top:0;margin-top:0}.content h3,.content h4{font-size:0.8em;margin-top:1.5em;margin-bottom:0.8em;text-transform:uppercase}.content h5,.content h6{text-transform:uppercase}.content aside{padding:1em;border:1px solid #ccc;border-radius:5px;margin-top:1.5em;margin-bottom:1.5em;line-height:1.6}.content aside:before{vertical-align:middle;padding-right:0.5em;font-size:14px} -------------------------------------------------------------------------------- /stylesheets/releasenotes.plugin.css: -------------------------------------------------------------------------------- 1 | .milestoneContainer{padding-bottom:35px;margin-bottom:10px}.milestoneContainer.separator{background:url("../images/lineseparator.png") bottom center no-repeat}.milestoneContainer .cursor:hover{cursor:pointer}h3.release{margin:0 0 2px 0;font-size:18px}p.dateRelease{margin:0 0 10px 0;font-size:14px}.milestoneContainer .body p{padding:5px 0;margin:0}.milestoneContainer pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12.025px;line-height:18px;background-color:whiteSmoke;border:1px solid #CCC;border:1px solid rgba(0,0,0,0.15);border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;word-wrap:break-word}.milestoneContainer code,.milestoneContainer pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333;border-radius:3px}.milestoneContainer .btn{display:inline-block;text-decoration:none;*display:inline;*zoom:1;padding:4px 10px 4px;margin-bottom:0;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;background-color:#f5f5f5;background-image:linear-gradient(top, #fff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);-webkit-filter:progid:dximagetransform.microsoft.gradient(enabled=false);filter:progid:dximagetransform.microsoft.gradient(enabled=false);border:1px solid #cccccc;border-bottom-color:#b3b3b3;border-radius:4px;box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);cursor:pointer;*margin-left:.3em}.milestoneContainer .btn:hover,.milestoneContainer .btn:active{background-color:#e6e6e6}.milestoneContainer .btn:active,.milestoneContainer .btn.active{background-color:#cccccc \9}.milestoneContainer .btn:first-child{*margin-left:0}.milestoneContainer .btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;transition:background-position 0.1s linear}.milestoneContainer .btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.milestoneContainer .btn:active{background-image:none;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;outline:0}.milestoneContainer .date{font-size:14px}.milestoneContainer .cmeta .date{font-size:11px}.milestoneContainer .issue{padding-bottom:3px}.milestoneContainer .issues{color:#555}.milestoneContainer .issueTitle{line-height:24px;font-size:13px}.milestoneContainer .label{display:inline-block;font-family:arial;font-weight:normal;line-height:13px;color:white;vertical-align:middle;white-space:nowrap;font-size:12px;color:#fff;text-shadow:1px 1px 1px #333;padding:3px 4px;border-radius:5px;margin-top:-6px;margin-right:5px}.milestoneContainer .btnComments{margin:-8px 0 15px 63px}.milestoneContainer .hidden{display:none}.milestoneContainer .content-body{padding-top:10px;margin-top:15px;border-top:1px solid #CACACA}.milestoneContainer .normal-comment .content-body{padding-top:0px;margin-top:0px;border-top:none}.milestoneContainer .new-comments .bubble .comment{margin:0}.milestoneContainer .view-pull-request .new-comments .bubble .commit-comment{margin-top:3px}.milestoneContainer .new-comments .bubble .commit-comment.thread-start{margin-top:0}.milestoneContainer .bubble .comment-form{margin:0}.milestoneContainer .avatar-bubble{margin:20px 0;padding-left:60px;background:url('../images/bubble-arrow.png') 51px 20px no-repeat}.milestoneContainer .avatar-bubble>.avatar{position:relative;float:left;margin-left:-60px}.bubble{padding:3px;background:#eee;border-radius:3px}.milestoneContainer .avatar-bubble .form-actions{margin-top:10px}.milestoneContainer .bubble .file-box{margin-bottom:0}.milestoneContainer .avatar img{border-radius:3px}.milestoneContainer .starting-comment{margin:0;background:#fff;padding:0px;border:1px solid #CACACA;border-radius:2px}.milestoneContainer .normal-comment .starting-comment{padding:10px}.milestoneContainer .starting-comment .content-title{border-bottom:none}.milestoneContainer .starting-comment h2.content-title{margin:0 0 -6px;font-size:20px;font-weight:bold}.milestoneContainer .starting-comment .body p.author{margin:0px 0 0;color:#666;font-size:12px}.milestoneContainer .starting-comment p.author a{font-weight:bold;color:#666}.milestoneContainer .new-comments .starting-comment .body{padding:0 10px;font-size:13px;background:#fff}.milestoneContainer .comment .cmeta{height:33px;padding:0 10px;border-bottom:1px solid #CCC;background-color:#F8F8F8;background-image:-webkit-linear-gradient(#F8F8F8, #E1E1E1);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8f8f8',endColorstr='#e1e1e1',GradientType=0)"}.milestoneContainer .comment .cmeta p.author{margin:0;float:left;max-width:600px;font-size:12px;height:33px;line-height:33px;text-shadow:1px 1px 0 rgba(255,255,255,0.7);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.milestoneContainer .comment .cmeta .icon{display:inline-block;margin-top:-2px;margin-left:0px;width:16px;height:16px;vertical-align:middle;background:url('../images/icons.png') 0 0 no-repeat}.milestoneContainer .comment .cmeta p.author a{color:#222}.milestoneContainer .comment .cmeta p.info{float:right;margin:0;font-size:11px;height:33px;line-height:33px}.milestoneContainer .comment>.body{position:relative;padding:10px;color:#333;font-size:12px;background:#FBFBFB} -------------------------------------------------------------------------------- /stylesheets/screen.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6,html,body{font-family:'Microsoft YaHei','Helvetica Neue', 'Helvetica', 'Arial', 'sans-serif';font-size:14px}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{font-weight:bold}.content code,.content pre{font-family:Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, serif;font-size:12px;line-height:1.5}.content code{word-break:break-all;word-break:break-word;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.highlight table td{padding:5px}.highlight table pre{margin:0}.highlight,.highlight .w{color:#f8f8f2;background-color:#272822}.highlight .err{color:#151515;background-color:#ac4142}.highlight .c,.highlight .cd,.highlight .cm,.highlight .c1,.highlight .cs{color:#505050}.highlight .cp{color:#f4bf75}.highlight .nt{color:#f4bf75}.highlight .o,.highlight .ow{color:#d0d0d0}.highlight .p,.highlight .pi{color:#d0d0d0}.highlight .gi{color:#90a959}.highlight .gd{color:#ac4142}.highlight .gh{color:#6a9fb5;background-color:#151515;font-weight:bold}.highlight .k,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .kv{color:#aa759f}.highlight .kc{color:#d28445}.highlight .kt{color:#d28445}.highlight .kd{color:#d28445}.highlight .s,.highlight .sb,.highlight .sc,.highlight .sd,.highlight .s2,.highlight .sh,.highlight .sx,.highlight .s1{color:#90a959}.highlight .sr{color:#75b5aa}.highlight .si{color:#8f5536}.highlight .se{color:#8f5536}.highlight .nn{color:#f4bf75}.highlight .nc{color:#f4bf75}.highlight .no{color:#f4bf75}.highlight .na{color:#6a9fb5}.highlight .m,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .il,.highlight .mo,.highlight .mb,.highlight .mx{color:#90a959}.highlight .ss{color:#90a959}.highlight .c,.highlight .cm,.highlight .c1,.highlight .cs{color:#909090}.highlight,.highlight .w{background-color:#292929}@font-face{font-family:'slate';src:url("../fonts/slate.eot?-syv14m");src:url("../fonts/slate.eot?#iefix-syv14m") format("embedded-opentype"),url("../fonts/slate.woff2?-syv14m") format("woff2"),url("../fonts/slate.woff?-syv14m") format("woff"),url("../fonts/slate.ttf?-syv14m") format("truetype"),url("../fonts/slate.svg?-syv14m#slate") format("svg");font-weight:normal;font-style:normal}.content aside.warning:before,.content aside.notice:before,.content aside.success:before,.tocify-wrapper>.search:before{font-family:'slate';speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1}.content aside.warning:before{content:"\e600"}.content aside.notice:before{content:"\e602"}.content aside.success:before{content:"\e606"}.tocify-wrapper>.search:before{content:"\e607"}.navbar{width:100%}nav{display:-webkit-flex;display:-ms-flexbox;display:flex;position:absolute;top:0;left:0}@media (min-width: 48em){nav{-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}}nav .logo-container{width:100%}@media (min-width: 48em){nav .logo-container{width:auto}}nav .logo{height:60px;width:200px;margin:0 auto;background-repeat:no-repeat;background-position:center center;background-size:100%;color:#fff;font-size:28px;line-height:60px;text-shadow:none;position:relative}@media (min-width: 48em){nav .logo{display:inline-block;margin:6px 0 0 15px}}nav li{list-style:none !important;color:#FFF;padding:10px;font-size:12px;letter-spacing:1px;font-family:'proxima-nova';font-weight:bold;text-transform:uppercase;text-decoration:none}.caret{margin-top:4px;margin-left:4px;display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid white;border-right:4px solid transparent;border-left:4px solid transparent;content:""}nav li>a:only-child:after{content:''}nav li{list-style:none !important;color:#FFF;padding:10px;text-decoration:none}nav ul{padding:0;margin-top:20px;display:none}@media (min-width: 48em){nav ul{display:block}}nav ul li{list-style:none;float:left}nav ul li a{color:#fff;padding:10px;text-decoration:none}nav ul li ul{display:none}nav ul li:hover ul{position:absolute;z-index:1000;margin-top:10px;margin-left:8px;list-style:none;display:list-item !important;border-radius:2px;background-color:white;box-shadow:0px 2px 3px rgba(0,0,0,0.25)}nav ul li:hover ul:before{display:block;position:absolute;top:-5px;left:12px;width:10px;height:10px;background-color:white;content:'';-webkit-transform:rotate(45deg);transform:rotate(45deg)}nav ul li ul li a{text-transform:none;letter-spacing:0;color:#3e4552;font-family:'Microsoft YaHei','Helvetica Neue', 'Helvetica', 'Arial', 'sans-serif';font-weight:500}nav ul li:hover ul li{padding-left:0px;float:none}html,body{color:#333;padding:0;margin:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-color:#eaf2f6;height:100%;-webkit-text-size-adjust:none}#toc>ul>li>a>span{float:right;background-color:#2484FF;border-radius:40px;width:20px}.tocify-wrapper{padding-top:5px;transition:left 0.3s ease-in-out;overflow-y:auto;overflow-x:hidden;position:fixed;z-index:30;top:0;left:0;bottom:0;width:230px;background-color:#393939;font-size:14px;font-weight:bold}.tocify-wrapper .lang-selector{display:none}.tocify-wrapper .lang-selector a{padding-top:0.5em;padding-bottom:0.5em}.tocify-wrapper>img{display:block}.tocify-wrapper>.search{position:relative}.tocify-wrapper>.search input{background:#393939;border-width:0 0 1px 0;border-color:#666;padding:6px 0 6px 20px;box-sizing:border-box;margin:10px 15px;width:200px;outline:none;color:#fff;border-radius:0}.tocify-wrapper>.search:before{position:absolute;top:17px;left:15px;color:#fff}.tocify-wrapper img+.tocify{margin-top:20px}.tocify-wrapper .search-results{margin-top:0;box-sizing:border-box;height:0;overflow-y:auto;overflow-x:hidden;transition-property:height, margin;transition-duration:180ms;transition-timing-function:ease-in-out;background:linear-gradient(to bottom, rgba(0,0,0,0.2), transparent 8px),linear-gradient(to top, rgba(0,0,0,0.2), transparent 8px),linear-gradient(to bottom, #000, transparent 1.5px),linear-gradient(to top, #939393, rgba(147,147,147,0) 1.5px),#262626}.tocify-wrapper .search-results.visible{height:30%;margin-bottom:1em}.tocify-wrapper .search-results li{margin:1em 15px;line-height:1}.tocify-wrapper .search-results a{color:#fff;text-decoration:none}.tocify-wrapper .search-results a:hover{text-decoration:underline}.tocify-wrapper .tocify-item>a,.tocify-wrapper .toc-footer li{padding:0 15px 0 15px;display:block;overflow-x:hidden;white-space:nowrap;text-overflow:ellipsis}.tocify-wrapper ul,.tocify-wrapper li{list-style:none;margin:0;padding:0;line-height:28px}.tocify-wrapper li{color:#fff;transition-property:background;transition-timing-function:linear;transition-duration:230ms}.tocify-wrapper .tocify-focus{box-shadow:0px 1px 0px #000;background-color:#2467af;color:#fff}.tocify-wrapper .tocify-subheader{display:none;background-color:#262626;font-weight:500;background:linear-gradient(to bottom, rgba(0,0,0,0.2), transparent 8px),linear-gradient(to top, rgba(0,0,0,0.2), transparent 8px),linear-gradient(to bottom, #000, transparent 1.5px),linear-gradient(to top, #939393, rgba(147,147,147,0) 1.5px),#262626}.tocify-wrapper .tocify-subheader .tocify-item>a{padding-left:25px;font-size:13px}.tocify-wrapper .tocify-subheader>li:last-child{box-shadow:none}.tocify-wrapper .tocify-subheader .tocify-subheader .tocify-item>a{padding-left:35px;font-size:13px}.tocify-wrapper .toc-footer{padding:1em 0;margin-top:1em;border-top:1px dashed #666}.tocify-wrapper .toc-footer li,.tocify-wrapper .toc-footer a{color:#fff;text-decoration:none}.tocify-wrapper .toc-footer a:hover{text-decoration:underline}.tocify-wrapper .toc-footer li{font-size:0.8em;line-height:1.7;text-decoration:none}#nav-button{padding:0 1.5em 5em 0;display:none;position:fixed;top:0;left:0;z-index:100;color:#000;text-decoration:none;font-weight:bold;opacity:0.7;line-height:16px;transition:left 0.3s ease-in-out}#nav-button span{display:block;padding:6px 6px 6px;background-color:rgba(234,242,246,0.7);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:rotate(-90deg) translate(-100%, 0);transform:rotate(-90deg) translate(-100%, 0);border-radius:0 0 0 5px}#nav-button img{height:16px;vertical-align:bottom}#nav-button:hover{opacity:1}#nav-button.open{left:230px}.page-wrapper{margin-left:230px;position:relative;z-index:10;background-color:#eaf2f6;min-height:100%;padding-bottom:1px}.page-wrapper .dark-box{width:30%;background-color:#393939;position:absolute;right:0;top:0;bottom:0}.page-wrapper .lang-selector{position:fixed;z-index:50;border-bottom:5px solid #393939}.lang-selector{background-color:#222;width:100%;font-weight:bold}.lang-selector a{display:block;float:left;color:#fff;text-decoration:none;padding:0 10px;line-height:30px;outline:0}.lang-selector a:active,.lang-selector a:focus{background-color:#111;color:#fff}.lang-selector a.active{background-color:#393939;color:#fff}.lang-selector:after{content:'';clear:both;display:block}.content{position:relative;z-index:30;margin-top:0px}.content:after{content:'';display:block;clear:both}.content>h1,.content>h2,.content>h3,.content>h4,.content>h5,.content>h6,.content>p,.content>table,.content>ul,.content>ol,.content>aside,.content>dl{margin-right:30%;padding:0 28px;box-sizing:border-box;display:block;text-shadow:0px 1px 0px #fff}.content>ul,.content>ol{padding-left:43px}.content>h1,.content>h2,.content>div{clear:both}.content h1{font-size:24px;padding-top:0.83em;padding-bottom:0.83em;border-bottom:1px solid #ccc;margin-bottom:2em;margin-top:2em;border-top:1px solid #ddd;background-image:linear-gradient(to bottom, #fff, #f9f9f9)}.content h1:first-child,.content div:first-child+h1{border-top-width:0;margin-top:0}.content h2{font-size:20px;margin-top:0.8em;margin-bottom:0.8em;border-top:1px solid #ccc;border-bottom:1px solid #ccc;padding-top:0.75em;padding-bottom:0.75em;background-image:linear-gradient(to bottom, #fff, #f9f9f9)}.content h1+h2,.content h1+div+h2{margin-top:-21px;border-top:none}.content h3,.content h4,.content h5,.content h6{font-size:16px;margin-top:1em;margin-bottom:0.8em}.content h4,.content h5,.content h6{font-size:14px}.content h5,.content h6{font-size:13px}.content hr{margin:2em 0;border-top:2px solid #393939;border-bottom:2px solid #eaf2f6}.content table{margin-bottom:1em;overflow:auto}.content table th,.content table td{text-align:left;vertical-align:top;line-height:1.6}.content table th{padding:5px 10px;border-bottom:1px solid #ccc;vertical-align:bottom}.content table td{padding:10px}.content table tr:last-child{border-bottom:1px solid #ccc}.content table tr:nth-child(odd)>td{background-color:#f9fbfc}.content table tr:nth-child(even)>td{background-color:#f3f7fa}.content dt{font-weight:bold}.content dd{margin-left:15px}.content p,.content li,.content dt,.content dd{line-height:1.6;margin-top:0}.content img{max-width:100%}.content code{background-color:rgba(0,0,0,0.05);padding:3px;border-radius:3px}.content pre>code{background-color:transparent;padding:0}.content aside{padding-top:1em;padding-bottom:1em;text-shadow:0 1px 0 #c6dde9;margin-top:1.5em;margin-bottom:1.5em;background:#8fbcd4;line-height:1.6}.content aside.warning{background-color:#c97a7e;text-shadow:0 1px 0 #dfb0b3}.content aside.success{background-color:#6ac174;text-shadow:0 1px 0 #a0d7a6}.content aside:before{vertical-align:middle;padding-right:0.5em;font-size:14px}.content .search-highlight{padding:2px;margin:-2px;border-radius:4px;border:1px solid #F7E633;text-shadow:1px 1px 0 #666;background:linear-gradient(to top left, #f7e633 0%, #f1d32f 100%)}.content pre,.content blockquote{background-color:#292929;color:#fff;padding:2em 28px;margin:0;width:30%;float:right;clear:right;box-sizing:border-box;text-shadow:0px 1px 2px rgba(0,0,0,0.4)}.content pre>p,.content blockquote>p{margin:0}.content pre a,.content blockquote a{color:#fff;text-decoration:none;border-bottom:dashed 1px #ccc}.content blockquote>p{background-color:#1c1c1c;border-radius:5px;padding:13px;color:#ccc;border-top:1px solid #000;border-bottom:1px solid #404040}@media (max-width: 930px){.tocify-wrapper{left:-230px}.tocify-wrapper.open{left:0}.page-wrapper{margin-left:0}#nav-button{display:block}.tocify-wrapper .tocify-item>a{padding-top:0.3em;padding-bottom:0.3em}}@media (max-width: 700px){.dark-box{display:none}.navbar-container{display:none}.content>h1,.content>h2,.content>h3,.content>h4,.content>h5,.content>h6,.content>p,.content>table,.content>ul,.content>ol,.content>aside,.content>dl{margin-right:0}.tocify-wrapper .lang-selector{display:block}.page-wrapper .lang-selector{display:none}.content pre,.content blockquote{width:auto;float:none}.content>pre+h1,.content>blockquote+h1,.content>pre+h2,.content>blockquote+h2,.content>pre+h3,.content>blockquote+h3,.content>pre+h4,.content>blockquote+h4,.content>pre+h5,.content>blockquote+h5,.content>pre+h6,.content>blockquote+h6,.content>pre+p,.content>blockquote+p,.content>pre+table,.content>blockquote+table,.content>pre+ul,.content>blockquote+ul,.content>pre+ol,.content>blockquote+ol,.content>pre+aside,.content>blockquote+aside,.content>pre+dl,.content>blockquote+dl{margin-top:28px}} -------------------------------------------------------------------------------- /stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body{background:url(../images/bg.jpg);text-shadow:1px 1px 0px white;margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333}h1,h2,h3,h4,h5,h6{margin:0;font-family:inherit;font-weight:bold;color:inherit;text-rendering:optimizelegibility}h1{font-size:30px;line-height:36px;padding:50px 0 20px}#websiteContainer{background:url(../images/bg2.png) top left no-repeat;height:529px}.containerRelease{width:780px;margin-left:230px} --------------------------------------------------------------------------------