Orion API - 建置
建立系統
本文件涵蓋 組建系統 API.
基本上,建置系統由兩個使用者提供的 Perl 模組所管理:lib/path.pm 與lib/view.pm.
前的工作是做三件事:
- 載入
lib/facts.yml與lib/acl.yml, - 建構
@path::patterns,和 - 當機行走
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
最受歡迎 (和最複雜的) 檢視
此檢視包含檔案自動處理 (位於$path的附件目錄。也就是說,如果$path = "/foo.md.en",然後儲存於 中的檔案/foo.page/ 與目錄關聯的目錄”.en” 語言延伸將併入該範本可定址引數$path 無論preprocess 引數設定— 如果為 true,也會讓 **頁面的內容本身能夠存取該資料 **。
Mandatory Arguments:
templatepathlang
Optional Argmuents:
deps— 置換正常fetch_deps處理quick_deps— 內部折舊處理最佳化設定;最佳剩餘取消設定preprocess— 啟用範本處理$path內容本身,archive_root— 檔案位於”已封存” 狀態為”已複製” 並透過下列方式依年 / 月子資料夾追蹤至此內容根目錄的位置:ssi,category_root— 項目在”分類” 標頭為”已複製” 覆寫為內容根目錄位置中適當命名的類別資料夾ssi.
用於建立 index.html 和 sitemap.html 頁面
語言環境特定、已排序的相依性索引。
Mandatory Arguments:
pathlang
Optional Arguments:
quick_depsnestedpreprocess
根本不要建置這些元件。
改為建立關聯的產生來源檔案 (例如,.bib\$lang \$base.page/bibliography.yml\$lang) 將建立在次要建構系統執行上。
將 YAML 檔案轉換成 JSON。
Optional Arguments:
ext預設為jsonfilter預設為json_rawtemplate覆寫filter預設表示式
將 CSV 檔案轉換成 JSON。
Optional Arguments:
ext預設為jsonfilter預設為json_rawtemplate覆寫filter預設表示式
重構$data 引數 hashref 做為 2-element arrayrefs 的時戳排序 arrayref。
每個 2- 元素 arrayref 中的第一個項目是檔案 path-name,第二個元素則是產生的read_text_file 該 path-name 的 hashref。
傳回結果新來源檔案的清單,如果$quick > 2.
Mandatory Arguments:
pathdata- 輸入為 hashref;儲存傳回時產生的 dep 陣列參考資料quick- 預設為 2
SunStarSys::Util — 公用程式程式庫lib/path.pm 與lib/view.pm
Orion 的通用文字檔案處理器
剖析 UTF- 8 編碼檔案的 headers+content $file 並將結果儲存在 hashref 中$out. $content_lines 是要讀取的內容行數上限 (選擇性)。
傳回實際讀取的行數 (包含標頭) 。
$file 可以是原始字串的參照,代表檔案的完整內容。結果$out 將會依然以 UTF-8 編碼。
份數$src 至$dest 如果前者的修改時戳比後者的修改時戳新。
在複製時,加上 gzip 壓縮$dest 檔案 (如果是文字檔) 並新增”.gz” 名稱的副檔名。GZIP 設定可停用壓縮$ENV{NO_COPY_COMPRESS}=1.
fixup_code($prefix, $type, @_)
分割$prefix 來自每個引數@_.
目的:$type 引數是實行特定的,但主要是用來植入editor.md "mode" 處理此內容於@_.
有條件地步行./content 組建系統取出樹狀結構;先標準化$_ 作為正式的內容根目錄子路徑,然後呼叫$code->() 在樹行道的每個項目上。
對大多數的組建而言,一律不會執行 walk — 而是組建依賴先前組建的快取資料。
強制散步的唯一方法是設定$path::use_cache 在使用者提供的模組中為 false 值。否則,此行為由下列項目由專家管理:增量建置技術.
如果實際繼續執行 walk,則傳回 1,而不是依賴快取的資料。否則會傳回假值。
每個旗標Status: archived $path (以自然語言特定的方式)。使用$_ 如果未傳送任何引數。
封存 Markdown 檔案是告訴 Orion 的自然方法”停止注意此檔案的永久連結位置”,除非再次更新,否則會重新整理存檔位置。特別是,封存的檔案不會出現在 Orion CMS 本身的目錄清單中;您必須瀏覽至即時頁面本身,才能在線上再次進行編輯。
安全更新%path::dependencies 針對此$path,根據它dependencies 標頭glob(s).
預設使用$_ 作為路徑,若未傳送任何引數。
