@@ -0,0 +1,86 @@ | |||||
.nb-notebook { | |||||
line-height: 1.5; | |||||
margin-left: 7em; | |||||
} | |||||
.nb-stdout, .nb-stderr { | |||||
white-space: pre-wrap; | |||||
margin: 1em 0; | |||||
padding: 0.1em 0.5em; | |||||
} | |||||
.nb-stderr { | |||||
background-color: #FAA; | |||||
} | |||||
.nb-cell + .nb-cell { | |||||
margin-top: 0.5em; | |||||
} | |||||
.nb-output table { | |||||
border: 1px solid #000; | |||||
border-collapse: collapse; | |||||
} | |||||
.nb-output th { | |||||
font-weight: bold; | |||||
} | |||||
.nb-output th, .nb-output td { | |||||
border: 1px solid #000; | |||||
padding: 0.25em; | |||||
text-align: left; | |||||
vertical-align: middle; | |||||
border-collapse: collapse; | |||||
} | |||||
.nb-notebook blockquote { | |||||
border-left: 5px solid #CCC; | |||||
margin-left: 0; | |||||
padding-left: 1em; | |||||
} | |||||
.nb-cell { | |||||
position: relative; | |||||
} | |||||
.nb-raw-cell { | |||||
white-space: pre-wrap; | |||||
background-color: #f5f2f0; | |||||
font-family: Consolas, Monaco, 'Andale Mono', monospace; | |||||
padding: 1em; | |||||
margin: .5em 0; | |||||
} | |||||
.nb-output { | |||||
min-height: 1em; | |||||
width: 100%; | |||||
overflow-x: scroll; | |||||
border-right: 1px dotted #CCC; | |||||
} | |||||
.nb-output img { | |||||
max-width: 100%; | |||||
} | |||||
.nb-output:before, .nb-input:before { | |||||
position: absolute; | |||||
font-family: monospace; | |||||
color: #999; | |||||
left: -7em; | |||||
width: 7em; | |||||
text-align: right; | |||||
} | |||||
.nb-input:before { | |||||
content: "In [" attr(data-prompt-number) "]:"; | |||||
} | |||||
.nb-output:before { | |||||
content: "Out [" attr(data-prompt-number) "]:"; | |||||
} | |||||
// Fix pandas dataframe formatting | |||||
div[style="max-height:1000px;max-width:1500px;overflow:auto;"] { | |||||
max-height: none !important; | |||||
} | |||||
@@ -0,0 +1,142 @@ | |||||
/* PrismJS 1.21.0 | |||||
https://prismjs.com/download.html#themes=prism&languages=markup+clike+javascript+julia+python+r */ | |||||
/** | |||||
* prism.js default theme for JavaScript, CSS and HTML | |||||
* Based on dabblet (http://dabblet.com) | |||||
* @author Lea Verou | |||||
*/ | |||||
code[class*="language-"], | |||||
pre[class*="language-"] { | |||||
color: black; | |||||
background: none; | |||||
text-shadow: 0 1px white; | |||||
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; | |||||
font-size: 1em; | |||||
text-align: left; | |||||
white-space: pre; | |||||
word-spacing: normal; | |||||
word-break: normal; | |||||
word-wrap: normal; | |||||
line-height: 1.5; | |||||
-moz-tab-size: 4; | |||||
-o-tab-size: 4; | |||||
tab-size: 4; | |||||
-webkit-hyphens: none; | |||||
-moz-hyphens: none; | |||||
-ms-hyphens: none; | |||||
hyphens: none; | |||||
} | |||||
pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, | |||||
code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { | |||||
text-shadow: none; | |||||
background: #b3d4fc; | |||||
} | |||||
pre[class*="language-"]::selection, pre[class*="language-"] ::selection, | |||||
code[class*="language-"]::selection, code[class*="language-"] ::selection { | |||||
text-shadow: none; | |||||
background: #b3d4fc; | |||||
} | |||||
@media print { | |||||
code[class*="language-"], | |||||
pre[class*="language-"] { | |||||
text-shadow: none; | |||||
} | |||||
} | |||||
/* Code blocks */ | |||||
pre[class*="language-"] { | |||||
padding: 1em; | |||||
margin: .5em 0; | |||||
overflow: auto; | |||||
} | |||||
:not(pre) > code[class*="language-"], | |||||
pre[class*="language-"] { | |||||
background: #f5f2f0; | |||||
} | |||||
/* Inline code */ | |||||
:not(pre) > code[class*="language-"] { | |||||
padding: .1em; | |||||
border-radius: .3em; | |||||
white-space: normal; | |||||
} | |||||
.token.comment, | |||||
.token.prolog, | |||||
.token.doctype, | |||||
.token.cdata { | |||||
color: slategray; | |||||
} | |||||
.token.punctuation { | |||||
color: #999; | |||||
} | |||||
.token.namespace { | |||||
opacity: .7; | |||||
} | |||||
.token.property, | |||||
.token.tag, | |||||
.token.boolean, | |||||
.token.number, | |||||
.token.constant, | |||||
.token.symbol, | |||||
.token.deleted { | |||||
color: #905; | |||||
} | |||||
.token.selector, | |||||
.token.attr-name, | |||||
.token.string, | |||||
.token.char, | |||||
.token.builtin, | |||||
.token.inserted { | |||||
color: #690; | |||||
} | |||||
.token.operator, | |||||
.token.entity, | |||||
.token.url, | |||||
.language-css .token.string, | |||||
.style .token.string { | |||||
color: #9a6e3a; | |||||
/* This background color was intended by the author of this theme. */ | |||||
background: hsla(0, 0%, 100%, .5); | |||||
} | |||||
.token.atrule, | |||||
.token.attr-value, | |||||
.token.keyword { | |||||
color: #07a; | |||||
} | |||||
.token.function, | |||||
.token.class-name { | |||||
color: #DD4A68; | |||||
} | |||||
.token.regex, | |||||
.token.important, | |||||
.token.variable { | |||||
color: #e90; | |||||
} | |||||
.token.important, | |||||
.token.bold { | |||||
font-weight: bold; | |||||
} | |||||
.token.italic { | |||||
font-style: italic; | |||||
} | |||||
.token.entity { | |||||
cursor: help; | |||||
} |
@@ -0,0 +1,6 @@ | |||||
// ansi_up.js | |||||
// version : 1.1.0 | |||||
// author : Dru Nelson | |||||
// license : MIT | |||||
// http://github.com/drudru/ansi_up | |||||
(function(a,b){function g(){this.fg=this.bg=null,this.bright=0}var c,d="1.1.0",e=typeof module!="undefined",f=[[{color:"0, 0, 0","class":"ansi-black"},{color:"187, 0, 0","class":"ansi-red"},{color:"0, 187, 0","class":"ansi-green"},{color:"187, 187, 0","class":"ansi-yellow"},{color:"0, 0, 187","class":"ansi-blue"},{color:"187, 0, 187","class":"ansi-magenta"},{color:"0, 187, 187","class":"ansi-cyan"},{color:"255,255,255","class":"ansi-white"}],[{color:"85, 85, 85","class":"ansi-bright-black"},{color:"255, 85, 85","class":"ansi-bright-red"},{color:"0, 255, 0","class":"ansi-bright-green"},{color:"255, 255, 85","class":"ansi-bright-yellow"},{color:"85, 85, 255","class":"ansi-bright-blue"},{color:"255, 85, 255","class":"ansi-bright-magenta"},{color:"85, 255, 255","class":"ansi-bright-cyan"},{color:"255, 255, 255","class":"ansi-bright-white"}]];g.prototype.escape_for_html=function(a){return a.replace(/[&<>]/gm,function(a){if(a=="&")return"&";if(a=="<")return"<";if(a==">")return">"})},g.prototype.linkify=function(a){return a.replace(/(https?:\/\/[^\s]+)/gm,function(a){return'<a href="'+a+'">'+a+"</a>"})},g.prototype.ansi_to_html=function(a,b){var c=a.split(/\033\[/),d=c.shift(),e=this,f=c.map(function(a){return e.process_chunk(a,b)});f.unshift(d);var g=f.reduce(function(a,b){return Array.isArray(b)?a.concat(b):(a.push(b),a)},[]),h=g.join("");return h},g.prototype.process_chunk=function(a,b){b=typeof b=="undefined"?{}:b;var c=typeof b.use_classes!="undefined"&&b.use_classes,d=c?"class":"color",e=a.match(/([\d;]*)m([^]*)/m);if(!e)return a;var g=e[2],h=e[1].split(";"),i=this;h.map(function(a){var b=parseInt(a);isNaN(b)||b===0?(i.fg=i.bg=null,i.bright=0):b===1?i.bright=1:b>=30&&b<38?i.fg=f[i.bright][b%10][d]:b>=40&&b<48&&(i.bg=f[0][b%10][d])});if(i.fg===null&&i.bg===null)return g;var j=classes=[];return i.fg&&(c?classes.push(i.fg+"-fg"):j.push("color:rgb("+i.fg+")")),i.bg&&(c?classes.push(i.bg+"-bg"):j.push("background-color:rgb("+i.bg+")")),c?['<span class="'+classes.join(" ")+'">',g,"</span>"]:['<span style="'+j.join(";")+'">',g,"</span>"]},c={escape_for_html:function(a){var b=new g;return b.escape_for_html(a)},linkify:function(a){var b=new g;return b.linkify(a)},ansi_to_html:function(a,b){var c=new g;return c.ansi_to_html(a,b)},ansi_to_html_obj:function(){return new g}},e&&(module.exports=c),typeof window!="undefined"&&typeof ender=="undefined"&&(window.ansi_up=c),typeof define=="function"&&define.amd&&define("ansi_up",[],function(){return c})})(Date); |
@@ -0,0 +1 @@ | |||||
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("katex")):"function"==typeof define&&define.amd?define(["katex"],t):"object"==typeof exports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)}("undefined"!=typeof self?self:this,function(e){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=1)}([function(t,r){t.exports=e},function(e,t,r){"use strict";r.r(t);var n=r(0),o=r.n(n),a=function(e,t,r){for(var n=r,o=0,a=e.length;n<t.length;){var i=t[n];if(o<=0&&t.slice(n,n+a)===e)return n;"\\"===i?n++:"{"===i?o++:"}"===i&&o--,n++}return-1},i=function(e,t,r,n){for(var o=[],i=0;i<e.length;i++)if("text"===e[i].type){var l=e[i].data,d=!0,s=0,f=void 0;for(-1!==(f=l.indexOf(t))&&(s=f,o.push({type:"text",data:l.slice(0,s)}),d=!1);;){if(d){if(-1===(f=l.indexOf(t,s)))break;o.push({type:"text",data:l.slice(s,f)}),s=f}else{if(-1===(f=a(r,l,s+t.length)))break;o.push({type:"math",data:l.slice(s+t.length,f),rawData:l.slice(s,f+r.length),display:n}),s=f+r.length}d=!d}o.push({type:"text",data:l.slice(s)})}else o.push(e[i]);return o},l=function(e,t){var r=function(e,t){for(var r=[{type:"text",data:e}],n=0;n<t.length;n++){var o=t[n];r=i(r,o.left,o.right,o.display||!1)}return r}(e,t.delimiters);if(1===r.length&&"text"===r[0].type)return null;for(var n=document.createDocumentFragment(),a=0;a<r.length;a++)if("text"===r[a].type)n.appendChild(document.createTextNode(r[a].data));else{var l=document.createElement("span"),d=r[a].data;t.displayMode=r[a].display;try{t.preProcess&&(d=t.preProcess(d)),o.a.render(d,l,t)}catch(e){if(!(e instanceof o.a.ParseError))throw e;t.errorCallback("KaTeX auto-render: Failed to parse `"+r[a].data+"` with ",e),n.appendChild(document.createTextNode(r[a].rawData));continue}n.appendChild(l)}return n};t.default=function(e,t){if(!e)throw new Error("No element provided to render");var r={};for(var n in t)t.hasOwnProperty(n)&&(r[n]=t[n]);r.delimiters=r.delimiters||[{left:"$$",right:"$$",display:!0},{left:"\\(",right:"\\)",display:!1},{left:"\\[",right:"\\]",display:!0}],r.ignoredTags=r.ignoredTags||["script","noscript","style","textarea","pre","code","option"],r.ignoredClasses=r.ignoredClasses||[],r.errorCallback=r.errorCallback||console.error,r.macros=r.macros||{},function e(t,r){for(var n=0;n<t.childNodes.length;n++){var o=t.childNodes[n];if(3===o.nodeType){var a=l(o.textContent,r);a&&(n+=a.childNodes.length-1,t.replaceChild(a,o))}else 1===o.nodeType&&function(){var t=" "+o.className+" ";-1===r.ignoredTags.indexOf(o.nodeName.toLowerCase())&&r.ignoredClasses.every(function(e){return-1===t.indexOf(" "+e+" ")})&&e(o,r)}()}}(e,r)}}]).default}); |
@@ -471,6 +471,8 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st | |||||
readmeExist := markup.IsReadmeFile(blob.Name()) | readmeExist := markup.IsReadmeFile(blob.Name()) | ||||
ctx.Data["ReadmeExist"] = readmeExist | ctx.Data["ReadmeExist"] = readmeExist | ||||
isNoteBook := strings.HasSuffix(blob.Name(), ".ipynb") | |||||
ctx.Data["IsNoteBook"] = isNoteBook | |||||
if markupType := markup.Type(blob.Name()); markupType != "" { | if markupType := markup.Type(blob.Name()); markupType != "" { | ||||
ctx.Data["IsMarkup"] = true | ctx.Data["IsMarkup"] = true | ||||
ctx.Data["MarkupType"] = markupType | ctx.Data["MarkupType"] = markupType | ||||
@@ -480,6 +482,8 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st | |||||
ctx.Data["FileContent"] = strings.Replace( | ctx.Data["FileContent"] = strings.Replace( | ||||
gotemplate.HTMLEscapeString(string(buf)), "\n", `<br>`, -1, | gotemplate.HTMLEscapeString(string(buf)), "\n", `<br>`, -1, | ||||
) | ) | ||||
} else if isNoteBook { | |||||
ctx.Data["FileContent"] = string(buf) | |||||
} else { | } else { | ||||
// Building code view blocks with line number on server side. | // Building code view blocks with line number on server side. | ||||
var fileContent string | var fileContent string | ||||
@@ -182,3 +182,15 @@ | |||||
<script src="{{StaticUrlPrefix}}/js/jquery.js?v={{MD5 AppVer}}"></script> | <script src="{{StaticUrlPrefix}}/js/jquery.js?v={{MD5 AppVer}}"></script> | ||||
<script src="{{StaticUrlPrefix}}/self/js/notebook/es5-shim.min.js"></script> | |||||
<script src="{{StaticUrlPrefix}}/self/js/notebook/marked.min.js"></script> | |||||
<script src="{{StaticUrlPrefix}}/self/js/notebook/purify.min.js"></script> | |||||
<script src="{{StaticUrlPrefix}}/self/js/notebook/ansi_up.min.js"></script> | |||||
<script src="{{StaticUrlPrefix}}/self/js/notebook/prism.min.js"></script> | |||||
<script src="{{StaticUrlPrefix}}/self/js/notebook/katex.min.js"></script> | |||||
<script src="{{StaticUrlPrefix}}/self/js/notebook/katex-auto-render.min.js"></script> | |||||
<script src="{{StaticUrlPrefix}}/self/js/notebook/notebook.min.js"></script> | |||||
<script src="{{StaticUrlPrefix}}/self/js/notebook/notebook.min.js"></script> | |||||
<link rel="stylesheet" href="{{StaticUrlPrefix}}/self/css/notebook/katex.min.css" /> | |||||
<link rel="stylesheet" href="{{StaticUrlPrefix}}/self/css/notebook/prism.css" /> | |||||
<link rel="stylesheet" href="{{StaticUrlPrefix}}/self/css/notebook/notebook.css" /> |
@@ -108,6 +108,8 @@ | |||||
<tr> | <tr> | ||||
{{if .IsFileTooLarge}} | {{if .IsFileTooLarge}} | ||||
<td><strong>{{.i18n.Tr "repo.file_too_large"}}</strong></td> | <td><strong>{{.i18n.Tr "repo.file_too_large"}}</strong></td> | ||||
{{else if .IsNoteBook}} | |||||
<td id="notebook"></td> | |||||
{{else}} | {{else}} | ||||
<td class="lines-num">{{.LineNums}}</td> | <td class="lines-num">{{.LineNums}}</td> | ||||
<td class="lines-code"><pre><code class="{{.HighlightClass}}"><ol class="linenums">{{.FileContent}}</ol></code></pre></td> | <td class="lines-code"><pre><code class="{{.HighlightClass}}"><ol class="linenums">{{.FileContent}}</ol></code></pre></td> | ||||
@@ -128,4 +130,16 @@ function submitDeleteForm() { | |||||
$("#delete-file-form").submit() | $("#delete-file-form").submit() | ||||
} | } | ||||
} | } | ||||
function showNoteBook(){ | |||||
var isNoteBook = {{.IsNoteBook}} | |||||
if (isNoteBook) { | |||||
var jsonStr = "{{.FileContent}}" | |||||
var notebook = nb.parse(JSON.parse(jsonStr)); | |||||
var rendered = notebook.render(); | |||||
$("#notebook").append(rendered); | |||||
Prism.highlightAll(); | |||||
} | |||||
} | |||||
showNoteBook() | |||||
</script> | </script> |
@@ -1222,10 +1222,18 @@ async function initRepository() { | |||||
highlight(this); | highlight(this); | ||||
}); | }); | ||||
} | } | ||||
let imageShow = '' | |||||
const $content = $segment.parent(); | const $content = $segment.parent(); | ||||
if (!$content.find('.ui.small.images').length) { | if (!$content.find('.ui.small.images').length) { | ||||
if (data.attachments !== '') { | if (data.attachments !== '') { | ||||
if ($content.find('.ui.middle.aligned').length === 0) { | |||||
imageShow += '<div class="ui clearing divider"></div>' | |||||
imageShow += '<div class="ui middle aligned padded grid">' | |||||
imageShow += data.attachments | |||||
imageShow += '</div>' | |||||
$content.find('.ui.attached.segment').append(imageShow) | |||||
} | |||||
else { $content.find('.ui.middle.aligned').html(data.attachments) } | |||||
} | } | ||||
} else if (data.attachments === '') { | } else if (data.attachments === '') { | ||||
$content | $content | ||||