GitHub-Style Alerts in Jekyll with Liquid
Adam Hassan / March 2024 (2171 Words, 13 Minutes)
Table of Contents
Want to have beautiful alerts/hints on your Jekyll pages? Skip to here to read.
Examples
Caution
This is a caution!
Warning
This is a warning!
Tip
This is a tip!
Note
This is a note!
Important
This is important!
Why doesn’t Jekyll already have this?
I wanted to use alerts like the hints on GitBook or alerts on GitHub but the jekyll template I’m using doesn’t support them.
I’d never made a Jekyll plugin before, but there way a good list of simple plugins on the official website that I could use to base mine on: Jekyll: Your First Plugin
At the moment, my plugin is essentially a result of me copy-pasting the html and some css straight from one of the GitHub themes into a file and then writing some ruby to do templating with Liquid.
This means the SVGs are currently embedded into the html, but the css is not. I also have some erroneous tags/classes and probably some very badly-written CSS.
It works though!
Maybe I’ll try refactoring it. Maybe not.
For now, I’m super happy to finally be able to use these in my blogs.
How to Install
One note here:
I am very new to Jekyll, Sass, Liquid, and all things web (so this code will be quite messy).
If I ever decide to improve on it, changes will be put on my GitHub
Add this plugin to ./_plugins/markdown_alerts.rb
:
module Jekyll
class MarkdownAlertTag < Liquid::Block
def initialize(tag_name, alert_type, tokens)
super
@alert_type = alert_type.strip.downcase
end
def render(context)
content = super
case @alert_type
when "note"
"<div class=\"markdown-alert markdown-alert-note\" dir=\"auto\"><p class=\"markdown-alert-title\" dir=\"auto\"><svg class=\"octicon octicon-info mr-2\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"></path></svg>Note</p><p dir=\"auto\" class=\"pInfo\">#{content}</p></div>"
when "tip"
"<div class=\"markdown-alert markdown-alert-tip\" dir=\"auto\"><p class=\"markdown-alert-title\" dir=\"auto\"><svg class=\"octicon octicon-tip mr-2\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z\"></path></svg>Tip</p><p dir=\"auto\" class=\"pInfo\">#{content}</p></div>"
when "important"
"<div class=\"markdown-alert markdown-alert-important\" dir=\"auto\"><p class=\"markdown-alert-title\" dir=\"auto\"><svg class=\"octicon octicon-important mr-2\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"></path></svg>Important</p><p dir=\"auto\" class=\"pInfo\">#{content}</p></div>"
when "warning"
"<div class=\"markdown-alert markdown-alert-warning\" dir=\"auto\"><p class=\"markdown-alert-title\" dir=\"auto\"><svg class=\"octicon octicon-warning mr-2\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"></path></svg>Warning</p><p dir=\"auto\" class=\"pInfo\">#{content}</p></div>"
when "caution"
"<div class=\"markdown-alert markdown-alert-caution\" dir=\"auto\"><p class=\"markdown-alert-title\" dir=\"auto\"><svg class=\"octicon octicon-caution mr-2\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"></path></svg>Caution</p><p dir=\"auto\" class=\"pInfo\">#{content}</p></div>"
else
end
end
end
end
Liquid::Template.register_tag('alert', Jekyll::MarkdownAlertTag)
Add the following to your *.scss
file
// -------------------------------------------- //
// copied from view-source:https://github.com/orgs/community/discussions/16925
.markdown-alert {
margin-bottom: 16px;
color: inherit;
// modify to a secondary background color or comment out
background-color: var(--bg-secondary);
border-left: 0.3rem solid;
border-radius: 0.3rem;
padding: 0.5em;
}
.pInfo {
margin-top: -1.1em;
margin-left: 0.75em;
}
.markdown-alert>:first-child {
margin-top: 0
}
.markdown-alert>:last-child {
margin-bottom: 0
}
.markdown-alert .markdown-alert-title {
display: flex;
font-weight: bold;
align-items: center;
line-height: 1
}
.markdown-alert.markdown-alert-note {
border-left-color: #539bf5
}
.markdown-alert.markdown-alert-note .markdown-alert-title {
color: #539bf5
}
.markdown-alert.markdown-alert-important {
border-left-color: #986ee2;
}
.markdown-alert.markdown-alert-important .markdown-alert-title {
color: #986ee2;
}
.markdown-alert.markdown-alert-warning {
border-left-color: #c69026;
}
.markdown-alert.markdown-alert-warning .markdown-alert-title {
color: #c69026;
}
.markdown-alert.markdown-alert-tip {
border-left-color: #57ab5a;
}
.markdown-alert.markdown-alert-tip .markdown-alert-title {
color: #57ab5a;
}
.markdown-alert.markdown-alert-caution {
border-left-color: #e5534b;
}
.markdown-alert.markdown-alert-caution .markdown-alert-title {
color: #e5534b;
}
// octicon colors
.octicon {
color: inherit;
padding: 0.75em;
transform: scale(1.1);
overflow: visible
}
// generated with https://codepen.io/sosuke/pen/Pjoqqp
// colors taken from https://github.com/orgs/community/discussions/16925
.octicon-info {
filter: invert(55%) sepia(55%) saturate(2060%) hue-rotate(191deg) brightness(99%) contrast(93%);
}
.octicon-tip {
filter: invert(58%) sepia(64%) saturate(351%) hue-rotate(73deg) brightness(89%) contrast(90%);
}
.octicon-important {
filter: invert(67%) sepia(41%) saturate(6791%) hue-rotate(225deg) brightness(92%) contrast(92%);
}
.octicon-caution {
filter: invert(45%) sepia(68%) saturate(2586%) hue-rotate(333deg) brightness(95%) contrast(88%);
}
.octicon-warning {
filter: invert(78%) sepia(17%) saturate(5107%) hue-rotate(350deg) brightness(85%) contrast(78%);
}
How to Use
Include alerts in your markdown files as such:
{% alert tip %}
This is a tip!
{% endalert %}
{% alert important %}
This is important!
{% endalert %}
{% alert warning %}
This is a warning!
{% endalert %}
Tip
This is a tip!
Important
This is important!
Warning
This is a warning!