Upload files to "js"
This commit is contained in:
parent
441dee3484
commit
6fe49aea64
174
js/main.js
Normal file
174
js/main.js
Normal file
@ -0,0 +1,174 @@
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
// Function to fetch and parse Markdown files
|
||||
async function fetchMarkdown(filename) {
|
||||
try {
|
||||
const response = await fetch(`articles/${filename}`);
|
||||
if (!response.ok) {
|
||||
throw new Error(`Failed to fetch ${filename}`);
|
||||
}
|
||||
return await response.text();
|
||||
} catch (error) {
|
||||
console.error('Error fetching markdown:', error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// Function to parse Markdown content
|
||||
function parseMarkdown(markdown) {
|
||||
if (!markdown) return null;
|
||||
|
||||
// Simple markdown parser for this example
|
||||
// In a real application, you might want to use a library like marked.js
|
||||
|
||||
// Extract title from the first heading
|
||||
const titleMatch = markdown.match(/^# (.+)$/m);
|
||||
const title = titleMatch ? titleMatch[1] : 'Untitled';
|
||||
|
||||
// Extract date if it exists
|
||||
const dateMatch = markdown.match(/Date: (.+)$/m);
|
||||
const date = dateMatch ? dateMatch[1] : 'No date';
|
||||
|
||||
// Get the content after the title
|
||||
let content = markdown.replace(/^# .+$/m, '').trim();
|
||||
|
||||
// Remove date line if it exists
|
||||
content = content.replace(/Date: .+$/m, '').trim();
|
||||
|
||||
// Create excerpt (first 150 characters)
|
||||
const excerpt = content.substring(0, 150) + '...';
|
||||
|
||||
return {
|
||||
title,
|
||||
date,
|
||||
content,
|
||||
excerpt
|
||||
};
|
||||
}
|
||||
|
||||
// Function to load articles
|
||||
async function loadArticles() {
|
||||
const articlesGrid = document.getElementById('articles-grid');
|
||||
const featuredArticle = document.getElementById('featured-article');
|
||||
|
||||
if (!articlesGrid || !featuredArticle) {
|
||||
// Not on the homepage
|
||||
return;
|
||||
}
|
||||
|
||||
// Get the list of article files
|
||||
// In a real app, you would need a server-side solution to list files
|
||||
// For this example, we'll simulate with a limited number of articles
|
||||
const articleNumbers = [];
|
||||
|
||||
// Try to get articles 1 through 20 (adjust based on your needs)
|
||||
for (let i = 1; i <= 20; i++) {
|
||||
const markdown = await fetchMarkdown(`${i}.md`);
|
||||
if (markdown) {
|
||||
articleNumbers.push(i);
|
||||
} else {
|
||||
// No more articles found
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Sort in descending order to get the newest first
|
||||
articleNumbers.sort((a, b) => b - a);
|
||||
|
||||
// Display the latest article as featured
|
||||
if (articleNumbers.length > 0) {
|
||||
const latestNumber = articleNumbers[0];
|
||||
const markdown = await fetchMarkdown(`${latestNumber}.md`);
|
||||
const article = parseMarkdown(markdown);
|
||||
|
||||
if (article) {
|
||||
featuredArticle.innerHTML = `
|
||||
<h2>${article.title}</h2>
|
||||
<span class="date">${article.date}</span>
|
||||
<p class="excerpt">${article.excerpt}</p>
|
||||
<a href="article.html?id=${latestNumber}" class="read-more">Read More</a>
|
||||
`;
|
||||
}
|
||||
|
||||
// Remove the latest article from the array
|
||||
articleNumbers.shift();
|
||||
}
|
||||
|
||||
// Display up to 6 previous articles in the grid
|
||||
const displayCount = Math.min(10, articleNumbers.length);
|
||||
|
||||
for (let i = 0; i < displayCount; i++) {
|
||||
const articleNumber = articleNumbers[i];
|
||||
const markdown = await fetchMarkdown(`${articleNumber}.md`);
|
||||
const article = parseMarkdown(markdown);
|
||||
|
||||
if (article) {
|
||||
const articleCard = document.createElement('div');
|
||||
articleCard.className = 'article-card';
|
||||
articleCard.innerHTML = `
|
||||
<h3>${article.title}</h3>
|
||||
<span class="date">${article.date}</span>
|
||||
<p class="excerpt">${article.excerpt}</p>
|
||||
<a href="article.html?id=${articleNumber}" class="read-more">Read More</a>
|
||||
`;
|
||||
|
||||
articlesGrid.appendChild(articleCard);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Function to load a single article page
|
||||
async function loadArticlePage() {
|
||||
// Check if we're on an article page
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const articleId = urlParams.get('id');
|
||||
|
||||
if (!articleId) {
|
||||
// Not on an article page
|
||||
return;
|
||||
}
|
||||
|
||||
const articleTitle = document.getElementById('article-title');
|
||||
const main = document.querySelector('main');
|
||||
|
||||
// Fetch the article
|
||||
const markdown = await fetchMarkdown(`${articleId}.md`);
|
||||
const article = parseMarkdown(markdown);
|
||||
|
||||
if (article) {
|
||||
// Set the article title in the header
|
||||
if (articleTitle) {
|
||||
articleTitle.textContent = article.title;
|
||||
}
|
||||
|
||||
// Convert markdown content to HTML (simplified version)
|
||||
let html = article.content;
|
||||
|
||||
// Convert headers
|
||||
html = html.replace(/^## (.+)$/gm, '<h2>$1</h2>');
|
||||
html = html.replace(/^### (.+)$/gm, '<h3>$1</h3>');
|
||||
|
||||
// Convert paragraphs (simple version)
|
||||
html = html.split('\n\n').map(p => `<p>${p}</p>`).join('');
|
||||
|
||||
// Create the article container
|
||||
const articleContainer = document.createElement('div');
|
||||
articleContainer.className = 'article-page';
|
||||
articleContainer.innerHTML = `
|
||||
<h1>${article.title}</h1>
|
||||
<div class="article-meta">${article.date}</div>
|
||||
<div class="article-content">
|
||||
${html}
|
||||
</div>
|
||||
`;
|
||||
|
||||
main.innerHTML = '';
|
||||
main.appendChild(articleContainer);
|
||||
} else {
|
||||
main.innerHTML = '<div class="article-page"><h1>Article Not Found</h1><p>The requested article could not be found.</p></div>';
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize the page
|
||||
loadArticles();
|
||||
loadArticlePage();
|
||||
});
|
||||
Loading…
Reference in New Issue
Block a user