灵符lingfu
F

fu.ling-lang.org

↓ 0 downloads

ทะเบียนแพ็กเกจ fu.ling-lang.org — เขียนด้วยภาษา Ling (ไทย) ทั้งหมด

Keywords registry, packages, web, ling, thai
lingfu install fu.ling-lang.org
LicenseApache-2.0 OR MIT
Authorsลิงลิน
READMECode / FilesVersionsDependency GraphDependentsSecurityBuildsSettings

Code / Files (22)

controllers/packages.ling
// controllers/packages.ling — ดัชนีตามอักษร + ค้นหา + หน้าแพ็กเกจ + JSON API

ผูก ต่อหน้า = 20

// แถบอักษร 0-9 a-z (ลิงก์ไปยังดัชนีแต่ละตัว)
ฟังก์ชัน แถบอักษร(เลือกอยู่) {
    ผูก อักษรๆ = ["0", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
                  "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
    ผูก ก = 0
    ผูก ผล = ""
    ขณะที่ ก < อักษรๆ.len {
        ผูก ตัว = รับรายการ(อักษรๆ, ก)
        ผูก ป้าย = ตัว
        ถ้า ตัว == "0" {
            ผูก ป้าย = "0-9"
        }
        ผูก ชั้น = "tab"
        ถ้า ตัว == เลือกอยู่ {
            ผูก ชั้น = "tab active"
        }
        ผูก ผล = ผล + "<a class='" + ชั้น + "' href='/packages?letter=" + ตัว + "'>" + ป้าย + "</a>"
        ผูก ก = ก + 1
    }
    คืน "<div class='tabs'>" + ผล + "</div>"
}

// GET /packages?letter=l&page=1 — ดัชนีเรียงอักษร แบ่งหน้า
ฟังก์ชัน หน้าแพ็กเกจ(คำขอ) {
    ผูก ภาษา = ภาษาจาก(คำขอ)
    ผูก ตัว = query_param(คำขอ.query, "letter", "l")
    ผูก หน้า = to_number(query_param(คำขอ.query, "page", "1"))
    ถ้า หน้า < 1 {
        ผูก หน้า = 1
    }
    ผูก ออฟเซ็ต = (หน้า - 1) * ต่อหน้า
    ผูก รายการ = แพ็กเกจตามอักษร(ตัว, ออฟเซ็ต, ต่อหน้า)
    ผูก ทั้งหมด = แพ็กเกจนับอักษร(ตัว)

    ผูก เนื้อรายการ = "<p class='empty'>" + ที(ภาษา, "No packages start with this letter.", "ไม่มีแพ็กเกจที่ขึ้นต้นด้วยอักษรนี้", "이 글자로 시작하는 패키지가 없습니다.", "この文字で始まるパッケージはありません。", "没有以此字母开头的软件包。") + "</p>"
    ถ้า รายการ.len > 0 {
        ผูก เนื้อรายการ = "<ul class='cards full'>" + รายการการ์ด(รายการ) + "</ul>"
    }

    // ปุ่มหน้า ก่อนหน้า/ถัดไป
    ผูก แถบหน้า = ""
    ถ้า หน้า > 1 {
        ผูก แถบหน้า = แถบหน้า + "<a class='page-btn' href='/packages?letter=" + ตัว + "&page=" + (หน้า - 1) + "'>&larr; " + ที(ภาษา, "Prev", "ก่อนหน้า", "이전", "前へ", "上一页") + "</a>"
    }
    ผูก แถบหน้า = แถบหน้า + "<span class='page-info'>" + ที(ภาษา, "Page", "หน้า", "페이지", "ページ", "第") + " " + หน้า + " · " + ที(ภาษา, "total", "ทั้งหมด", "총", "合計", "共") + " " + ทั้งหมด + "</span>"
    ถ้า ออฟเซ็ต + ต่อหน้า < ทั้งหมด {
        ผูก แถบหน้า = แถบหน้า + "<a class='page-btn' href='/packages?letter=" + ตัว + "&page=" + (หน้า + 1) + "'>" + ที(ภาษา, "Next", "ถัดไป", "다음", "次へ", "下一页") + " &rarr;</a>"
    }

    คืน เปลือก(คำขอ,
        ที(ภาษา, "Package index", "ดัชนีแพ็กเกจ", "패키지 색인", "パッケージ索引", "软件包索引"),
        "<h1>" + ที(ภาษา, "Package index", "ดัชนีแพ็กเกจ", "패키지 색인", "パッケージ索引", "软件包索引") + "</h1>" + แถบอักษร(ตัว) + เนื้อรายการ +
        "<div class='pager'>" + แถบหน้า + "</div>")
}

// GET /search?q=... — ค้นหา
ฟังก์ชัน หน้าค้นหา(คำขอ) {
    ผูก ภาษา = ภาษาจาก(คำขอ)
    ผูก คำ = query_param(คำขอ.query, "q", "")
    ผูก คำปลอดภัย = html_escape(คำ)
    ถ้า คำ == "" {
        คืน เปลือก(คำขอ, ที(ภาษา, "Search", "ค้นหา", "검색", "検索", "搜索"),
            "<h1>" + ที(ภาษา, "Search packages", "ค้นหาแพ็กเกจ", "패키지 검색", "パッケージ検索", "搜索软件包") + "</h1><p class='empty'>" + ที(ภาษา, "Type a query in the box above.", "พิมพ์คำค้นในช่องด้านบน", "위 상자에 검색어를 입력하세요.", "上のボックスに検索語を入力してください。", "在上方框中输入查询。") + "</p>")
    }
    ผูก รายการ = แพ็กเกจค้นหา(คำ)
    ผูก เนื้อรายการ = "<p class='empty'>" + ที(ภาษา, "No packages match", "ไม่พบแพ็กเกจที่ตรงกับ", "일치하는 패키지 없음", "一致するパッケージなし", "无匹配软件包") + " &ldquo;" + คำปลอดภัย + "&rdquo;</p>"
    ถ้า รายการ.len > 0 {
        ผูก เนื้อรายการ = "<ul class='cards full'>" + รายการการ์ด(รายการ) + "</ul>"
    }
    คืน เปลือก(คำขอ, ที(ภาษา, "Search", "ค้นหา", "검색", "検索", "搜索") + ": " + คำปลอดภัย,
        "<h1>" + ที(ภาษา, "Results for", "ผลการค้นหา", "검색 결과", "検索結果", "搜索结果") + " &ldquo;" + คำปลอดภัย + "&rdquo; <span class='count'>(" + รายการ.len + ")</span></h1>" + เนื้อรายการ)
}

// GET /package?name=ling-core — หน้ารายละเอียดแพ็กเกจ
ฟังก์ชัน หน้ารายละเอียด(คำขอ) {
    ผูก ภาษา = ภาษาจาก(คำขอ)
    ผูก ชื่อ = query_param(คำขอ.query, "name", "")
    ผูก ผลหา = แพ็กเกจหา(ชื่อ)
    ถ้า ผลหา.len == 0 {
        คืน ตอบ(404, เปลือก(คำขอ, ที(ภาษา, "Not found", "ไม่พบ", "찾을 수 없음", "見つかりません", "未找到"), "<h1>" + ที(ภาษา, "Package not found", "ไม่พบแพ็กเกจ", "패키지를 찾을 수 없습니다", "パッケージが見つかりません", "未找到软件包") + "</h1><p class='empty'>&ldquo;" + html_escape(ชื่อ) + "&rdquo;</p>"), "text/html; charset=utf-8")
    }
    ผูก พ = รับรายการ(ผลหา, 0)
    ผูก รุ่นๆ = รุ่นของชื่อ(ชื่อ)

    ผูก แถวรุ่น = "<li class='ver-row empty'>" + ที(ภาษา, "No published versions yet", "ยังไม่มีรุ่นที่เผยแพร่", "게시된 버전 없음", "公開されたバージョンはありません", "尚无已发布版本") + "</li>"
    ถ้า รุ่นๆ.len > 0 {
        ผูก ก = 0
        ผูก แถวรุ่น = ""
        ขณะที่ ก < รุ่นๆ.len {
            ผูก ร = รับรายการ(รุ่นๆ, ก)
            ผูก ป้ายยกเลิก = ""
            ถ้า ร.yanked == 1 {
                ผูก ป้ายยกเลิก = " <span class='yanked'>" + ที(ภาษา, "yanked", "ถูกถอน", "철회됨", "取り下げ", "已撤回") + "</span>"
            }
            ผูก แถวรุ่น = แถวรุ่น + "<li class='ver-row'><b>" + ร.version + "</b>" + ป้ายยกเลิก + "<span class='ver-date'>" + ร.created_at + "</span></li>"
            ผูก ก = ก + 1
        }
    }

    // ── แผงเมทาดาทา (โฮมเพจ / ที่เก็บ / ใบอนุญาต / ผู้เขียน / คีย์เวิร์ด) ──
    ผูก แถว_เมทา = ""
    ถ้า พ.homepage != "" {
        ผูก แถว_เมทา = แถว_เมทา + "<div class='meta-row'><span>" + ที(ภาษา, "Homepage", "โฮมเพจ", "홈페이지", "ホームページ", "主页") + "</span><a href='" + พ.homepage + "' rel='noopener'>" + html_escape(พ.homepage) + "</a></div>"
    }
    ถ้า พ.repository != "" {
        ผูก แถว_เมทา = แถว_เมทา + "<div class='meta-row'><span>" + ที(ภาษา, "Repository", "ที่เก็บโค้ด", "저장소", "リポジトリ", "仓库") + "</span><a href='" + พ.repository + "' rel='noopener'>" + html_escape(พ.repository) + "</a></div>"
    }
    ถ้า พ.license != "" {
        ผูก แถว_เมทา = แถว_เมทา + "<div class='meta-row'><span>" + ที(ภาษา, "License", "ใบอนุญาต", "라이선스", "ライセンス", "许可证") + "</span>" + html_escape(พ.license) + "</div>"
    }
    ถ้า พ.authors != "" {
        ผูก แถว_เมทา = แถว_เมทา + "<div class='meta-row'><span>" + ที(ภาษา, "Authors", "ผู้เขียน", "저자", "作者", "作者") + "</span>" + html_escape(พ.authors) + "</div>"
    }
    ผูก คีย์เวิร์ด = ""
    ถ้า พ.keywords != "" {
        ผูก คีย์เวิร์ด = "<div class='keywords'><span class='kw-label'>" + ที(ภาษา, "Keywords", "คีย์เวิร์ด", "키워드", "キーワード", "关键词") + "</span> " + html_escape(พ.keywords) + "</div>"
    }
    ผูก แผงเมทา = ""
    ถ้า แถว_เมทา != "" {
        ผูก แผงเมทา = "<div class='meta-panel'>" + แถว_เมทา + "</div>"
    }

    // ── README ──
    ผูก บล็อครีดมี = ""
    ถ้า พ.readme != "" {
        ผูก บล็อครีดมี = "<h2>README</h2><pre class='readme'>" + html_escape(พ.readme) + "</pre>"
    }

    คืน เปลือก(คำขอ, พ.name,
        "<div class='pkg-head'><h1>" + พ.name + "</h1><span class='dl big'>&#8595; " + พ.downloads + " " + ที(ภาษา, "downloads", "ดาวน์โหลด", "다운로드", "ダウンロード", "下载") + "</span></div>" +
        "<p class='pkg-desc big'>" + พ.description + "</p>" +
        คีย์เวิร์ด +
        "<div class='cmd wide'><code>lingfu install " + พ.name + "</code></div>" +
        แผงเมทา +
        บล็อครีดมี +
        "<h2>" + ที(ภาษา, "All versions", "รุ่นทั้งหมด", "모든 버전", "全バージョン", "所有版本") + "</h2><ul class='vers'>" + แถวรุ่น + "</ul>" +
        "<p><a href='/packages'>&larr; " + ที(ภาษา, "Back to index", "กลับไปดัชนี", "색인으로", "索引に戻る", "返回索引") + "</a></p>")
}

// GET /api/packages — JSON
ฟังก์ชัน เอพีไอแพ็กเกจ(คำขอ) {
    ผูก รายการ = แพ็กเกจทั้งหมด()
    ผูก ก = 0
    ผูก ชิ้นๆ = ""
    ขณะที่ ก < รายการ.len {
        ผูก พ = รับรายการ(รายการ, ก)
        ถ้า ก > 0 {
            ผูก ชิ้นๆ = ชิ้นๆ + ","
        }
        ผูก ชิ้นๆ = ชิ้นๆ + "{\"name\":\"" + พ.name + "\",\"description\":\"" + พ.description + "\",\"downloads\":" + พ.downloads + "}"
        ผูก ก = ก + 1
    }
    คืน ตอบ(200, "{\"packages\":[" + ชิ้นๆ + "]}", "application/json")
}

← Back to index