added stuff
This commit is contained in:
parent
2b32eff2d9
commit
b025c5d762
44
README.md
44
README.md
|
@ -1,3 +1,45 @@
|
||||||
# website.rb
|
# website.rb
|
||||||
|
|
||||||
Ruby CGI scripts that I used to set up my website
|
Ruby CGI scripts that I used to set up my website
|
||||||
|
|
||||||
|
## What is included
|
||||||
|
|
||||||
|
- listing.rb - generates a recursve listing of files at your preferred location
|
||||||
|
- markdown.rb - processes markdown (partially) and converts it to HTML
|
||||||
|
|
||||||
|
## How to apply this to your site
|
||||||
|
|
||||||
|
- Drop all .rb files into your web directory root
|
||||||
|
- Edit markdown.rb and point ROOT\_PATH to the full web directory root path
|
||||||
|
- Edit listing.rb and point ROOT\_PATH to the full web directory root path and DIR\_PATH to the directory where markdown files are located (they have to be in adirectory under root!)
|
||||||
|
- If you're using lighttpd:
|
||||||
|
- Install `mod_cgi` in your config file and add "listing.rb" as an index
|
||||||
|
```
|
||||||
|
server.modules += ("mod_cgi")
|
||||||
|
index-file.names += ("listing.rb")
|
||||||
|
cgi.assign = (
|
||||||
|
".rb" => "/usr/bin/ruby"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
- If you're using apache:
|
||||||
|
- lmao idk
|
||||||
|
- just add CGI module, make it run ruby files and make listing.rb an index
|
||||||
|
- If you're using NGINX:
|
||||||
|
- Install lighttpd and configure it the same way as above, but use a custom port for the server
|
||||||
|
- Add `listing.rb` as an index file to your preferred location
|
||||||
|
- Add a reverse proxy clause in NGINX config to proxy all .md and .rb requests to the lighttpd server
|
||||||
|
```nginx
|
||||||
|
...
|
||||||
|
|
||||||
|
# pass ruby files to lighttpd
|
||||||
|
location ~ \.rb {
|
||||||
|
proxy_pass http://127.0.0.1:6969;
|
||||||
|
}
|
||||||
|
|
||||||
|
# pass .md files as query parameters to markdown.rb
|
||||||
|
location ~ \.md {
|
||||||
|
proxy_pass http://127.0.0.1:6969/markdown.rb?docfile=$uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
|
@ -0,0 +1,84 @@
|
||||||
|
#!/usr/bin/ruby
|
||||||
|
#
|
||||||
|
#Copyright 2022 Yessiest (yessiest@memeware.net)
|
||||||
|
#
|
||||||
|
#Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
#you may not use this file except in compliance with the License.
|
||||||
|
#You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
#http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
#Unless required by applicable law or agreed to in writing, software
|
||||||
|
#distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
#See the License for the specific language governing permissions and
|
||||||
|
#limitations under the License.
|
||||||
|
|
||||||
|
# Ruby CGI module to produce a directory listing of filterable content
|
||||||
|
# Variables
|
||||||
|
ROOT_PATH="/var/www/"
|
||||||
|
DIR_PATH="/var/www/blog"
|
||||||
|
EXTENSIONS=[".md"]
|
||||||
|
TEMPLATE_PRE="template.pre.html"
|
||||||
|
TEMPLATE_POST="template.post.html"
|
||||||
|
TEMPLATE_CSS="template.css"
|
||||||
|
# Script
|
||||||
|
require 'cgi'
|
||||||
|
|
||||||
|
$cgi = CGI.new("html5")
|
||||||
|
|
||||||
|
template_css = ""
|
||||||
|
template_pre = ""
|
||||||
|
template_post = ""
|
||||||
|
if File::exists?( ROOT_PATH+TEMPLATE_CSS ) then
|
||||||
|
template_css = cgi.link( rel = "stylesheet", href = TEMPLATE_CSS)
|
||||||
|
end
|
||||||
|
if File::exists?( ROOT_PATH+TEMPLATE_PRE) then
|
||||||
|
template_pre_f = File.new( ROOT_PATH+TEMPLATE_PRE, "r")
|
||||||
|
template_pre = template_pre_f.read
|
||||||
|
template_pre_f.close
|
||||||
|
end
|
||||||
|
if File::exists?( ROOT_PATH+TEMPLATE_POST) then
|
||||||
|
template_post_f = File.new( ROOT_PATH+TEMPLATE_POST, "r")
|
||||||
|
template_post = template_post_f.read
|
||||||
|
template_post_f.close
|
||||||
|
end
|
||||||
|
|
||||||
|
def listdir(path)
|
||||||
|
$cgi.ul {
|
||||||
|
list = ""
|
||||||
|
Dir.foreach(path) do |fname|
|
||||||
|
if (not ([".",".."].include? fname)) and
|
||||||
|
File.directory?(path+"/"+fname) then
|
||||||
|
list = list+"\n"+
|
||||||
|
"<li>"+fname+": </li>"+
|
||||||
|
listdir(path+"/"+fname)
|
||||||
|
elsif fname.match(/\.\w*$/) and
|
||||||
|
EXTENSIONS.include?(fname.match(/\.\w*$/)[0]) then
|
||||||
|
list = list+"\n"+$cgi.li {
|
||||||
|
$cgi.a(href=((path+"/").gsub(ROOT_PATH,"")+fname)) {
|
||||||
|
fname
|
||||||
|
}
|
||||||
|
}+"\n"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
list
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
content = $cgi.body {
|
||||||
|
template_pre+"\n"+
|
||||||
|
listdir(DIR_PATH)+"\n"+
|
||||||
|
template_post+"\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
$cgi.out {
|
||||||
|
$cgi.html {
|
||||||
|
$cgi.head { "\n"+
|
||||||
|
$cgi.title { "File listing" }+"\n"+
|
||||||
|
template_css
|
||||||
|
} +
|
||||||
|
content
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,148 @@
|
||||||
|
#!/usr/bin/ruby
|
||||||
|
#
|
||||||
|
#Copyright 2022 Yessiest (yessiest@memeware.net)
|
||||||
|
#
|
||||||
|
#Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
#you may not use this file except in compliance with the License.
|
||||||
|
#You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
#http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
#Unless required by applicable law or agreed to in writing, software
|
||||||
|
#distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
#See the License for the specific language governing permissions and
|
||||||
|
#limitations under the License.
|
||||||
|
|
||||||
|
# Ruby CGI module to produce human-readable HTML from markdown pages
|
||||||
|
# Variables
|
||||||
|
ROOT_PATH="/var/www/"
|
||||||
|
TAB_MULTIPLIER=10
|
||||||
|
TAB_UNIT="px"
|
||||||
|
QUOTE_TAB=4
|
||||||
|
TEMPLATE_PRE="template.pre.html"
|
||||||
|
TEMPLATE_POST="template.post.html"
|
||||||
|
TEMPLATE_CSS="template.css"
|
||||||
|
# Script
|
||||||
|
require 'cgi'
|
||||||
|
|
||||||
|
cgi = CGI.new("html5")
|
||||||
|
|
||||||
|
def ident(ident)
|
||||||
|
return "<span style=\"margin-left: #{(ident*TAB_MULTIPLIER).to_s+TAB_UNIT}\">"
|
||||||
|
end
|
||||||
|
|
||||||
|
def _parse_list(text,mode=["ul",/ *-/])
|
||||||
|
new_text = ""
|
||||||
|
list_started = false
|
||||||
|
text.each_line do |line|
|
||||||
|
starts = line.start_with?(mode[1])
|
||||||
|
l_ident = line.match(/ */)[0].length
|
||||||
|
if (not list_started) and (starts) then
|
||||||
|
list_started = true
|
||||||
|
new_text=new_text+"<#{mode[0]}>\n<li>#{ident l_ident}\n"+line.gsub(mode[1],"")+"</span></li>\n"
|
||||||
|
elsif (list_started) and (not starts) then
|
||||||
|
list_started = false
|
||||||
|
new_text=new_text+"</#{mode[0]}>\n"+line
|
||||||
|
elsif (list_started) and (starts) then
|
||||||
|
new_text = new_text+"<li>#{ident l_ident}\n"+line.gsub(mode[1],"")+"</span></li>\n"
|
||||||
|
else
|
||||||
|
new_text = new_text+line
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return new_text
|
||||||
|
end
|
||||||
|
|
||||||
|
template_css = ""
|
||||||
|
template_pre = ""
|
||||||
|
template_post = ""
|
||||||
|
if File::exists?( ROOT_PATH+TEMPLATE_CSS ) then
|
||||||
|
template_css = cgi.link( rel = "stylesheet", href = TEMPLATE_CSS)
|
||||||
|
end
|
||||||
|
if File::exists?( ROOT_PATH+TEMPLATE_PRE) then
|
||||||
|
template_pre_f = File.new( ROOT_PATH+TEMPLATE_PRE, "r")
|
||||||
|
template_pre = template_pre_f.read
|
||||||
|
template_pre_f.close
|
||||||
|
end
|
||||||
|
if File::exists?( ROOT_PATH+TEMPLATE_POST) then
|
||||||
|
template_post_f = File.new( ROOT_PATH+TEMPLATE_POST, "r")
|
||||||
|
template_post = template_post_f.read
|
||||||
|
template_post_f.close
|
||||||
|
end
|
||||||
|
|
||||||
|
doc = "---
|
||||||
|
# Error 404: Document not available
|
||||||
|
|
||||||
|
Document you requested is not available
|
||||||
|
---"
|
||||||
|
# Absolutely containing the script to the ROOT_PATH and making it only read .md
|
||||||
|
if cgi["docfile"].end_with?(".md") and
|
||||||
|
(File.absolute_path(ROOT_PATH+cgi["docfile"]).start_with?(ROOT_PATH)) and
|
||||||
|
File::exists?( ROOT_PATH+cgi["docfile"] ) then
|
||||||
|
docfile = File.new(ROOT_PATH+cgi["docfile"],"r")
|
||||||
|
doc = docfile.read
|
||||||
|
docfile.close
|
||||||
|
end
|
||||||
|
|
||||||
|
content = cgi.body {
|
||||||
|
doc = "\n"+CGI.escapeHTML(doc)
|
||||||
|
|
||||||
|
# Extra
|
||||||
|
# - Horizontal rule
|
||||||
|
doc = doc.gsub(/-{3,}/,"<hr />")
|
||||||
|
# - Paragraph separators
|
||||||
|
doc = doc.gsub(/(?<=\n\n)(.*?)(?=\n\n)/m,"<p>\n\\1\n</p>")
|
||||||
|
|
||||||
|
# Parse lists
|
||||||
|
# - Unordered lists
|
||||||
|
doc = _parse_list(doc)
|
||||||
|
# - Ordered lists
|
||||||
|
doc = _parse_list(doc,mode = ["ol",/ *\d*\./])
|
||||||
|
|
||||||
|
# Bounded markup
|
||||||
|
# - Bold/Italics
|
||||||
|
doc = doc.gsub(/(?<!\\)\*{3}(.*?)(?<!\\)\*{3}/m,"<i><b>\\1</b></i>")
|
||||||
|
doc = doc.gsub(/(?<!\\)\*{2}(.*?)(?<!\\)\*{2}/m,"<b>\\1</b>")
|
||||||
|
doc = doc.gsub(/(?<!\\)\*{1}(.*?)(?<!\\)\*{1}/m,"<i>\\1</i>")
|
||||||
|
# - Underline
|
||||||
|
doc = doc.gsub(/(?<!\\)_(.*?)_(?<!\\)/m,"<span style=\"text-decoration:underline;\">\\1</span>")
|
||||||
|
# - Strikethrough
|
||||||
|
doc = doc.gsub(/(?<!\\)~(.*?)~(?<!\\)/m,"<strike>\\1</strike>")
|
||||||
|
|
||||||
|
# Unbounded (line) markup
|
||||||
|
# - Headers
|
||||||
|
doc = doc.gsub(/(?<=\n)\#{4} ?(.*)/,"<h4>\\1</h4>")
|
||||||
|
doc = doc.gsub(/(?<=\n)\#{3} ?(.*)/,"<h3>\\1</h3>")
|
||||||
|
doc = doc.gsub(/(?<=\n)\#{2} ?(.*)/,"<h2>\\1</h2>")
|
||||||
|
doc = doc.gsub(/(?<=\n)\# ?(.*)/,"<h1>\\1</h1>")
|
||||||
|
|
||||||
|
# - Quote
|
||||||
|
doc = doc.gsub(/(?<=\n)>(.*)/,"#{ident QUOTE_TAB}<span class=\"quote\">\\1</span></span>")
|
||||||
|
|
||||||
|
# Links
|
||||||
|
# - Images
|
||||||
|
doc = doc.gsub(/!\[(.*?)\]\((.*?)\)/,"<img src=\"\\2\" alt=\"\\1\" />")
|
||||||
|
# - Hyperlinks
|
||||||
|
doc = doc.gsub(/\[(.*?)\]\((.*?)\)/,"<a href=\"\\2\">\\1</a>")
|
||||||
|
|
||||||
|
# Code blocks
|
||||||
|
# - Full block
|
||||||
|
doc = doc.gsub(/(?<!\\)`{3}(.*?)(?<!\\)`{3}/m,"<pre><code class=\"codeblock\">\n\\1</pre></code>")
|
||||||
|
# - Inline block
|
||||||
|
doc = doc.gsub(/(?<!\\)`{2}(.*?)(?<!\\)`{2}/m,"<code class=\"codeinline\">\\1</code>")
|
||||||
|
|
||||||
|
template_pre+"\n"+
|
||||||
|
doc+"\n"+
|
||||||
|
template_post+"\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
cgi.out {
|
||||||
|
cgi.html {
|
||||||
|
cgi.head { "\n"+
|
||||||
|
cgi.title { cgi["docfile"].gsub(/.md$/,"") }+"\n"+
|
||||||
|
template_css
|
||||||
|
} +
|
||||||
|
content
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue