diff --git a/site/app/controllers/markdown_projects_controller.rb b/site/app/controllers/markdown_projects_controller.rb deleted file mode 100644 index 30a70c8..0000000 --- a/site/app/controllers/markdown_projects_controller.rb +++ /dev/null @@ -1,4 +0,0 @@ -class MarkdownProjectsController < ApplicationController - def index - end -end \ No newline at end of file diff --git a/site/app/controllers/projects_controller.rb b/site/app/controllers/projects_controller.rb index fe92474..256f14f 100644 --- a/site/app/controllers/projects_controller.rb +++ b/site/app/controllers/projects_controller.rb @@ -1,49 +1,83 @@ class ProjectsController < ApplicationController - before_action :set_project, only: %i[ show edit update ] - before_action :require_authentication, only: [:show, :edit, :update] - + require 'yaml' + require 'redcarpet' def index @projects = Project.all end def show + @project = Project.find(params[:repo], params[:project_name]) + render_not_found unless @project end def new - @project = Project.new end - def create - @project = Project.new(project_params) - @project.user = current_user - if @project.save - redirect_to @project + private + + def load_projects + projects = [] + Dir.glob(Rails.root.join('content/projects/*/*/journal.md')).each do |file| + content = File.read(file) + metadata, _ = parse_frontmatter(content) + + # Extract repo and project name from path + path_parts = file.split('/') + repo = path_parts[-3] + project_name = path_parts[-2] + + projects << { + repo: repo, + project_name: project_name, + title: metadata['title'], + author: metadata['author'], + description: metadata['description'], + created_at: metadata['created_at'] + } + end + projects.sort_by { |p| p[:created_at] }.reverse + end + + def load_project(repo, project_name) + file_path = Rails.root.join('content/projects', repo, project_name, 'journal.md') + return nil unless File.exist?(file_path) + + content = File.read(file_path) + metadata, markdown_content = parse_frontmatter(content) + + { + repo: repo, + project_name: project_name, + title: metadata['title'], + author: metadata['author'], + description: metadata['description'], + created_at: metadata['created_at'], + content: render_markdown(markdown_content) + } + end + + def parse_frontmatter(content) + if content =~ /\A(---\s*\n.*?\n?)^(---\s*$\n?)/m + metadata = YAML.safe_load($1) + content = content[$2.size..-1] + [metadata, content] else - render :new, status: :unprocessable_entity + [{}, content] end end - def edit + def render_markdown(content) + markdown = Redcarpet::Markdown.new( + Redcarpet::Render::HTML, + autolink: true, + tables: true, + fenced_code_blocks: true + ) + markdown.render(content) end - def update - if @project.update(project_params) - redirect_to @project, notice: "Project was successfully updated." - else - render :edit, status: :unprocessable_entity - end + def render_not_found + render file: "#{Rails.root}/public/404.html", status: :not_found end - - private - - def set_project - @project = Project.find(params[:id]) - end - - def project_params - params.expect(project: [ :github_repo, :kitted_guide, :proposed_tier, :proposed_tier_explanation, :group_project, :name ]) - end - - end diff --git a/site/app/models/project.rb b/site/app/models/project.rb index 28592ab..2efdaf2 100644 --- a/site/app/models/project.rb +++ b/site/app/models/project.rb @@ -1,14 +1,94 @@ -class Project < ApplicationRecord - belongs_to :user - has_many :posts, dependent: :destroy +class Project + attr_reader :repo, :project_name, :title, :author, :description, :created_at, :content + + def initialize(attributes = {}) + @repo = attributes[:repo] + @project_name = attributes[:project_name] + @title = attributes[:title] + @author = attributes[:author] + @description = attributes[:description] + @created_at = attributes[:created_at] + @content = attributes[:content] + end + + def name + title + end def github_slug - return unless github_repo - segments = github_repo.split("/") - segments.last(2).join("/") + "#{repo}/#{project_name}" end - def hours - posts.sum(:hours) + def github_repo + "https://github.com/#{github_slug}" + end + + def created_at_date + Date.parse(created_at) + end + + def formatted_created_at + created_at_date.strftime("%B %d, %Y") + end + + def self.all + Dir.glob(Rails.root.join('content/projects/*/*/journal.md')).map do |file| + content = File.read(file) + metadata, _ = parse_frontmatter(content) + + # Extract repo and project name from path + path_parts = file.split('/') + repo = path_parts[-3] + project_name = path_parts[-2] + + new( + repo: repo, + project_name: project_name, + title: metadata['title'], + author: metadata['author'], + description: metadata['description'], + created_at: metadata['created_at'] + ) + end.sort_by(&:created_at_date).reverse + end + + def self.find(repo, project_name) + file_path = Rails.root.join('content/projects', repo, project_name, 'journal.md') + return nil unless File.exist?(file_path) + + content = File.read(file_path) + metadata, markdown_content = parse_frontmatter(content) + + new( + repo: repo, + project_name: project_name, + title: metadata['title'], + author: metadata['author'], + description: metadata['description'], + created_at: metadata['created_at'], + content: render_markdown(markdown_content) + ) + end + + private + + def self.parse_frontmatter(content) + if content =~ /\A(---\s*\n.*?\n?)^(---\s*$\n?)/m + metadata = YAML.safe_load($1) + content = content[$2.size..-1] + [metadata, content] + else + [{}, content] + end + end + + def self.render_markdown(content) + markdown = Redcarpet::Markdown.new( + Redcarpet::Render::HTML, + autolink: true, + tables: true, + fenced_code_blocks: true + ) + markdown.render(content) end end diff --git a/site/app/views/markdown_projects/index.html.md b/site/app/views/markdown_projects/index.html.md deleted file mode 100644 index b369b0e..0000000 --- a/site/app/views/markdown_projects/index.html.md +++ /dev/null @@ -1,4 +0,0 @@ -whi -# Hello world - -_by acorn_ diff --git a/site/app/views/projects/_header.html.erb b/site/app/views/projects/_header.html.erb index eecbd58..c30f572 100644 --- a/site/app/views/projects/_header.html.erb +++ b/site/app/views/projects/_header.html.erb @@ -1,11 +1,7 @@ -<%# locals: (project:) %> -
My projects:
- -created by [<%= "foo" %>]
- -<%= project.hours %> hours
+created by [<%= project.author %>]
+<%= project.description %>
+Started on <%= project.formatted_created_at %>
<% end %> <% end %>posted by [name] // <%= time_ago_in_words(post.created_at) %> ago // <%= pluralize(post.hours, "hour") %> spent on [project]
-<%= post.name %>
- -