最近造訪過的頁面
最近造訪過的頁面

Orion API - 建置

[驗證 ] Last updated by Joe Schaefer on 週五, 12 6月 2026    source
 

SunStar 系統

 

建立系統

本文件涵蓋 組建系統 API.

基本上,建置系統由兩個使用者提供的 Perl 模組所管理:lib/path.pm 與lib/view.pm.

前的工作是做三件事:

  1. 載入lib/facts.yml 與lib/acl.yml,
  2. 建構@path::patterns,和
  3. 當機行走content/ 種樹%path::dependencies 與@path::acls 來自 Markdown/yaml 檔案標頭描述資料。

後者的工作是提供不可呼叫的工作view- 基底$methods,用於比對下列項目:@path::patterns (作為每個 arrayref 項目的第二個槽位中的字串方法名稱),由建置命令檔:

    for my $p (@$patterns) {
        my ($re, $method, $args) = @$p;
        next unless $path =~ $re;
        if ($args->{headers}) {
          my Data::Dumper $d;
          $d = $d->new([$args->{headers}], ['$args->{headers}']);
          $d->Deepcopy(1);
          $d->Purity(1);
          eval $d->Dump;
        }
        my $s = $method_cache{$method} //= view->can($method) or die "Can't locate method: $method\n";
        my $start_call = [gettimeofday];
    no warnings 'once';
    $view::path = $path;
        my ($content, $ext, undef, @new_sources) = $s->(nonce => $nonce, website => $ENV{WEBSITE}, repos => $ENV{REPOS}, path => $path, lang => $lang, %$args);
        my $elapsed = tv_interval($start_call);
        if ($$args{compress}) {
          $lang .= ".gz";
          if (defined $content) {
            utf8::encode($content) if utf8::is_utf8 $content;
            gzip \($content, my $compressed);
            $content = $compressed;
          }
        }
        if (defined $content) {
          my $dest = "$target_base/$target_file.$ext$lang";
          my $encoding = $$args{encoding} // ($$args{compress} ? "raw" : "utf8");
          my $mtime;
          #$mtime = $_->mtime for map stat $_, "content/$path";
          open my $fh, ">:$encoding", $dest
            or die "Can't open $dest: $!\n";
          print $fh $content;
          close $fh;
          #utime $mtime, $mtime, $dest if $mtime;
        }
        syswrite_all "Built to $target_base/$target_file.$ext$lang in ${elapsed}s.\n";
        return @new_sources;
    }

  COPY:
    my ($dest, $copied) = copy_if_newer $file, "$target_base/$file";
    syswrite_all "Copied to $dest.\n" if $copied;

 

許多視觀表的堆疊方式”篩選” 以預先處理 (或後續處理) 檔案的層面$path 新穎,如外部程式碼snippets 或asymptote-fenced markdown 區塊。您可以看到以下範例:這裡.

 


 

SunStarSys::View — 基本類別lib/view.pm

 

single_narrative(%args)

最受歡迎 (和最複雜的) 檢視

此檢視包含檔案自動處理 (位於$path的附件目錄。也就是說,如果$path = "/foo.md.en",然後儲存於 中的檔案/foo.page/ 與目錄關聯的目錄”.en” 語言延伸將併入該範本可定址引數$path 無論preprocess 引數設定— 如果為 true,也會讓 **頁面的內容本身能夠存取該資料 **。

Mandatory Arguments:

  • template
  • path
  • lang

Optional Argmuents:

  • deps — 置換正常fetch_deps 處理

  • quick_deps — 內部折舊處理最佳化設定;最佳剩餘取消設定

  • preprocess — 啟用範本處理$path 內容本身,

  • archive_root — 檔案位於”已封存” 狀態為”已複製” 並透過下列方式依年 / 月子資料夾追蹤至此內容根目錄的位置:ssi,

  • category_root — 項目在”分類” 標頭為”已複製” 覆寫為內容根目錄位置中適當命名的類別資料夾ssi.

news_page(%args)

針對 (多敘述) 彙總頁面

sitemap(%args)

用於建立 index.html 和 sitemap.html 頁面

語言環境特定、已排序的相依性索引。

Mandatory Arguments:

  • path
  • lang

Optional Arguments:

  • quick_deps
  • nested
  • preprocess

asymptote(%args)

組建和快取Asymptote 適用於啟用 HTML5-WebGL 畫面之向量圖形的三重方括號編碼區塊

Mandatory Arguments:

  • view
  • lang
  • path

skip(%args)

根本不要建置這些元件。

改為建立關聯的產生來源檔案 (例如,.bib\$lang ↦\mapsto \$base.page/bibliography.yml\$lang) 將建立在次要建構系統執行上。

yml2ext(%args)

將 YAML 檔案轉換成 JSON。

Optional Arguments:

  • ext 預設為json
  • filter 預設為json_raw
  • template 覆寫filter 預設表示式

csv2ext(%args)

將 CSV 檔案轉換成 JSON。

Optional Arguments:

  • ext 預設為json
  • filter 預設為json_raw
  • template 覆寫filter 預設表示式

fetch_deps($path, $data, $quick)

重構$data 引數 hashref 做為 2-element arrayrefs 的時戳排序 arrayref。

每個 2- 元素 arrayref 中的第一個項目是檔案 path-name,第二個元素則是產生的read_text_file 該 path-name 的 hashref。

傳回結果新來源檔案的清單,如果$quick > 2.

Mandatory Arguments:

  • path
  • data - 輸入為 hashref;儲存傳回時產生的 dep 陣列參考資料
  • quick - 預設為 2

breadcrumbs($path)

傳回下列項目的 HTML 來源路徑清單:$path.

memoize(%args)

快取建置;主要與fetch_deps 與quick_deps > 2.

comment(%args)

產生SSI- 包含HTML5 頁面註解的片段。

next_view(%args)

循序處理的公用程式$args{view}.

ssi(%args)

遞迴評估ssi 標籤。

offline(%args)

執行next_view 在離線模式。

snippet(%args)

處理外部代碼 片段線,通常會將其 GitHub 上的來源位置匯入程式設計語言特定的圍欄標記區塊。這裡範例.

reconstruct(%args)

重新處理Template 內建內容的指令來源next_view.

去除本機連結的副檔名。

標準化本機連結 (./ 與../).

langify_template(%args)

附加$args{lang} 至$args{template}.

新增標題字串至 Markdown 連結。一般使用於offline 檢視以避免從遠端網站提取標題,這會大幅拖放頁面建置時間。

 


SunStarSys::Util — 公用程式程式庫lib/path.pm 與lib/view.pm

 

read_text_file($file, $out, $content_lines)

Orion 的通用文字檔案處理器

剖析 UTF- 8 編碼檔案的 headers+content $file 並將結果儲存在 hashref 中$out. $content_lines 是要讀取的內容行數上限 (選擇性)。

傳回實際讀取的行數 (包含標頭) 。

$file 可以是原始字串的參照,代表檔案的完整內容。結果$out 將會依然以 UTF-8 編碼。

copy_if_newer($src, $dest)

份數$src 至$dest 如果前者的修改時戳比後者的修改時戳新。

在複製時,加上 gzip 壓縮$dest 檔案 (如果是文字檔) 並新增”.gz” 名稱的副檔名。GZIP 設定可停用壓縮$ENV{NO_COPY_COMPRESS}=1.

get_lock($lockfile)

獨佔 (f) 鎖定 (針對目前的 UNIX 處理作業) 於$lockfile.

shuffle(\@deck)

就地隨機 (漁船) 混亂@deck.

sort_tables($content)

排序減價表格$content 根據每個表格的資料欄規格。

每一表格只能排序一個資料欄 (選擇性地為數字) n,遞減v 或遞增^ 訂單。

fixup_code($prefix, $type, @_)

分割$prefix 來自每個引數@_.

目的:$type 引數是實行特定的,但主要是用來植入editor.md "mode" 處理此內容於@_.

unload_package($pkg)

積極卸載Perl (分葉) 封裝$pkg 來自符號表 (STASH).

purge_from_inc(@paths)

移除@paths 來自@INC.

touch(@_)

觸碰所有檔案於@_。如果未傳送任何引數,則使用$_.

normalize_svn_path(@_)

將所有路徑標準化@_ 以安全方式用作原始引數SVN::Client 指令。

sanitize_relative_path(@_)

保護以下位置的路徑:@_ 用作純相對路徑Dotiac::DTL (Django 樣板) 路徑特定命令。

parse_filename($path)

包裝函式四周File::Basename::fileparse。不含引數,使用$_ 作為要剖析的檔案名稱。

walk_content_tree($code)

有條件地步行./content 組建系統取出樹狀結構;先標準化$_ 作為正式的內容根目錄子路徑,然後呼叫$code->() 在樹行道的每個項目上。

對大多數的組建而言,一律不會執行 walk — 而是組建依賴先前組建的快取資料。

強制散步的唯一方法是設定$path::use_cache 在使用者提供的模組中為 false 值。否則,此行為由下列項目由專家管理:增量建置技術.

如果實際繼續執行 walk,則傳回 1,而不是依賴快取的資料。否則會傳回假值。

archived($path)

每個旗標Status: archived $path (以自然語言特定的方式)。使用$_ 如果未傳送任何引數。

封存 Markdown 檔案是告訴 Orion 的自然方法”停止注意此檔案的永久連結位置”,除非再次更新,否則會重新整理存檔位置。特別是,封存的檔案不會出現在 Orion CMS 本身的目錄清單中;您必須瀏覽至即時頁面本身,才能在線上再次進行編輯。

seed_file_deps($path)

安全更新%path::dependencies 針對此$path,根據它dependencies 標頭glob(s).

預設使用$_ 作為路徑,若未傳送任何引數。

seed_file_acl($path)

安全更新@path::acl 針對此$path,根據它acl 標頭規格

預設使用$_ 作為路徑,若未傳送任何引數。

Load

相同於YAML::XS::Load.

Dump

相同於YAML::XS::Dump.