Added initial repo support for Github Pages.

Esse commit está contido em:
23rd
2025-08-27 10:18:51 +03:00
commit 97d64e28f0
4 arquivos alterados com 474 adições e 2 exclusões
+52
Ver Arquivo
@@ -0,0 +1,52 @@
# Sample workflow for building and deploying a Jekyll site to GitHub Pages
name: Deploy Jekyll with GitHub Pages dependencies preinstalled
on:
# Runs on pushes targeting the default branch
push:
branches: ["dev"]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
contents: read
pages: write
id-token: write
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
group: "pages"
cancel-in-progress: false
jobs:
# Build job
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Pages
uses: actions/configure-pages@v5
- name: Build with Jekyll
uses: actions/jekyll-build-pages@v1
with:
source: ./
destination: ./_site
jekyll_config: _config_github_pages.yml
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
# Deployment job
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
+1 -2
Ver Arquivo
@@ -1,7 +1,6 @@
# Forkgram — Unofficial Telegram Messenger
![image](https://user-images.githubusercontent.com/4051126/43634235-402a8b74-9714-11e8-85c0-8ceb0844a3b0.png)
Forkgram is the fork of the official Telegram Desktop application.
This fork does not fundamentally change the official client and adds only some useful small features.
Forkgram is the cutting-edge Telegram fork with small Quality-of-Life enhancements.
[![Build Status](https://github.com/Forkgram/tdesktop/workflows/Windows./badge.svg)](https://github.com/Forkgram/tdesktop/actions)
[![Github All Releases](https://img.shields.io/github/downloads/Forkgram/tdesktop/total.svg)](https://github.com/Forkgram/tdesktop/releases)
+9
Ver Arquivo
@@ -0,0 +1,9 @@
title: Forkgram Desktop
description: Forkgram is the cutting-edge Telegram fork with small Quality-of-Life enhancements.
baseurl: ""
url: "https://forkgram.github.io/tdesktop"
include:
- "*.html"
- "*.js"
- "*.css"
+412
Ver Arquivo
@@ -0,0 +1,412 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Project Releases | GitHub Pages</title>
<style>
:root {
--primary-color: #2ea44f;
--secondary-color: #f6f8fa;
--border-color: #e1e4e8;
--text-color: #24292e;
--bg-color: #ffffff;
--accent-color: #0366d6;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
line-height: 1.6;
color: var(--text-color);
background-color: var(--bg-color);
margin: 0;
padding: 0;
max-width: 1012px;
margin: 0 auto;
padding: 32px;
}
header {
border-bottom: 1px solid var(--border-color);
padding-bottom: 32px;
margin-bottom: 32px;
}
h1 {
font-size: 32px;
font-weight: 600;
margin-bottom: 8px;
}
h2 {
font-size: 24px;
font-weight: 600;
margin-top: 32px;
margin-bottom: 16px;
padding-bottom: 8px;
border-bottom: 1px solid var(--border-color);
}
.description {
font-size: 18px;
color: #586069;
}
.card {
border: 1px solid var(--border-color);
border-radius: 6px;
padding: 16px;
margin-bottom: 16px;
background-color: var(--bg-color);
}
.release-table {
width: 100%;
border-collapse: collapse;
margin: 20px 0;
}
.release-table th, .release-table td {
border: 1px solid var(--border-color);
padding: 12px;
text-align: left;
}
.release-table th {
background-color: var(--secondary-color);
font-weight: 600;
}
.download-btn {
background-color: var(--primary-color);
color: white;
padding: 8px 16px;
text-decoration: none;
border-radius: 6px;
display: inline-block;
font-weight: 500;
transition: background-color 0.2s;
}
.download-btn:hover {
background-color: #2c974b;
}
.tag {
display: inline-block;
padding: 4px 8px;
font-size: 12px;
font-weight: 600;
border-radius: 2em;
background-color: #f1f8ff;
color: var(--accent-color);
margin-left: 8px;
}
.loading {
text-align: center;
padding: 40px;
color: #586069;
}
.error {
color: #cb2431;
padding: 16px;
border: 1px solid #f97583;
border-radius: 6px;
background-color: #ffebeb;
}
footer {
margin-top: 40px;
padding-top: 20px;
border-top: 1px solid var(--border-color);
text-align: center;
color: #586069;
font-size: 14px;
}
#readme-content h1, #readme-content h2, #readme-content h3 {
margin-top: 24px;
margin-bottom: 16px;
font-weight: 600;
}
#readme-content h1 {
font-size: 2em;
border-bottom: 1px solid var(--border-color);
padding-bottom: 0.3em;
}
#readme-content h2 {
font-size: 1.5em;
border-bottom: 1px solid var(--border-color);
padding-bottom: 0.3em;
}
#readme-content h3 {
font-size: 1.25em;
}
#readme-content p {
margin-bottom: 16px;
}
#readme-content a {
color: var(--accent-color);
text-decoration: none;
}
#readme-content a:hover {
text-decoration: underline;
}
#readme-content ul, #readme-content ol {
padding-left: 2em;
margin-bottom: 16px;
}
#readme-content code {
padding: 0.2em 0.4em;
margin: 0;
font-size: 85%;
background-color: var(--secondary-color);
border-radius: 6px;
font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
}
#readme-content pre {
padding: 16px;
overflow: auto;
font-size: 85%;
line-height: 1.45;
background-color: var(--secondary-color);
border-radius: 6px;
margin-bottom: 16px;
}
#readme-content pre code {
padding: 0;
background-color: transparent;
}
#readme-content blockquote {
padding: 0 1em;
color: #6a737d;
border-left: 0.25em solid #dfe2e5;
margin: 0 0 16px 0;
}
@media (max-width: 768px) {
body {
padding: 16px;
}
.release-table {
display: block;
overflow-x: auto;
}
}
</style>
</head>
<body>
<main>
<section id="releases">
<h2>Latest Releases</h2>
<div class="card">
<div id="release-table">
<div class="loading">Loading release information...</div>
</div>
</div>
</section>
<section id="readme">
<h2>Overview</h2>
<div class="card">
<div id="readme-content">
<div class="loading">Loading README content...</div>
</div>
</div>
</section>
</main>
<footer>
<p>Generated with ❤️ for GitHub Pages</p>
</footer>
<script>
// Replace these with your GitHub username and repository name
const username = 'forkgram';
const repo = 'tdesktop';
// Function to fetch the latest release
async function fetchLatestRelease() {
try {
const response = await fetch(`https://api.github.com/repos/${username}/${repo}/releases/latest`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const release = await response.json();
if (release.assets && release.assets.length > 0) {
const table = `
<table class="release-table">
<thead>
<tr>
<th>File</th>
<th>Size</th>
<th>Downloads</th>
<th>Action</th>
</tr>
</thead>
<tbody>
${release.assets.map(asset => `
<tr>
<td>${asset.name}</td>
<td>${formatFileSize(asset.size)}</td>
<td>${asset.download_count}</td>
<td>
<a href="${asset.browser_download_url}" class="download-btn">
Download
</a>
</td>
</tr>
`).join('')}
</tbody>
</table>
<p><strong>Version:</strong> ${release.tag_name} <span class="tag">Latest</span></p>
<p><strong>Release Date:</strong> ${new Date(release.published_at).toLocaleDateString()}</p>
${release.body ? `<p><strong>Release Notes:</strong><br>${release.body}</p>` : ''}
`;
document.getElementById('release-table').innerHTML = table;
} else {
document.getElementById('release-table').innerHTML = '<p>No release assets available.</p>';
}
} catch (error) {
console.error('Error fetching release:', error);
document.getElementById('release-table').innerHTML = `
<div class="error">
<p>Error loading releases: ${error.message}</p>
<p>Make sure you've set the correct username and repository name in the script.</p>
</div>
`;
}
}
// Function to fetch README and extract content before "## Features:"
async function fetchReadme() {
try {
const response = await fetch(`https://api.github.com/repos/${username}/${repo}/readme`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const readme = await response.json();
const binaryString = atob(readme.content);
const bytes = new Uint8Array(binaryString.length);
for (let i = 0; i < binaryString.length; i++) {
bytes[i] = binaryString.charCodeAt(i);
}
const content = new TextDecoder('utf-8').decode(bytes);
// Extract content before "## Features:" (case insensitive)
const featuresIndex = content.toLowerCase().indexOf('## features:');
let extractedContent = content;
if (featuresIndex !== -1) {
extractedContent = content.substring(0, featuresIndex);
}
extractedContent = extractedContent
.replace(/—/g, '—')
.replace(/’/g, '')
.replace(/“/g, '“')
.replace(/”/g, '”');
// Convert Markdown to HTML
const htmlContent = convertMarkdownToHtml(extractedContent);
document.getElementById('readme-content').innerHTML = htmlContent;
} catch (error) {
console.error('Error fetching README:', error);
document.getElementById('readme-content').innerHTML = `
<div class="error">
<p>Error loading README: ${error.message}</p>
<p>Make sure you've set the correct username and repository name in the script.</p>
</div>
`;
}
}
// Enhanced Markdown to HTML conversion
function convertMarkdownToHtml(markdown) {
return markdown
// Headers
.replace(/^###### (.*$)/gim, '<h6>$1</h6>')
.replace(/^##### (.*$)/gim, '<h5>$1</h5>')
.replace(/^#### (.*$)/gim, '<h4>$1</h4>')
.replace(/^### (.*$)/gim, '<h3>$1</h3>')
.replace(/^## (.*$)/gim, '<h2>$1</h2>')
.replace(/^# (.*$)/gim, '<h1>$1</h1>')
// Bold and Italic
.replace(/\*\*\*(.*?)\*\*\*/gim, '<strong><em>$1</em></strong>')
.replace(/\*\*(.*?)\*\*/gim, '<strong>$1</strong>')
.replace(/\*(.*?)\*/gim, '<em>$1</em>')
.replace(/_(.*?)_/gim, '<em>$1</em>')
// Links
.replace(/!\[(.*?)\]\((.*?)\)/gim, "<img alt='$1' src='$2' />")
.replace(/\[(.*?)\]\((.*?)\)/gim, "<a href='$2'>$1</a>")
// Code blocks
.replace(/```(\w+)?\n([\s\S]*?)```/gim, '<pre><code>$2</code></pre>')
.replace(/`(.*?)`/gim, '<code>$1</code>')
// Blockquotes
.replace(/^>\s(.*$)/gim, '<blockquote>$1</blockquote>')
// Horizontal rule
.replace(/^\*\*\*\*$/gim, '<hr>')
// Lists
.replace(/^\s*[\*\-]\s(.*$)/gim, '<ul><li>$1</li></ul>')
.replace(/^\s*\d\.\s(.*$)/gim, '<ol><li>$1</li></ol>')
.replace(/<\/ul>\s*<ul>/gim, '')
.replace(/<\/ol>\s*<ol>/gim, '')
// Paragraphs and line breaks
.replace(/\n\n/gim, '</p><p>')
.replace(/\n/gim, '<br>')
.replace(/<p>(.*?)<\/p>/gim, '<p>$1</p>')
// Final cleanup
.replace(/<p><\/p>/gim, '')
.replace(/<p><\/(ul|ol)>/gim, '</$1>')
.replace(/<(ul|ol)><\/$1>/gim, '')
.replace(/<p><(ul|ol)>/gim, '<$1>')
.replace(/<\/(ul|ol)><p>/gim, '</$1>');
}
// Format file size
function formatFileSize(bytes) {
if (bytes === 0) return '0 Bytes';
const k = 1024;
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}
// Load data when page is ready
document.addEventListener('DOMContentLoaded', function() {
// Update page title and header with repo info
if (username !== 'your-username' && repo !== 'your-repository') {
document.title = `Forkgram | Releases`;
// document.querySelector('h1').textContent = repo;
}
fetchLatestRelease();
fetchReadme();
});
</script>
</body>
</html>