Skip to content

Commit 79d6bae

Browse files
author
Simon Schubert
committed
Add js/css minifier
1 parent df25091 commit 79d6bae

7 files changed

Lines changed: 781 additions & 5 deletions

File tree

common/src/jvmMain/kotlin/com/linuxcommandlibrary/shared/Platform.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.linuxcommandlibrary.shared
22

3+
import app.cash.sqldelight.db.SqlDriver
4+
import app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver
35
import com.linuxcommandlibrary.CommandDatabase
4-
import com.squareup.sqldelight.db.SqlDriver
5-
import com.squareup.sqldelight.sqlite.driver.JdbcSqliteDriver
66
import java.io.File
77
import java.io.IOException
88
import java.util.Properties
@@ -25,7 +25,7 @@ import java.util.Properties
2525
actual var databaseHelper = DatabaseHelper()
2626

2727
fun initDatabase() {
28-
val databaseFile = EmptyClass::class.java.classLoader.getResource("database.db")?.toURI()
28+
val databaseFile = EmptyClass::class.java.classLoader?.getResource("database.db")?.toURI()
2929
val driver: SqlDriver = JdbcSqliteDriver("jdbc:sqlite::resource:$databaseFile")
3030
if (!File("assets/database.db").exists()) {
3131
CommandDatabase.Schema.create(driver)
@@ -36,7 +36,7 @@ fun initDatabase() {
3636
fun getCurrentVersion(): String {
3737
val prop = Properties()
3838
try {
39-
val input = EmptyClass::class.java.classLoader.getResource("application.properties")
39+
val input = EmptyClass::class.java.classLoader?.getResource("application.properties")
4040
prop.load(input?.openStream())
4141
} catch (io: IOException) {
4242
io.printStackTrace()
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.linuxcommandlibrary.desktop
2+
3+
import java.io.File
4+
import java.nio.file.Files
5+
6+
class Minifier {
7+
8+
fun minifyScriptsAndSheets(isRelease: Boolean) {
9+
val scriptsDir = File("html/scripts")
10+
scriptsDir.mkdir()
11+
val scripts = File("desktop/src/main/resources/scripts")
12+
scripts.listFiles()?.forEach {
13+
if (it.isFile) {
14+
val file = File(scriptsDir, it.name)
15+
file.delete()
16+
if (isRelease) {
17+
val minified = minifyJS(it.readText())
18+
file.writeText(minified)
19+
} else {
20+
Files.createLink(file.toPath(), it.toPath())
21+
}
22+
}
23+
}
24+
val styleSheetsDir = File("html/stylesheets")
25+
styleSheetsDir.mkdir()
26+
val stylesheets = File("desktop/src/main/resources/stylesheets")
27+
stylesheets.listFiles()?.forEach {
28+
if (it.isFile) {
29+
val file = File(styleSheetsDir, it.name)
30+
file.delete()
31+
if (isRelease) {
32+
val minified = minifyCSS(it.readText())
33+
file.writeText(minified)
34+
} else {
35+
Files.createLink(file.toPath(), it.toPath())
36+
}
37+
}
38+
}
39+
}
40+
41+
private fun minifyCSS(css: String): String = css.replaceWhiteSpacesBeforeAndAfter(";")
42+
.replaceWhiteSpacesBeforeAndAfter("}")
43+
.replaceWhiteSpacesBeforeAndAfter("\\{")
44+
.replaceWhiteSpacesBeforeAndAfter(":")
45+
.replaceWhiteSpacesBeforeAndAfter(",")
46+
47+
private fun minifyJS(js: String): String = js.replace("[\\n\\s].?//.*\\n".toRegex(), "") // will break if comment is after code
48+
.replaceWhiteSpacesBeforeAndAfter(";")
49+
.replaceWhiteSpacesBeforeAndAfter("}")
50+
.replaceWhiteSpacesBeforeAndAfter("\\{")
51+
.replaceWhiteSpacesBeforeAndAfter("=")
52+
.replaceWhiteSpacesBeforeAndAfter("<")
53+
.replaceWhiteSpacesBeforeAndAfter("-")
54+
.replaceWhiteSpacesBeforeAndAfter(",")
55+
.replaceWhiteSpacesBeforeAndAfter("\\+")
56+
.replaceWhiteSpacesBeforeAndAfter("\\(")
57+
.replaceWhiteSpacesBeforeAndAfter("\\)")
58+
.replaceWhiteSpacesBeforeAndAfter("\\&")
59+
.replaceWhiteSpacesBeforeAndAfter("\\>")
60+
61+
private fun String.replaceWhiteSpacesBeforeAndAfter(value: String): String = replace("\\s*$value\\s*".toRegex(), value)
62+
}

desktop/src/main/kotlin/com/linuxcommandlibrary/desktop/WebsiteBuilder.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@ import java.util.Locale
7777
fun main() {
7878
initDatabase()
7979

80+
val minifier = Minifier()
81+
minifier.minifyScriptsAndSheets(true)
82+
return
83+
8084
val websiteBuilder = WebsiteBuilder()
8185

8286
val folder = File("html")
@@ -91,6 +95,8 @@ fun main() {
9195
websiteBuilder.create404HtmlFile()
9296

9397
websiteBuilder.createSitemap(folder)
98+
99+
minifier.minifyScriptsAndSheets(true)
94100
}
95101

96102
class WebsiteBuilder {
@@ -152,7 +158,7 @@ class WebsiteBuilder {
152158
id = "search"
153159
onKeyUp = "search()"
154160
placeholder = "Search for commands"
155-
autoComplete = false
161+
autoComplete = "false"
156162
}
157163
}
158164
div {
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
var timeout;
2+
3+
function copy(text) {
4+
var inp = document.createElement('input');
5+
document.body.appendChild(inp);
6+
inp.value = unEscapeHtml(text);
7+
inp.select();
8+
document.execCommand('copy', false);
9+
inp.remove();
10+
11+
clearTimeout(timeout);
12+
hide();
13+
timeout = setTimeout(function() {
14+
hide();
15+
}, 1500);
16+
setTimeout(function() {
17+
show();
18+
}, 100);
19+
}
20+
21+
function show() {
22+
var element = document.getElementsByClassName("tooltip")[0];
23+
element.classList.remove("hidden");
24+
element.classList.add("visible");
25+
}
26+
27+
function hide() {
28+
var element = document.getElementsByClassName("tooltip")[0];
29+
element.classList.remove("visible");
30+
element.classList.add("hidden");
31+
}
32+
33+
function unEscapeHtml(unsafe) {
34+
return unsafe
35+
.replace(/&amp;/g, "&")
36+
.replace(/&lt;/g, "<")
37+
.replace(/&gt;/g, ">")
38+
.replace(/&quot;/g, "\"")
39+
.replace(/&#039;/g, "'")
40+
.replace(/&#47;/g, "index.html")
41+
.replace(/\\/g, "\\\\");
42+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
var accordionButtons = document.getElementsByClassName("accordion-button");
2+
var toggleAllButton = document.getElementsByClassName("toggle-all-button")[0];
3+
4+
function togglePanel(param) {
5+
param.classList.toggle("active");
6+
updatePanel(param);
7+
8+
if (allCollapsed()) {
9+
toggleAllButton.classList.remove("active");
10+
toggleAllButton.classList.add("active");
11+
toggleAllButton.innerText = "EXPAND ALL";
12+
} else if (isAnyExpanded()) {
13+
toggleAllButton.classList.remove("active");
14+
toggleAllButton.innerText = "COLLAPSE ALL";
15+
}
16+
}
17+
18+
function toggleAll(param) {
19+
param.classList.toggle("active");
20+
21+
if (param.classList.contains("active")) {
22+
param.innerText = "EXPAND ALL";
23+
updateList(true);
24+
} else {
25+
param.innerText = "COLLAPSE ALL";
26+
updateList(false);
27+
}
28+
}
29+
30+
function updateList(collapse) {
31+
for (var i = 0; i < accordionButtons.length; i++) {
32+
accordionButtons[i].classList.remove("active");
33+
if (!collapse) {
34+
accordionButtons[i].classList.add("active");
35+
}
36+
updatePanel(accordionButtons[i]);
37+
}
38+
}
39+
40+
function updatePanel(button) {
41+
var panel = button.nextElementSibling;
42+
if (button.classList.contains("active")) {
43+
panel.style.display = "block";
44+
} else {
45+
panel.style.display = "none";
46+
}
47+
}
48+
49+
function isAnyExpanded() {
50+
for (var i = 0; i < accordionButtons.length; i++) {
51+
if (accordionButtons[i].classList.contains("active")) {
52+
return true;
53+
}
54+
}
55+
return false;
56+
}
57+
58+
function allCollapsed() {
59+
for (var i = 0; i < accordionButtons.length; i++) {
60+
if (accordionButtons[i].classList.contains("active")) {
61+
return false;
62+
}
63+
}
64+
return true;
65+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
var input, filter, ul, li, a, i, headers, value, index, lastSearch = "";
2+
3+
window.onload = (event) => {
4+
input = document.getElementById('search');
5+
ul = document.getElementById("commandlist");
6+
li = ul.getElementsByTagName('a');
7+
headers = ul.getElementsByTagName('div');
8+
};
9+
10+
document.addEventListener('keyup', (e) => {
11+
if (e.keyCode == 38) {
12+
focusPreviousTabStop();
13+
} else if (e.keyCode == 40) {
14+
focusNextTabStop();
15+
}
16+
});
17+
18+
function getVisibleTabs() {
19+
var universe = document.querySelectorAll('#commandlist a');
20+
return Array.prototype.filter.call(universe, function(item) {return item.parentNode.style.display !== "none"});
21+
}
22+
23+
function focusNextTabStop() {
24+
var tabs = getVisibleTabs();
25+
var index = tabs.indexOf(document.activeElement);
26+
return (tabs[index + 1] || tabs[0]).focus();
27+
}
28+
29+
function focusPreviousTabStop() {
30+
var tabs = getVisibleTabs();
31+
var index = tabs.indexOf(document.activeElement);
32+
if(index == 0) {
33+
input.focus();
34+
} else {
35+
(tabs[index - 1] || tabs[0]).focus();
36+
}
37+
}
38+
39+
function search(){
40+
return Promise.resolve()
41+
.then(function() {
42+
setTimeout(function() {
43+
filter = input.value.toLowerCase();
44+
if(lastSearch === filter) {
45+
return
46+
}
47+
if(lastSearch === "") {
48+
for (i = 0; i < headers.length; i++) {
49+
headers[i].style.display = "none";
50+
}
51+
}
52+
if(filter === "") {
53+
for (i = 0; i < headers.length; i++) {
54+
headers[i].style.display = "";
55+
}
56+
}
57+
lastSearch = filter;
58+
var numberOfResults = 0;
59+
for (i = 0; i < li.length; i++) {
60+
value = li[i].getAttribute('data-c');
61+
index = value.indexOf(filter);
62+
if (index > -1) {
63+
value = value.substring(0, index) + "<span class='highlight'>" + value.substring(index, index + filter.length) + "</span>" + value.substring(index + filter.length);
64+
li[i].innerHTML = value;
65+
numberOfResults++;
66+
li[i].style.display = "";
67+
} else {
68+
li[i].style.display = "none";
69+
}
70+
}
71+
72+
var noresults = document.getElementById("no-results");
73+
if(numberOfResults == 0) {
74+
noresults.innerHTML = "No commands found for '" + filter + "'";
75+
noresults.style.display = "block";
76+
ul.style.display = "none";
77+
} else {
78+
noresults.style.display = "none";
79+
ul.style.display = "block";
80+
}
81+
}, 0);
82+
});
83+
}

0 commit comments

Comments
 (0)