eksa-framework 3.3.2 → 3.3.3
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.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/_posts/2026-03-15-welcome-to-eksa-framework.md +3 -0
- data/app/views/docs.html.erb +4 -4
- data/app/views/index.html.erb +1 -1
- data/app/views/layout.html.erb +1 -1
- data/app/views/posts/index.html.erb +26 -8
- data/app/views/posts/show.html.erb +25 -5
- data/exe/eksa +18 -3
- data/lib/eksa/markdown_post.rb +12 -0
- data/lib/eksa/version.rb +1 -1
- data/public/img/logo.jpg +0 -0
- metadata +2 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ac242785773ed45e2a702cc824fe9407b322eba723af008c531e5e4b79b3a30c
|
|
4
|
+
data.tar.gz: 28ad3240e9d0cd86d1501ba998512d7e201f5bde405db5be6050c53ff4b56b56
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1fa366903b127fc04b610d065d1e8fb4d15047e7111e7fbf4ab2332c7a2bd82e2f064dd564088db38d9aa07b25bfadf918fa6f1b08cb2318d45d33a97c27d7ac
|
|
7
|
+
data.tar.gz: b1bb528e37369f1df59f5d54d6209fcc7e1b50cf535e421eeeee41a601faddcc64166bc27f10623ac14ab007fd8ee2755383bddef5052c8753e020f1f6a633f6
|
data/README.md
CHANGED
|
@@ -68,8 +68,8 @@ eksa g controller Blog
|
|
|
68
68
|
# Membuat model dan schema database
|
|
69
69
|
eksa g model Post
|
|
70
70
|
|
|
71
|
-
# Membuat postingan blog baru
|
|
72
|
-
eksa g post "Judul Artikel"
|
|
71
|
+
# Membuat postingan blog baru dengan meta tambahan
|
|
72
|
+
eksa g post "Judul Artikel" --category "Kategori" --author "Nama Penulis" --image "url-gambar.jpg"
|
|
73
73
|
```
|
|
74
74
|
|
|
75
75
|
### 3. Markdown Blog Engine
|
data/app/views/docs.html.erb
CHANGED
|
@@ -136,8 +136,8 @@
|
|
|
136
136
|
</h2>
|
|
137
137
|
<p class="text-white/60 mb-4 text-sm">Kelola konten blog dengan file Markdown. Mendukung Front Matter YAML dan rute dinamis.</p>
|
|
138
138
|
<div class="bg-black/40 rounded-2xl p-6 font-mono text-sm border border-white/10">
|
|
139
|
-
<p class="text-white/30"># Buat post baru lewat CLI</p>
|
|
140
|
-
<p class="text-indigo-300">eksa g post "Judul Postingan"</p>
|
|
139
|
+
<p class="text-white/30"># Buat post baru lewat CLI (dengan opsi meta)</p>
|
|
140
|
+
<p class="text-indigo-300">eksa g post "Judul Postingan" --category "Tech" --author "Nama" --image "url.jpg"</p>
|
|
141
141
|
<p class="text-white/30 mt-4"># Akses di URL (Otomatis)</p>
|
|
142
142
|
<p class="text-white/70">/posts/:slug</p>
|
|
143
143
|
</div>
|
|
@@ -155,7 +155,7 @@
|
|
|
155
155
|
<p class="text-white/30"># Build gem lokal</p>
|
|
156
156
|
<p class="text-indigo-300">gem build eksa-framework.gemspec</p>
|
|
157
157
|
<p class="text-white/30 mt-4"># Publish ke RubyGems / GitHub Packages</p>
|
|
158
|
-
<p class="text-indigo-300">gem push eksa-framework-3.3.
|
|
158
|
+
<p class="text-indigo-300">gem push eksa-framework-3.3.3.gem</p>
|
|
159
159
|
</div>
|
|
160
160
|
</section>
|
|
161
161
|
|
|
@@ -164,7 +164,7 @@
|
|
|
164
164
|
<span class="bg-indigo-500/20 text-indigo-300 text-[10px] px-3 py-1 rounded-full border border-indigo-500/30 uppercase tracking-tighter">Rack 3.0 Compatible</span>
|
|
165
165
|
<span class="bg-emerald-500/20 text-emerald-300 text-[10px] px-3 py-1 rounded-full border border-emerald-500/30 uppercase tracking-tighter">SQLite3 Auto-Ready</span>
|
|
166
166
|
</div>
|
|
167
|
-
<p class="text-white/40 text-sm italic">Eksa Framework v3.3.
|
|
167
|
+
<p class="text-white/40 text-sm italic">Eksa Framework v3.3.3 Alpha Documentation</p>
|
|
168
168
|
<a href="/" class="inline-block mt-6 text-indigo-300 hover:text-white transition font-bold flex items-center justify-center gap-2">
|
|
169
169
|
<i data-lucide="arrow-left" class="w-4 h-4"></i> Kembali ke Beranda
|
|
170
170
|
</a>
|
data/app/views/index.html.erb
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<div class="flex flex-col md:flex-row justify-between items-start md:items-center mb-8 gap-4">
|
|
3
3
|
<div>
|
|
4
4
|
<span class="inline-block bg-indigo-500/20 text-indigo-200 text-xs font-bold px-3 py-1 rounded-full mb-3 border border-indigo-500/30">
|
|
5
|
-
v3.3.
|
|
5
|
+
v3.3.3 Alpha
|
|
6
6
|
</span>
|
|
7
7
|
<h1 class="text-4xl font-extrabold tracking-tight">
|
|
8
8
|
Halo, <span class="text-indigo-300"><%= @nama %></span>!
|
data/app/views/layout.html.erb
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"datePublished": (@post.date.is_a?(Time) ? @post.date.iso8601 : @post.date),
|
|
25
25
|
"author": {
|
|
26
26
|
"@type": "Person",
|
|
27
|
-
"name":
|
|
27
|
+
"name": (@post.author && !@post.author.empty?) ? @post.author : 'IshikawaUta'
|
|
28
28
|
},
|
|
29
29
|
"url": current_url,
|
|
30
30
|
"description": @post.body_html[0..160].gsub(/<[^>]*>/, '').strip + "..."
|
|
@@ -19,14 +19,32 @@
|
|
|
19
19
|
</div>
|
|
20
20
|
<% else %>
|
|
21
21
|
<% @posts.each do |post| %>
|
|
22
|
-
<a href="/posts/<%= post.slug %>" class="group block bg-white/5 hover:bg-white/10
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
<
|
|
22
|
+
<a href="/posts/<%= post.slug %>" class="group block bg-white/5 hover:bg-white/10 overflow-hidden rounded-3xl border border-white/10 transition-all hover:scale-[1.02]">
|
|
23
|
+
<% if !post.image.empty? %>
|
|
24
|
+
<div class="h-48 overflow-hidden">
|
|
25
|
+
<img src="<%= post.image %>" alt="<%= post.title %>" class="w-full h-full object-cover group-hover:scale-110 transition-transform duration-500">
|
|
26
|
+
</div>
|
|
27
|
+
<% end %>
|
|
28
|
+
<div class="p-6">
|
|
29
|
+
<div class="flex items-center justify-between mb-4">
|
|
30
|
+
<span class="text-[10px] font-bold text-indigo-300 uppercase tracking-widest px-2 py-1 bg-indigo-500/20 rounded-md border border-indigo-500/30">
|
|
31
|
+
<%= post.category %>
|
|
32
|
+
</span>
|
|
33
|
+
<span class="text-[10px] font-medium text-white/40 uppercase tracking-widest">
|
|
34
|
+
<%= post.date.is_a?(Time) ? post.date.strftime("%d %B %Y") : post.date %>
|
|
35
|
+
</span>
|
|
36
|
+
</div>
|
|
37
|
+
<h2 class="text-2xl font-bold mb-3 group-hover:text-indigo-300 transition-colors"><%= post.title %></h2>
|
|
38
|
+
<div class="flex items-center justify-between mt-6 pt-4 border-t border-white/5">
|
|
39
|
+
<div class="flex items-center gap-2 text-white/60 text-xs">
|
|
40
|
+
<i data-lucide="user" class="w-3 h-3"></i>
|
|
41
|
+
<span><%= post.author.empty? ? "Eksa Dev" : post.author %></span>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="flex items-center gap-1 text-indigo-300 text-xs font-bold">
|
|
44
|
+
<span>Baca</span>
|
|
45
|
+
<i data-lucide="arrow-right" class="w-3 h-3 group-hover:translate-x-1 transition-transform"></i>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
30
48
|
</div>
|
|
31
49
|
</a>
|
|
32
50
|
<% end %>
|
|
@@ -3,11 +3,31 @@
|
|
|
3
3
|
<a href="/posts" class="inline-flex items-center gap-2 text-indigo-300 hover:text-white transition mb-6">
|
|
4
4
|
<i data-lucide="arrow-left" class="w-4 h-4"></i> Kembali ke Blog
|
|
5
5
|
</a>
|
|
6
|
-
<
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
<div class="mb-4 flex items-center gap-3">
|
|
7
|
+
<span class="px-3 py-1 bg-indigo-500/20 rounded-lg border border-indigo-500/30 text-xs font-bold text-indigo-300 uppercase tracking-widest">
|
|
8
|
+
<%= @post.category %>
|
|
9
|
+
</span>
|
|
10
|
+
<span class="text-xs font-medium text-white/40 uppercase tracking-widest">
|
|
11
|
+
<%= @post.date.is_a?(Time) ? @post.date.strftime("%d %B %Y") : @post.date %>
|
|
12
|
+
</span>
|
|
13
|
+
</div>
|
|
14
|
+
<h3 class="text-5xl font-extrabold tracking-tight mb-6 leading-tight"><%= @post.title %></h3>
|
|
15
|
+
|
|
16
|
+
<div class="flex items-center gap-4 mb-8 pb-8 border-b border-white/10">
|
|
17
|
+
<div class="w-10 h-10 rounded-full bg-indigo-500 flex items-center justify-center text-white shadow-lg shadow-indigo-500/30">
|
|
18
|
+
<i data-lucide="user" class="w-5 h-5"></i>
|
|
19
|
+
</div>
|
|
20
|
+
<div>
|
|
21
|
+
<p class="text-sm font-bold text-white"><%= @post.author.empty? ? "Eksa Dev" : @post.author %></p>
|
|
22
|
+
<p class="text-[10px] text-white/40 uppercase tracking-widest">Penulis Artikel</p>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
|
|
26
|
+
<% if !@post.image.empty? %>
|
|
27
|
+
<div class="mb-10 rounded-3xl overflow-hidden shadow-2xl border border-white/10">
|
|
28
|
+
<img src="<%= @post.image %>" alt="<%= @post.title %>" class="w-full object-cover max-h-[400px]">
|
|
29
|
+
</div>
|
|
30
|
+
<% end %>
|
|
11
31
|
</div>
|
|
12
32
|
|
|
13
33
|
<div class="prose prose-invert prose-indigo max-w-none leading-relaxed text-white/80">
|
data/exe/eksa
CHANGED
|
@@ -10,7 +10,7 @@ def usage
|
|
|
10
10
|
puts " eksa init - Inisialisasi project baru"
|
|
11
11
|
puts " eksa g controller NAME - Generate controller baru"
|
|
12
12
|
puts " eksa g model NAME - Generate model baru"
|
|
13
|
-
puts " eksa g post TITLE -
|
|
13
|
+
puts " eksa g post TITLE - Post baru [args: --category, --author, --image]"
|
|
14
14
|
puts " eksa run - Jalankan server aplikasi"
|
|
15
15
|
puts "-----------------------------\n"
|
|
16
16
|
end
|
|
@@ -115,16 +115,23 @@ def generate_model(name)
|
|
|
115
115
|
puts " [OK] Created #{file_path}"
|
|
116
116
|
end
|
|
117
117
|
|
|
118
|
-
def generate_post(title)
|
|
118
|
+
def generate_post(title, options = {})
|
|
119
119
|
FileUtils.mkdir_p("_posts")
|
|
120
120
|
date = Time.now.strftime("%Y-%m-%d")
|
|
121
121
|
slug = title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
|
|
122
122
|
filename = "_posts/#{date}-#{slug}.md"
|
|
123
123
|
|
|
124
|
+
author = options[:author] || ""
|
|
125
|
+
category = options[:category] || "Uncategorized"
|
|
126
|
+
image = options[:image] || ""
|
|
127
|
+
|
|
124
128
|
content = <<~MARKDOWN
|
|
125
129
|
---
|
|
126
130
|
title: "#{title}"
|
|
127
131
|
date: #{Time.now.strftime("%Y-%m-%d %H:%M:%S")}
|
|
132
|
+
author: "#{author}"
|
|
133
|
+
category: "#{category}"
|
|
134
|
+
image: "#{image}"
|
|
128
135
|
---
|
|
129
136
|
|
|
130
137
|
Tulis konten blog Anda di sini...
|
|
@@ -160,7 +167,15 @@ when 'g', 'generate'
|
|
|
160
167
|
elsif subcommand == 'model' && name
|
|
161
168
|
generate_model(name)
|
|
162
169
|
elsif subcommand == 'post' && name
|
|
163
|
-
|
|
170
|
+
options = {}
|
|
171
|
+
while (arg = ARGV.shift)
|
|
172
|
+
case arg
|
|
173
|
+
when '--category' then options[:category] = ARGV.shift
|
|
174
|
+
when '--author' then options[:author] = ARGV.shift
|
|
175
|
+
when '--image' then options[:image] = ARGV.shift
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
generate_post(name, options)
|
|
164
179
|
else
|
|
165
180
|
usage
|
|
166
181
|
end
|
data/lib/eksa/markdown_post.rb
CHANGED
|
@@ -36,6 +36,18 @@ module Eksa
|
|
|
36
36
|
@metadata['date'] || File.mtime(File.join(POSTS_DIR, @filename))
|
|
37
37
|
end
|
|
38
38
|
|
|
39
|
+
def author
|
|
40
|
+
@metadata['author'] || ""
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def category
|
|
44
|
+
@metadata['category'] || "Uncategorized"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def image
|
|
48
|
+
@metadata['image'] || ""
|
|
49
|
+
end
|
|
50
|
+
|
|
39
51
|
def body_html
|
|
40
52
|
Kramdown::Document.new(@content, input: 'GFM').to_html
|
|
41
53
|
end
|
data/lib/eksa/version.rb
CHANGED
data/public/img/logo.jpg
ADDED
|
Binary file
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: eksa-framework
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.3.
|
|
4
|
+
version: 3.3.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- IshikawaUta
|
|
@@ -129,6 +129,7 @@ files:
|
|
|
129
129
|
- lib/eksa/version.rb
|
|
130
130
|
- public/css/style.css
|
|
131
131
|
- public/img/favicon.ico
|
|
132
|
+
- public/img/logo.jpg
|
|
132
133
|
- public/img/logo.png
|
|
133
134
|
- spec/application_spec.rb
|
|
134
135
|
- spec/markdown_post_spec.rb
|