本指南将向您展示如何通过配置外部渲染器来使 Gitea 呈现 Jupyter Notebooks。当然,你还可以根据本指南来为你的 Gitea 实例配置其他类型的文档渲染器,甚至是二进制文件!相信Gitea,一切皆有可能。

如何让 Gitea 原生支持渲染 .ipynb 文件

首先,让我们在 Gitea 实例上创建一个新的存储库并将示例笔记本推送上去:

当前,就如我们看到的那样,Gitea 只是将文档的原始内容以纯文本的形式渲染出来——虽然高效但是可读性差。

如何才能生成可读的 HTML 文档

为了向用户显示更有吸引力的东西,我们需要一些 HTML,幸运的是 Jupyter 有一个名为 nbconvert 的模块:

在 Gitea 服务器上安装我们所需的 nbconvert,它是一个 Python 模块:

sudo apt install python3-pip
pip3 install nbconvert

安装完成,我们可以通过运行命令来测试它,将一个 .ipynb 转换为 .html

jupyter nbconvert --to html --template full path/to/some/test/notebook.ipynb

如果我们在浏览器中打开刚才生成的 .html 文件,我们会得到如下所示的内容:

看起来有戏……让我们继续。

配置 Gitea 的文档渲染器

跟其他配置选项一样,我们可以在 custom/conf/app.ini 中添加 jupyter 渲染器。

; Gitea looks for markup.xxxxx and will apply both "markup" and "xxxxx" as a class to the parent <div>
[markup.jupyter]
ENABLED = true
; all the file extensions we want to convert, comma separated.
FILE_EXTENSIONS = .ipynb
; Lets use out nbconvert command from earlier - making to sure to convert to HTML and to output to stdout
RENDER_COMMAND = "jupyter nbconvert --stdout --to html --template full "
; nbconvert accepts a path to a file and not stdin
IS_INPUT_FILE = true ; the name after sanitizer doesn't really matter
[markup.sanitizer.jupyter0]
; Jupyter chiefly uses divs
ELEMENT = div
; we will need access to html classes later
ALLOW_ATTR = class
; we don't mind which classes we keep, so let's keep all of them
REGEXP =

现在让我们看看当我们重新启动 Gitea 时会呈现出什么状况。

如图所示,文档的可读性会比刚开始稍好一些,但仍然与我们之前打开 HTML 时有差距。这是因为 Gitea 禁用了文档的内联样式表以满足网站的安全性需求。而这些内联样式是从封装代码的 <div> 当中的 markup 类继承来的。

修复丢失的样式

如果我们检查之前创建的 HTML 文档内容,会发现几个内联样式:

<style type="text/css">
/*!
*
* Twitter Bootstrap
*
*/
/*!
* Bootstrap v3.3.7 (http://getbootstrap.com)
* Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
html {
font-family: sans-serif;
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
}
body {
margin: 0;
} [...] </stlye>

找到了解决问题的关键,我们就可以将上面的样式统统剥离下来并将它们组合成一个 jupyter.less 文件,然后删除原来的 <style></style> HTML 标签,如<style></style>

于是,我们就创造了一个包含各种漂亮样式的样式表集合。同时,这个集合也包含了很多通用选择器,例如:

body {
margin: 0;
}

这些通用选择器肯定会与 Gitea 的默认样式发生冲突。所以我们还需要确保限制了样式的应用范围。幸运的是,Gitea 和 less 可以帮助我们解决这个问题。

将通用选择器按照 less 语法包裹起来:

.someclass {
body {
margin: 0;
}
summary {
display: block;
}
}

上面的代码相也当于 css:

.someclass body {
margin: 0;
} .someclass summary {
display: block;
}

于此同时,Gitea 已将 app.ini 中的 markupjupyter 类附加到了代码块 <div> 上。

因此,让我们将 jupyter.less 的全部内容封装在 .markup.jupyter {} 中,以生成如下所示的内容。

现在让我们将该文件放在我们的 custom 目录中,例如 /root/custom/public/css/jupyter.less

然后将下面的模板添加到 /root/custom/templates/header.tmpl

<!-- lets import the less stylesheet {{AppSubUrl}} is a variable that gitea will autofill -->
<link rel="stylesheet/less" type="text/css" href="{{AppSubUrl}}/css/jupyter.less" />
<!-- we need the javascript to compile the less into css -->
<script src="//cdn.jsdelivr.net/npm/less" ></script>

现在重新启动 Gitea 看看会有什么变化。

呈现使用 .markup.jupyer 自定义样式的最终外观:

看起来不错,但还是出现了一些问题,例如文本溢出了边界。这是由一些肮脏的 CSS 规则引起的,所以我们还需要从 jupyter.less 中删除以下内容:

@media (min-width: 768px) {
.container {
width: 768px;
}
}
@media (min-width: 992px) {
.container {
width: 940px;
}
}
@media (min-width: 1200px) {
.container {
width: 1140px;
}
}

完美的 Jupyter Notebooks!

基于 Gitea 服务端渲染的 Jupyter Notebooks的更多相关文章

  1. Vue 爬坑之路(十一)—— 基于 Nuxt.js 实现服务端渲染(SSR)

    直接使用 Vue 构建前端单页面应用,页面源码时只有简单的几行 html,这并不利于网站的 SEO,这时候就需要服务端渲染 2016 年 10 月 25 日,zeit.co 背后的团队对外发布了一个 ...

  2. 追求极致的用户体验ssr(基于vue的服务端渲染)

    首先这篇博客并不是ssr建议教程,需要ssr入门的我建议也不要搜索博客了,因为官网给出了详细的入门步骤,只需要step by step就可以了,这篇博客的意义是如何使用ssr,可能不同的人有不同的意见 ...

  3. 基于vue的nuxt框架cnode社区服务端渲染

    nuxt-cnode 基于vue的nuxt框架仿的cnode社区服务端渲染,主要是为了seo优化以及首屏加载速度 线上地址 http://nuxt-cnode.foreversnsd.cngithub ...

  4. 基于Angular4+ server render(服务端渲染)开发教程

    目标: 1.更好的 SEO,方便搜索爬虫抓取页面内容 2.更快的内容到达时间(time-to-content) 影响: 1.用户:比原来更快的看到渲染的页面,提升用户体验 2.开发人员:某些代码可能需 ...

  5. 6.前端基于react,后端基于.net core2.0的开发之路(6) 服务端渲染(SSR)

    0.源码地址 https://gitee.com/teambp/ScaffoldClient  这个地址下载对应源码. 1.服务端渲染是啥? 就是在服务器进行页面渲染(废话),当页面展示后,显示的就是 ...

  6. 基于vue-cli项目添加服务端渲染

    两个示例的git地址: 1. 我的环境 2. 方式一:使用prerender-spa-plugin插件获得SSR的效果. 2.1 说明 2.2 初始化 1 vue init webpack vue-p ...

  7. Diy页面服务端渲染解决方案

    1. 问题由来 在移动互联网电商领域,运营每天需要搭建多个促销页面来吸引用户去点击去购买,一开始程序员临时写个新页面去实现,可这些页面可以用几次就不用了,每次创建新页面去实现费时费力,而且,电商的运营 ...

  8. 实例PK(Vue服务端渲染 VS Vue浏览器端渲染)

    Vue 2.0 开始支持服务端渲染的功能,所以本文章也是基于vue 2.0以上版本.网上对于服务端渲染的资料还是比较少,最经典的莫过于Vue作者尤雨溪大神的 vue-hacker-news.本人在公司 ...

  9. Vue服务端渲染和Vue浏览器端渲染的性能对比

    Vue 2.0 开始支持服务端渲染的功能,所以本文章也是基于vue 2.0以上版本.网上对于服务端渲染的资料还是比较少,最经典的莫过于Vue作者尤雨溪大神的 vue-hacker-news.本人在公司 ...

随机推荐

  1. sql-DDL-约束

    约束 对表中的数据进行限定,保证数据的正确性.有效性和完整性. 6个约束 1. 主键约束Primary Key: 唯一,不能为null -- 主键约束.和唯一约束不能同时设置 1. 含义:非空且唯一 ...

  2. 从UI Designer上面动态创建下拉列表

    在UI Desigher上创建一个新的列表 并创建2个值,code 和value 添加一个EventHandler 在EventHandler上面添加一个Operation 类型为script$dat ...

  3. .NET自定义认证虽然简单,但好用

    前言 有这样一种场景,就是新项目已经集成了认证中心,或者是都用了统一的认证方式(比如现在常用的JWT),这样对于项目之间的对接就显得比较方便,至少在认证这块还是能减少一些工作量的.但当上线的老项目需要 ...

  4. SpringCloudAlibaba分布式事务解决方案Seata实战与源码分析-上

    概述 定义 Spring Cloud Alibaba Seata 官网地址 https://seata.io/zh-cn/ 最新版本1.5.2 Spring Cloud Alibaba Seata 文 ...

  5. linux新建分区和磁盘

    1.查看已有分区 ]# df –hl fdisk -l 查看磁盘情况 ]# fdisk –l 2.对未分区的进行分区 # fdisk /dev/vdb 硬盘分区 创建了一个55G的分区磁盘 1.新建第 ...

  6. 关于ios的IDFA

    了解IDFA,看我这篇文章就够了双11剁手后,我静静的限制了广告追踪 今年双11爆了,据统计,全天交易额1207亿,移动端占比82%,在马云的持续教育和移动端的爆发下,用户在移动端消费的习惯已经不可逆 ...

  7. 如何在Rust中打印变量的类型?

    #![feature(core_intrinsics)] fn print_type_of<T>(_: T) { println!("{}", unsafe { std ...

  8. Rust 从入门到精通01-简介

    1.rust 从哪里来 Rust语言在2006年作为 Mozilla 员工 Graydon Hoare 的私人项目出现,而 Mozilla 于 2009 年开始赞助这个项目.第一个有版本号的 Rust ...

  9. linux 安装Apache php mysql注意事项

    由于apache的php组件 php.so是由php安装生成的,故需在Apache安装之后才安装php比较合适 libphp5.so是php5提供的,你还需要编译php5才能生成这个文件 你在PHP的 ...

  10. 远见而明察近观若明火|Centos7.6环境基于Prometheus和Grafana结合钉钉机器人打造全时监控(预警)Docker容器服务系统

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_181 我们知道,奉行长期主义的网络公司,势必应在软件开发流程管理体系上具备规范意识,即代码提交有CR(CodeReview),功能 ...