Github每日精选(第43期):小型独立纯 Go Web 服务器algernon,支持 Lua、Markdown、HTTP/2、QUIC、Redis 和 PostgreSQL

algernon

algernon 是一个小型独立纯 Go Web 服务器,支持 LuaMarkdownHTTP/2QUICRedisPostgreSQL

特别是对于lua的解析,还是挺有用的,把lua的结果直接渲染成html,以后就可以直接用lua 来写html代码了。

在这里插入图片描述
github的地址在这里

algernon 支持了很多的东西,包含内置支持 QUICHTTP/2LuaTealMarkdownPongo2HyperAppAmberSass(SCSS)GCSSJSXBoltDBWeb 服务器(内置,将数据库存储在文件中,如 SQLite )、RedisPostgreSQLMariaDB/MySQL、速率限制、正常关闭、插件、用户和权限。

安装

需要 Go 1.19 或更高版本。

go install github.com/xyproto/algernon@latest

或手动:

git clone https://github.com/xyproto/algernon
cd algernon
go build -mod=vendor
./welcome.sh
示例

安装完成了以后,运行./welcome.sh的脚本以后,我们会得到如下的输出,这里面的信息提示我们,只要访问localhost:3000/ 就能看到相应的网站,比较好玩的是,在终端怎么能打印出这一对眼睛呢?是不是挺有趣的。后面我们在分析分析这个代码,这得下一点功夫,让他看起来有爱一点,让人感到温暖。

在这里插入图片描述

这时候我们打开localhost:3000/ ,这的是看到了网站,网站的内容就是几个demo的示例。先来看看这个页面是哪里来的。
启动脚本中../welcome.sh,源码如下:

#!/bin/sh
echo 'Try editing the markdown file in "samples" directory and see the'
echo 'results instantly in the browser at http://localhost:3000/'
./algernon --dev --conf serverconf.lua --dir samples --httponly --debug --autorefresh --bolt --server "$@"

一段 执行脚本而已,并没有什么特别的,--dir 应该是指定了脚本的路径,那这个页面应该是在samples 目录的index下,打开samples 目录发现了index.md。 果然把Markdown的文件渲染为HTML了。

<!--
title: Algernon Server
-->

# Algernon Server

Welcome
-------

Your local Algernon server is up and running.

You can find this Markdown file in the `samples/` directory.

Try changing `index.md` in your favorite editor and watch this page refresh instantly as you save.

Samples
-------

* [Styled Markdown](greetings)
* [Simple TODO application](todo)
* [Poem by Algernon Charles Swinburne](threejs)
* [Using React with Algernon](react_db)
* [Hello Lua](lua)
* [Counter](counter)
* [Iterate](iterate)
* [Bootstrap](bootstrap)
* [Permissions](permissions)

There are more samples in the `samples/` directory.

Resources
---------

* [GCSS documentation](https://github.com/yosssi/gcss/blob/master/README.md)
* [Amber documentation](https://github.com/eknkc/amber/blob/master/README.md)
* [Markdown documentation](https://daringfireball.net/projects/markdown/basics)
* [Algernon web page](http://algernon.roboticoverlords.org/)
* [Algernon project page](https://github.com/xyproto/algernon/)
* [Learn Markdown in Y minutes](https://learnxinyminutes.com/docs/markdown/)
* [Markdown tutorial](http://markdowntutorial.com/)
* [Lua at Rosetta Code](https://rosettacode.org/wiki/Category:Lua)
* [Learn Lua in Y minutes](https://learnxinyminutes.com/docs/lua/)

在这里插入图片描述
我们会发现有一个相关的style.gcss,这个就是我们的样式了,通过修改style.gcss可以修改出自己喜欢的样式来。

其中比较有意思的应该是Hello Lua,他也是在samples 目录 下的lua目录,文件为index.lua

简简单单的一句话:

print("Hello, Lua!")

这样我们就可以用lua来写html页面了。

algernon 的功能还是比较多的,更多的直接了解相关的网站。

以下文件名是特殊的,按优先顺序排列:

  • index.lua 是 Lua 代码,被解释为当前目录的处理函数。
  • index.html 是使用正确 Content-Type 输出的 HTML。
  • index.md 是呈现为 HTML 的 Markdown 代码。
  • index.txt 是使用正确 Content-Type 输出的纯文本。
  • index.pongo2、index.po2 或 index.tmpl 是呈现为 HTML 的 Pongo2 代码。
  • index.amber 是呈现为 HTML 的 Amber 代码。
  • index.hyper.js 或 index.hyper.jsx 是呈现为 HTML 的 JSX+HyperApp 代码
  • index.tl 是Teal 代码,被解释为当前目录的处理函数。
  • data.lua 是 Lua 代码,其中函数和变量可用于同一目录中的 Pongo2、Amber 和 Markdown 页面。
  • 如果将单个 Lua 脚本作为命令行参数给出,它将被用作独立服务器。它可用于设置处理程序或为特定 URL 前缀提供文件和目录。
  • style.gcss 是 GCSS 代码,用作同一目录中所有 Pongo2、Amber 和 Markdown 页面的样式。
代码分析

我们刚才讲到,那个小眼睛是怎么展示出来的,这里的代码就是用来展示小眼睛的。

func decompressImage(asciigfx string) string {
	unbasedBytes, err := base64.StdEncoding.DecodeString(asciigfx)
	if err != nil {
		panic("Could not decode base64: " + err.Error())
	}
	buf := bytes.NewBuffer(unbasedBytes)
	decompressorReader, err := gzip.NewReader(buf)
	if err != nil {
		panic("Could not read buffer: " + err.Error())
	}
	decompressedBytes, err := io.ReadAll(decompressorReader)
	decompressorReader.Close()
	if err != nil {
		panic("Could not decompress: " + err.Error())
	}
	return string(decompressedBytes)
}

显示:

func Banner(versionString, description string) string {
	tabs := "\t\t\t\t"
	s := tabs + strings.ReplaceAll("\n"+decompressImage(image), "\n", "\n"+tabs)
	parts := strings.Fields(versionString)

	// See https://github.com/shiena/ansicolor/blob/master/README.md for ANSI color code table
	s = insertText(s, tabs, 3, 2, "\x1b[37m"+parts[0]+"\x1b[0m", 1)
	s = insertText(s, tabs, 4, 1, "\x1b[90m"+parts[1]+"\x1b[0\t", 1)
	s = insertText(s, tabs, 5, 1, "\x1b[94m"+description+"\x1b[0m", 1)
	return s
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go2coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值