@@ -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()) | |||
ctx.Data["ReadmeExist"] = readmeExist | |||
isNoteBook := strings.HasSuffix(blob.Name(), ".ipynb") | |||
ctx.Data["IsNoteBook"] = isNoteBook | |||
if markupType := markup.Type(blob.Name()); markupType != "" { | |||
ctx.Data["IsMarkup"] = true | |||
ctx.Data["MarkupType"] = markupType | |||
@@ -480,6 +482,8 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st | |||
ctx.Data["FileContent"] = strings.Replace( | |||
gotemplate.HTMLEscapeString(string(buf)), "\n", `<br>`, -1, | |||
) | |||
} else if isNoteBook { | |||
ctx.Data["FileContent"] = string(buf) | |||
} else { | |||
// Building code view blocks with line number on server side. | |||
var fileContent string | |||
@@ -182,3 +182,15 @@ | |||
<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> | |||
{{if .IsFileTooLarge}} | |||
<td><strong>{{.i18n.Tr "repo.file_too_large"}}</strong></td> | |||
{{else if .IsNoteBook}} | |||
<td id="notebook"></td> | |||
{{else}} | |||
<td class="lines-num">{{.LineNums}}</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() | |||
} | |||
} | |||
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> |
@@ -1222,10 +1222,18 @@ async function initRepository() { | |||
highlight(this); | |||
}); | |||
} | |||
let imageShow = '' | |||
const $content = $segment.parent(); | |||
if (!$content.find('.ui.small.images').length) { | |||
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 === '') { | |||
$content | |||