poops 1.0.18 → 1.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +71 -2
  2. package/lib/copy.js +121 -0
  3. package/lib/markups.js +226 -143
  4. package/lib/styles.js +65 -24
  5. package/lib/utils/helpers.js +197 -3
  6. package/package.json +8 -3
  7. package/poops.js +12 -1
  8. package/.eslintrc.yml +0 -10
  9. package/.github/dependabot.yml +0 -9
  10. package/.github/workflows/npm_publish.yml +0 -17
  11. package/.nojekyll +0 -1
  12. package/changelog/blog-functionality.html +0 -58
  13. package/changelog/feed.rss +0 -31
  14. package/changelog/front-matter.html +0 -61
  15. package/changelog/index.html +0 -74
  16. package/changelog/markdown-support.html +0 -56
  17. package/example/dist/css/styles.css +0 -7172
  18. package/example/dist/css/styles.css.map +0 -1
  19. package/example/dist/css/styles.min.css +0 -2
  20. package/example/dist/js/scripts.js +0 -35
  21. package/example/dist/js/scripts.js.map +0 -7
  22. package/example/dist/js/scripts.min.js +0 -2
  23. package/example/src/js/main.ts +0 -28
  24. package/example/src/js/scripts/utils.ts +0 -16
  25. package/example/src/markup/_data/features.yaml +0 -9
  26. package/example/src/markup/_data/links.json +0 -10
  27. package/example/src/markup/_data/poops.yaml +0 -7
  28. package/example/src/markup/_layouts/blog.html +0 -35
  29. package/example/src/markup/_layouts/default.html +0 -93
  30. package/example/src/markup/_partials/heading.html +0 -10
  31. package/example/src/markup/_partials/site-header.html +0 -17
  32. package/example/src/markup/changelog/blog-functionality.md +0 -9
  33. package/example/src/markup/changelog/feed.rss +0 -23
  34. package/example/src/markup/changelog/front-matter.md +0 -12
  35. package/example/src/markup/changelog/index.html +0 -30
  36. package/example/src/markup/changelog/markdown-support.md +0 -7
  37. package/example/src/markup/index.html +0 -33
  38. package/example/src/scss/_config.scss +0 -22
  39. package/example/src/scss/index.scss +0 -4
  40. package/example/src/scss/style/index.scss +0 -13
  41. package/example/src/scss/style/test.css +0 -3
  42. package/index.html +0 -166
  43. package/poop.png +0 -0
  44. package/script/build +0 -3
  45. package/script/publish +0 -138
  46. package/script/server +0 -3
  47. package/test.html +0 -96
  48. package/tsconfig.json +0 -16
  49. package//360/237/222/251.json +0 -55
@@ -1,5 +1,7 @@
1
1
  const fs = require('node:fs')
2
+ const glob = require('glob')
2
3
  const path = require('node:path')
4
+ const frontMatterCache = new Map()
3
5
 
4
6
  function pathExists() {
5
7
  return fs.existsSync(path.join(...arguments))
@@ -9,9 +11,13 @@ function pathIsDirectory() {
9
11
  return fs.lstatSync(path.join(...arguments)).isDirectory()
10
12
  }
11
13
 
14
+ function mkDir(dirPath) {
15
+ if (!fs.existsSync(dirPath)) fs.mkdirSync(dirPath, { recursive: true })
16
+ }
17
+
12
18
  function mkPath(filePath) {
13
19
  const dirPath = path.dirname(filePath)
14
- if (!fs.existsSync(dirPath)) fs.mkdirSync(dirPath, { recursive: true })
20
+ mkDir(dirPath)
15
21
  }
16
22
 
17
23
  function pathForFile(filePath) {
@@ -74,7 +80,66 @@ function readJsonFile(filePath) {
74
80
  }
75
81
 
76
82
  function readYamlFile(filePath) {
77
- return require('yaml').parse(fs.readFileSync(filePath, 'utf8'))
83
+ try {
84
+ return require('yaml').parse(fs.readFileSync(filePath, 'utf8'))
85
+ } catch (e) {
86
+ console.error(`Error reading YAML file at ${filePath}:`, e)
87
+ return null
88
+ }
89
+ }
90
+
91
+ function parseFrontMatter(filePath) {
92
+ let stat
93
+ try {
94
+ stat = fs.statSync(filePath)
95
+ } catch (e) {
96
+ throw new Error(`Error stating file at ${filePath}: ${e.message}`)
97
+ }
98
+
99
+ const cached = frontMatterCache.get(filePath)
100
+ if (cached && cached.mtimeMs === stat.mtimeMs && cached.size === stat.size) {
101
+ return { frontMatter: { ...cached.value.frontMatter }, content: cached.value.content }
102
+ }
103
+
104
+ let content = ''
105
+ try {
106
+ content = fs.readFileSync(filePath, 'utf8')
107
+ } catch (e) {
108
+ throw new Error(`Error reading file at ${filePath}: ${e.message}`)
109
+ }
110
+
111
+ if (!content) {
112
+ throw new Error(`File at ${filePath} is empty`)
113
+ }
114
+
115
+ const frontMatterRegex = /^\s*---\s*[\r\n]+([\s\S]*?)\s*---\s*[\r\n]+/
116
+ const match = content.match(frontMatterRegex)
117
+
118
+ if (!match) {
119
+ const value = { frontMatter: {}, content }
120
+ frontMatterCache.set(filePath, { mtimeMs: stat.mtimeMs, size: stat.size, value })
121
+ return { frontMatter: {}, content }
122
+ }
123
+
124
+ let frontMatter = {}
125
+ try {
126
+ frontMatter = require('yaml').parse(match[1])
127
+ } catch (e) {
128
+ throw new Error(`Error parsing front matter in file at ${filePath}: ${e.message}`)
129
+ }
130
+
131
+ const contentWithoutFrontMatter = content.slice(match[0].length)
132
+ const value = { frontMatter, content: contentWithoutFrontMatter }
133
+ frontMatterCache.set(filePath, { mtimeMs: stat.mtimeMs, size: stat.size, value })
134
+ return { frontMatter: { ...frontMatter }, content: contentWithoutFrontMatter }
135
+ }
136
+
137
+ function clearFrontMatterCache(filePath) {
138
+ if (!filePath) {
139
+ frontMatterCache.clear()
140
+ return
141
+ }
142
+ frontMatterCache.delete(filePath)
78
143
  }
79
144
 
80
145
  function readDataFile(filePath) {
@@ -106,9 +171,134 @@ function deleteDirectory(directory) {
106
171
  fs.rmdirSync(directory)
107
172
  }
108
173
 
174
+ function copyDirectory(src, dest) {
175
+ if (!pathExists(src)) return
176
+
177
+ if (!pathIsDirectory(src)) {
178
+ fs.copyFileSync(src, dest)
179
+ return
180
+ }
181
+
182
+ mkDir(dest)
183
+
184
+ const entries = fs.readdirSync(src, { withFileTypes: true })
185
+
186
+ for (const entry of entries) {
187
+ const srcPath = path.join(src, entry.name)
188
+ const destPath = path.join(dest, entry.name)
189
+
190
+ if (entry.isDirectory()) {
191
+ copyDirectory(srcPath, destPath)
192
+ } else {
193
+ fs.copyFileSync(srcPath, destPath)
194
+ }
195
+ }
196
+ }
197
+
198
+ function convertGlobToRegex(glob) {
199
+ let regexString = ''
200
+ const charMap = {
201
+ '*': '[^\\/\\\\]*',
202
+ '?': '[^\\/\\\\]',
203
+ '!': '^',
204
+ '{': '(',
205
+ '}': ')',
206
+ ',': '|',
207
+ '.': '\\.',
208
+ '-': '\\-',
209
+ // eslint-disable-next-line quote-props
210
+ '$': '\\$',
211
+ '+': '\\+',
212
+ '/': '\\/',
213
+ '\\': '\\\\'
214
+ }
215
+ let insideSquareBrackets = false
216
+ let insideCurlyBraces = false
217
+
218
+ for (let i = 0; i < glob.length; i++) {
219
+ const char = glob[i]
220
+ // eslint-disable-next-line no-prototype-builtins
221
+ if (charMap.hasOwnProperty(char)) {
222
+ let currentChar = charMap[char]
223
+ switch (char) {
224
+ case '{':
225
+ insideCurlyBraces = true
226
+ break
227
+ case '}':
228
+ insideCurlyBraces = false
229
+ break
230
+ case '!':
231
+ if (!insideSquareBrackets) currentChar = '\\!' // Escape '!' outside square brackets
232
+ break
233
+ case ',':
234
+ if (!insideCurlyBraces) currentChar = '\\,' // Escape ',' outside curly braces
235
+ break
236
+ case '-':
237
+ if (insideSquareBrackets) currentChar = char // Don't escape '-' inside square brackets
238
+ break
239
+ }
240
+ regexString += currentChar
241
+ } else {
242
+ switch (char) {
243
+ case '[':
244
+ insideSquareBrackets = true
245
+ break
246
+ case ']':
247
+ insideSquareBrackets = false
248
+ break
249
+ }
250
+ regexString += char
251
+ }
252
+ }
253
+
254
+ let re = null
255
+
256
+ try {
257
+ re = new RegExp(regexString)
258
+ } catch (e) {
259
+ // Invalid regex
260
+ }
261
+
262
+ return re
263
+ }
264
+
265
+ function removeDirNavWildcards(filePath) {
266
+ return path.normalize(filePath).replace(/(\.\.\/|\.\/|\/\.\.|\.\.\\|\.\\|\\\.\.)/g, '')
267
+ }
268
+
269
+ function pathContainsPathSegment(filePath, segment) {
270
+ segment = removeDirNavWildcards(segment)
271
+ if (glob.hasMagic(segment)) {
272
+ segment = convertGlobToRegex(segment)
273
+ if (!segment) return false
274
+ return segment.test(filePath)
275
+ } else {
276
+ return filePath.includes(segment)
277
+ }
278
+ }
279
+
280
+ function doesFileBelongToPath(filePath, configPaths) {
281
+ if (!configPaths) return false
282
+ if (!Array.isArray(configPaths)) configPaths = [configPaths]
283
+ for (const configPath of configPaths) {
284
+ if (!configPath.in) continue
285
+ const configInPaths = Array.isArray(configPath.in) ? configPath.in : [configPath.in]
286
+ for (const inPath of configInPaths) {
287
+ if (pathContainsPathSegment(filePath, inPath)) {
288
+ return {
289
+ in: inPath,
290
+ out: configPath.out || null
291
+ }
292
+ }
293
+ }
294
+ }
295
+ return false
296
+ }
297
+
109
298
  module.exports = {
110
299
  pathExists,
111
300
  pathIsDirectory,
301
+ mkDir,
112
302
  mkPath,
113
303
  pathForFile,
114
304
  insertMinSuffix,
@@ -121,5 +311,9 @@ module.exports = {
121
311
  readYamlFile,
122
312
  readDataFile,
123
313
  deleteDirectoryContents,
124
- deleteDirectory
314
+ deleteDirectory,
315
+ copyDirectory,
316
+ doesFileBelongToPath,
317
+ parseFrontMatter,
318
+ clearFrontMatterCache
125
319
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "poops",
3
3
  "description": "Straightforward, no-bullshit bundler for the web.",
4
- "version": "1.0.18",
4
+ "version": "1.0.20",
5
5
  "license": "MIT",
6
6
  "main": "poops.js",
7
7
  "repository": {
@@ -12,6 +12,10 @@
12
12
  "poops": "poops.js",
13
13
  "💩": "poops.js"
14
14
  },
15
+ "files": [
16
+ "poops.js",
17
+ "lib/"
18
+ ],
15
19
  "author": "Stamat <@stamat> (http://stamat.info)",
16
20
  "homepage": "https://github.com/stamat/poops",
17
21
  "private": false,
@@ -26,13 +30,14 @@
26
30
  "static-site-generator"
27
31
  ],
28
32
  "scripts": {
33
+ "build": "node ./poops.js -b",
29
34
  "lint": "eslint ./poops.js"
30
35
  },
31
36
  "dependencies": {
32
37
  "chokidar": "^3.5.3",
33
38
  "connect": "^3.7.0",
34
39
  "deepmerge": "^4.3.1",
35
- "esbuild": "^0.19.3",
40
+ "esbuild": "^0.25.0",
36
41
  "glob": "^10.3.1",
37
42
  "livereload": "^0.9.3",
38
43
  "marked": "^9.0.3",
@@ -49,6 +54,6 @@
49
54
  "eslint-plugin-import": "^2.26.0",
50
55
  "eslint-plugin-n": "^16.0.0",
51
56
  "eslint-plugin-promise": "^6.1.1",
52
- "sulphuris": "^1.0.5"
57
+ "sulphuris": "^2.0.0"
53
58
  }
54
59
  }
package/poops.js CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  const chokidar = require('chokidar')
4
4
  const connect = require('connect')
5
+ const Copy = require('./lib/copy.js')
5
6
  const helpers = require('./lib/utils/helpers.js')
6
7
  const http = require('node:http')
7
8
  const livereload = require('livereload')
@@ -13,7 +14,7 @@ const PrintStyle = require('./lib/utils/print-style.js')
13
14
  const Styles = require('./lib/styles.js')
14
15
  const portscanner = require('portscanner')
15
16
 
16
- const { pathExists } = helpers
17
+ const { pathExists, doesFileBelongToPath } = helpers
17
18
 
18
19
  const cwd = process.cwd() // Current Working Directory
19
20
  const pkg = require('./package.json')
@@ -100,11 +101,13 @@ async function poops() {
100
101
  const styles = new Styles(config)
101
102
  const scripts = new Scripts(config)
102
103
  const markups = new Markups(config)
104
+ const copy = new Copy(config)
103
105
 
104
106
  if (build || (!config.watch && !config.livereload && !config.serve)) {
105
107
  await styles.compile()
106
108
  await scripts.compile()
107
109
  await markups.compile()
110
+ await copy.execute()
108
111
  process.exit(0)
109
112
  }
110
113
 
@@ -134,6 +137,7 @@ async function poops() {
134
137
  await styles.compile()
135
138
  await scripts.compile()
136
139
  await markups.compile()
140
+ await copy.execute()
137
141
 
138
142
  if (config.watch) {
139
143
  // TODO: think about watching the updates of the config file itself, we can reload the config and recompile everything.
@@ -149,14 +153,21 @@ async function poops() {
149
153
  markups.compile()
150
154
  })
151
155
  }
156
+
157
+ doesFileBelongToPath(file, config.copy) && copy.execute()
152
158
  }).on('unlink', (file) => {
153
159
  if (/(\.html|\.xml|\.rss|\.atom|\.njk|\.md)$/i.test(file)) markups.compile()
160
+ copy.unlink(file, doesFileBelongToPath(file, config.copy))
161
+ }).on('unlinkDir', (path) => {
162
+ doesFileBelongToPath(path, config.markup) && markups.compile()
163
+ copy.unlink(path, doesFileBelongToPath(path, config.copy))
154
164
  }).on('add', (file) => {
155
165
  if (/(\.json|\.ya?ml)$/i.test(file)) {
156
166
  markups.reloadDataFiles().then(() => {
157
167
  markups.compile()
158
168
  })
159
169
  }
170
+ doesFileBelongToPath(file, config.copy) && copy.execute()
160
171
  })
161
172
  }
162
173
  }
package/.eslintrc.yml DELETED
@@ -1,10 +0,0 @@
1
- env:
2
- browser: true
3
- commonjs: true
4
- es2021: true
5
- extends: standard
6
- parserOptions:
7
- ecmaVersion: latest
8
- rules: {
9
- space-before-function-paren: ["error", "never"],
10
- }
@@ -1,9 +0,0 @@
1
- version: 2
2
- updates:
3
- # Maintain dependencies for npm
4
- - package-ecosystem: "npm"
5
- directory: "/"
6
- schedule:
7
- interval: "monthly"
8
- allow:
9
- - dependency-type: "production"
@@ -1,17 +0,0 @@
1
- name: NPM Publish
2
- on:
3
- release:
4
- types: [published]
5
- jobs:
6
- build:
7
- runs-on: ubuntu-latest
8
- steps:
9
- - uses: actions/checkout@v3
10
- # Setup .npmrc file to publish to npm
11
- - uses: actions/setup-node@v3
12
- with:
13
- node-version: '16.x'
14
- - name: Publish to npm registry
15
- run: |
16
- echo "//registry.npmjs.org/:_authToken=\${{ secrets.NPM_TOKEN }}" >> .npmrc
17
- npm publish
package/.nojekyll DELETED
@@ -1 +0,0 @@
1
-
@@ -1,58 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <title>Blog Functionality | 💩 Poops</title>
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
- <meta name="description" content="Hey folks, this is my second blog post.">
8
- <link rel="alternate" type="application/rss+xml" href="https://stamat.github.io/poops/changelog/feed.rss">
9
- <link rel="preconnect" href="https://fonts.googleapis.com">
10
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="../example/dist/css/styles.min.css">
12
- <link href="https://fonts.googleapis.com/css2?family=DM+Sans&family=Poppins:wght@700&display=swap" rel="stylesheet">
13
- <script src="https://cdn.jsdelivr.net/npm/canvas-confetti@1.5.1/dist/confetti.browser.min.js"></script>
14
- <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/atom-one-dark.min.css">
15
- <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
16
- </head>
17
- <body class="bg-brownish">
18
-
19
- <header class="py-8">
20
- <div class="container d-flex justify-space-between align-center h-48">
21
-
22
- <a href="../" class="d-flex flex-row align-center text-primary text-none text-bold font-heading h6" style="letter-spacing: -.045rem;">
23
- <img src="../poop.png" class="d-block mr-8" alt="Poops" width="48" height="48">
24
- POOPS
25
- </a>
26
-
27
-
28
- <nav class="ml-auto">
29
-
30
- <a href="../changelog" class="text-none text-bold d-inline-block ml-lg-16 font-heading">Changelog</a>
31
-
32
- <a href="https://github.com/stamat/poops#readme" class="text-none text-bold d-inline-block ml-lg-16 font-heading">Docs</a>
33
-
34
- <a href="https://github.com/stamat/poops" class="d-inline-block ml-lg-16"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" class="w-24 h-24" style="vertical-align: middle"><path d="M8 0c4.42 0 8 3.58 8 8a8.013 8.013 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27-.68 0-1.36.09-2 .27-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8Z"></path></svg></a>
35
- </nav>
36
- </div>
37
- </header>
38
-
39
-
40
- <div class="container">
41
-
42
- <h1>Blog Functionality</h1>
43
- <p> Hey folks, this is my second blog post.</p>
44
-
45
-
46
- </div>
47
-
48
-
49
- <script>document.write('<script src="http://'
50
- + (location.host || 'localhost').split(':')[0]
51
- + ':35730/livereload.js?snipver=1"></'
52
- + 'script>')</script>
53
-
54
-
55
- <script>hljs.highlightAll();</script>
56
- <script async type="text/javascript" src="../example/dist/js/scripts.min.js"></script>
57
- </body>
58
- </html>
@@ -1,31 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8" ?>
2
- <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
3
- <channel>
4
- <title>Changelog | 💩 Poops</title>
5
- <description>Straightforward, no-bullshit bundler for the web.</description>
6
- <link>https://stamat.github.io/poops</link>
7
- <atom:link href="https://stamat.github.io/poops/changelog/feed.rss" rel="self" type="application/rss+xml" />
8
- <lastBuildDate>Thu, 12 Oct 2023 18:19:14 +0200</lastBuildDate>
9
-
10
- <pubDate>Thu, 12 Oct 2023 16:10:00 +0200</pubDate>
11
- <ttl>1800</ttl>
12
-
13
-
14
- <item>
15
- <title>Blog Functionality</title>
16
- <guid isPermaLink="true">https://stamat.github.io/poops/changelog/blog-functionality.html</guid>
17
- <link>https://stamat.github.io/poops/changelog/blog-functionality.html</link>
18
- <description>Hey folks, this is my second blog post.</description>
19
- <pubDate>Thu, 12 Oct 2023 16:10:00 +0200</pubDate>
20
- </item>
21
-
22
- <item>
23
- <title>Added Front Matter support!</title>
24
- <guid isPermaLink="true">https://stamat.github.io/poops/changelog/front-matter.html</guid>
25
- <link>https://stamat.github.io/poops/changelog/front-matter.html</link>
26
- <description>Front matter is an awesome idea! Since the static site generator functionality of Poops is inspired by Jekyll and the genius of peeps that came up with the idea of front matter, I decided to add it to Poops as well. Made things super simple! And that's what Poops is all about. Making things simple.</description>
27
- <pubDate>Tue, 19 Sep 2023 02:00:00 +0200</pubDate>
28
- </item>
29
-
30
- </channel>
31
- </rss>
@@ -1,61 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <title>Added Front Matter support! | 💩 Poops</title>
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
- <meta name="description" content="Front matter is an awesome idea! Since the static site generator functionality of Poops is inspired by Jekyll and the genius of peeps that came up with the idea of front matter, I decided to add it to Poops as well. Made things super simple! And that's what Poops is all about. Making things simple.">
8
- <link rel="alternate" type="application/rss+xml" href="https://stamat.github.io/poops/changelog/feed.rss">
9
- <link rel="preconnect" href="https://fonts.googleapis.com">
10
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="../example/dist/css/styles.min.css">
12
- <link href="https://fonts.googleapis.com/css2?family=DM+Sans&family=Poppins:wght@700&display=swap" rel="stylesheet">
13
- <script src="https://cdn.jsdelivr.net/npm/canvas-confetti@1.5.1/dist/confetti.browser.min.js"></script>
14
- <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/atom-one-dark.min.css">
15
- <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
16
- </head>
17
- <body class="bg-brownish">
18
-
19
- <header class="py-8">
20
- <div class="container d-flex justify-space-between align-center h-48">
21
-
22
- <a href="../" class="d-flex flex-row align-center text-primary text-none text-bold font-heading h6" style="letter-spacing: -.045rem;">
23
- <img src="../poop.png" class="d-block mr-8" alt="Poops" width="48" height="48">
24
- POOPS
25
- </a>
26
-
27
-
28
- <nav class="ml-auto">
29
-
30
- <a href="../changelog" class="text-none text-bold d-inline-block ml-lg-16 font-heading">Changelog</a>
31
-
32
- <a href="https://github.com/stamat/poops#readme" class="text-none text-bold d-inline-block ml-lg-16 font-heading">Docs</a>
33
-
34
- <a href="https://github.com/stamat/poops" class="d-inline-block ml-lg-16"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" class="w-24 h-24" style="vertical-align: middle"><path d="M8 0c4.42 0 8 3.58 8 8a8.013 8.013 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27-.68 0-1.36.09-2 .27-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8Z"></path></svg></a>
35
- </nav>
36
- </div>
37
- </header>
38
-
39
-
40
- <div class="container">
41
-
42
- <h1>Added Front Matter support!</h1>
43
- <blockquote>
44
- <p>Front matter is an awesome idea! Since the static site generator functionality of Poops is inspired by Jekyll and the genius of peeps that came up with the idea of front matter, I decided to add it to Poops as well. Made things super simple! And that's what Poops is all about. Making things simple.</p>
45
- </blockquote>
46
- <p>Adding Front Matter was a breeze. Seriously.</p>
47
-
48
-
49
- </div>
50
-
51
-
52
- <script>document.write('<script src="http://'
53
- + (location.host || 'localhost').split(':')[0]
54
- + ':35730/livereload.js?snipver=1"></'
55
- + 'script>')</script>
56
-
57
-
58
- <script>hljs.highlightAll();</script>
59
- <script async type="text/javascript" src="../example/dist/js/scripts.min.js"></script>
60
- </body>
61
- </html>
@@ -1,74 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <title>Changelog | 💩 Poops</title>
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
- <meta name="description" content="Follow the latest changes of Poops.">
8
- <link rel="alternate" type="application/rss+xml" href="https://stamat.github.io/poops/changelog/feed.rss">
9
- <link rel="preconnect" href="https://fonts.googleapis.com">
10
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="../example/dist/css/styles.min.css">
12
- <link href="https://fonts.googleapis.com/css2?family=DM+Sans&family=Poppins:wght@700&display=swap" rel="stylesheet">
13
- <script src="https://cdn.jsdelivr.net/npm/canvas-confetti@1.5.1/dist/confetti.browser.min.js"></script>
14
- <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/atom-one-dark.min.css">
15
- <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
16
- </head>
17
- <body class="bg-brownish">
18
-
19
- <header class="py-8">
20
- <div class="container d-flex justify-space-between align-center h-48">
21
-
22
- <a href="../" class="d-flex flex-row align-center text-primary text-none text-bold font-heading h6" style="letter-spacing: -.045rem;">
23
- <img src="../poop.png" class="d-block mr-8" alt="Poops" width="48" height="48">
24
- POOPS
25
- </a>
26
-
27
-
28
- <nav class="ml-auto">
29
-
30
- <a href="../changelog" class="text-underline text-bold d-inline-block ml-lg-16 font-heading">Changelog</a>
31
-
32
- <a href="https://github.com/stamat/poops#readme" class="text-none text-bold d-inline-block ml-lg-16 font-heading">Docs</a>
33
-
34
- <a href="https://github.com/stamat/poops" class="d-inline-block ml-lg-16"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" class="w-24 h-24" style="vertical-align: middle"><path d="M8 0c4.42 0 8 3.58 8 8a8.013 8.013 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27-.68 0-1.36.09-2 .27-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8Z"></path></svg></a>
35
- </nav>
36
- </div>
37
- </header>
38
-
39
-
40
- <div class="container">
41
-
42
- <div class="text-center">
43
- <h1>Changelog</h1>
44
- </div>
45
-
46
- <div class="post">
47
- <h2><a href="../changelog/blog-functionality.html">Blog Functionality</a></h2>
48
- <div class="date">Oct 12, 2023</div>
49
- Hey folks, this is my second blog post.
50
- </div>
51
-
52
- <div class="post">
53
- <h2><a href="../changelog/front-matter.html">Added Front Matter support!</a></h2>
54
- <div class="date">Sep 19, 2023</div>
55
- Front matter is an awesome idea! Since the static site generator functionality of Poops is inspired by Jekyll and the genius of peeps that came up with the idea of front matter, I decided to add it to Poops as well. Made things super simple! And that's what Poops is all about. Making things simple.
56
- </div>
57
-
58
-
59
-
60
-
61
-
62
- </div>
63
-
64
-
65
- <script>document.write('<script src="http://'
66
- + (location.host || 'localhost').split(':')[0]
67
- + ':35730/livereload.js?snipver=1"></'
68
- + 'script>')</script>
69
-
70
-
71
- <script>hljs.highlightAll();</script>
72
- <script async type="text/javascript" src="../example/dist/js/scripts.min.js"></script>
73
- </body>
74
- </html>
@@ -1,56 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <title>Markdown Support | 💩 Poops</title>
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
- <meta name="description" content="Hey folks, this is my second blog post.">
8
- <link rel="alternate" type="application/rss+xml" href="https://stamat.github.io/poops/changelog/feed.rss">
9
- <link rel="preconnect" href="https://fonts.googleapis.com">
10
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="../example/dist/css/styles.min.css">
12
- <link href="https://fonts.googleapis.com/css2?family=DM+Sans&family=Poppins:wght@700&display=swap" rel="stylesheet">
13
- <script src="https://cdn.jsdelivr.net/npm/canvas-confetti@1.5.1/dist/confetti.browser.min.js"></script>
14
- <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/atom-one-dark.min.css">
15
- <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
16
- </head>
17
- <body class="bg-brownish">
18
-
19
- <header class="py-8">
20
- <div class="container d-flex justify-space-between align-center h-48">
21
-
22
- <a href="../" class="d-flex flex-row align-center text-primary text-none text-bold font-heading h6" style="letter-spacing: -.045rem;">
23
- <img src="../poop.png" class="d-block mr-8" alt="Poops" width="48" height="48">
24
- POOPS
25
- </a>
26
-
27
-
28
- <nav class="ml-auto">
29
-
30
- <a href="../changelog" class="text-none text-bold d-inline-block ml-lg-16 font-heading">Changelog</a>
31
-
32
- <a href="https://github.com/stamat/poops#readme" class="text-none text-bold d-inline-block ml-lg-16 font-heading">Docs</a>
33
-
34
- <a href="https://github.com/stamat/poops" class="d-inline-block ml-lg-16"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" class="w-24 h-24" style="vertical-align: middle"><path d="M8 0c4.42 0 8 3.58 8 8a8.013 8.013 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27-.68 0-1.36.09-2 .27-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8Z"></path></svg></a>
35
- </nav>
36
- </div>
37
- </header>
38
-
39
-
40
- <div class="container">
41
-
42
-
43
-
44
- </div>
45
-
46
-
47
- <script>document.write('<script src="http://'
48
- + (location.host || 'localhost').split(':')[0]
49
- + ':35730/livereload.js?snipver=1"></'
50
- + 'script>')</script>
51
-
52
-
53
- <script>hljs.highlightAll();</script>
54
- <script async type="text/javascript" src="../example/dist/js/scripts.min.js"></script>
55
- </body>
56
- </html>