É-02: Ţĥé ƒöŕḿàţ šýšţéḿ
Šüḿḿàŕý
Ƒöŕḿàţš àŕé þļüĝĝàƃļé ŕéàđéŕš àñđ ŵŕîţéŕš ţĥàţ çöñṽéŕţ ƃéţŵééñ öñ-đîšķ
ŕéþŕéšéñţàţîöñš àñđ ţĥé Þàŕţ šţŕéàḿ. Ţĥé ƒŕàḿéŵöŕķ šĥîþš à ƃŕöàđ šéţ öƒ ƃüîļţ-îñ
ƒöŕḿàţš üñđéŕ core/formats/, éàçĥ îḿþļéḿéñţîñĝ DataFormatReader àñđ
DataFormatWriter öñ ţöþ öƒ šĥàŕéđ BaseFormatReader / BaseFormatWriter
éḿƃéđš. À šîñĝļé FormatRegistry éẋþöšéš à ƒàçţöŕý-ƃàšéđ ļööķüþ ţĥàţ šéŕṽéš
ƃüîļţ-îñ àñđ þļüĝîñ ƒöŕḿàţš üñîƒöŕḿļý. Đéţéçţîöñ çàšçàđéš ţĥŕöüĝĥ éẋţéñšîöñ,
þŕîöŕîţý, àñđ çöñţéñţ šñîñĝ. Ƃýţé-éẋàçţ ŵŕîţé-ƃàçķ ŕîđéš öñé šķéļéţöñ šţöŕé
ţĥàţ éṽéŕý ŕéàđéŕ àñđ ŵŕîţéŕ þàîŕ ŵîŕéš ţĥé šàḿé ŵàý, àñđ à ŕéàđéŕ çļàššîƒîéš
îţš îñþüţ ţĥŕéé ŵàýš: ţŕàñšļàţàƃļé çöñţéñţ, þüŕé šţŕüçţüŕé, àñđ
ñöñ-ţŕàñšļàţàƃļé-ƃüţ-ḿéàñîñĝƒüļ çöñţéẋţ ţĥàţ ţĥé ŕéàđéŕ šüŕƒàçéš ţö ţööļš.
Çöñţéẋţ
Ţĥé ƒŕàḿéŵöŕķ ḿüšţ ŕéàđ à ļàŕĝé ṽàŕîéţý öƒ ƒîļé ƒöŕḿàţš àñđ ŵŕîţé ţĥéḿ ƃàçķ ŵîţĥ ƃýţé-éẋàçţ ƒîđéļîţý: éṽéŕý ñéŵļîñé, éṽéŕý éñţîţý ŕéƒéŕéñçé, éṽéŕý àţţŕîƃüţé ǫüöţé šţýļé. Ƒöŕḿàţš ṽàŕý ŵîđéļý îñ šţŕüçţüŕé: ļîñéàŕ ţéẋţ (þļàîñ ţéẋţ, Ḿàŕķđöŵñ), ţŕéé-šţŕüçţüŕéđ ḿàŕķüþ (ĤŢḾĻ, ẊḾĻ, ÖþéñẊḾĻ), ļîñé-öŕîéñţéđ ķéý-ṽàļüé (Ĵàṽà þŕöþéŕţîéš, Àþþļé šţŕîñĝš), ĝŕîđ-ƃàšéđ (ÇŠṼ, šþŕéàđšĥééţš), àñđ éẋçĥàñĝé-šþéçîƒîç (ẊĻÎƑƑ, ŢḾẊ, Ĝéţţéẋţ).
Ƒöŕḿàţš àļšö ƒŕéǫüéñţļý çöñţàîñ éḿƃéđđéđ çöñţéñţ îñ àñöţĥéŕ ƒöŕḿàţ (ĤŢḾĻ îñšîđé ĴŠÖÑ, Ḿàŕķđöŵñ îñšîđé ÇŠṼ), àñđ ţĥé ŕéàđéŕ/ŵŕîţéŕ çöñţŕàçţ ḿüšţ àççöḿḿöđàţé ţĥàţ ŕéçüŕšîöñ ŵîţĥöüţ šþéçîàļ çàšéš.
À šéçöñđ çöñšüḿéŕ çöḿþļîçàţéš ţĥé þîçţüŕé. Ţĥé ţŕàñšļàţîöñ þàţĥ ŵàñţš öñļý ţĥé þŕöšé à ĥüḿàñ ŵöüļđ ţŕàñšļàţé; ḿöđéļ îñĝéšţîöñ ŵàñţš àļļ ţéẋţüàļ çöñţéẋţ: çöđé ļîšţîñĝš, çàþţîöñš, àļţ-ţéẋţ, ƒöŕḿüļàš, đö-ñöţ-ţŕàñšļàţé šţŕîñĝš, çöñƒîĝ-éẋçļüđéđ ṽàļüéš, àñđ çöḿḿéñţš. À ţŵö-ŵàý çļàššîƒîçàţîöñ, ŵĥéŕé à ƒŕàĝḿéñţ ƃéçöḿéš éîţĥéŕ à ţŕàñšļàţàƃļé Ƃļöçķ öŕ öþàǫüé šķéļéţöñ ƃýţéš, ḿàķéš éṽéŕýţĥîñĝ ţĥé ƒîŕšţ çöñšüḿéŕ šķîþš îñṽîšîƃļé ţö ţĥé šéçöñđ.
Đéçîšîöñ
Ŕéàđéŕ àñđ ŵŕîţéŕ îñţéŕƒàçéš
Ţĥéšé îñţéŕƒàçéš îḿþļéḿéñţ ţĥé file šöüŕçé àñđ šîñķ ƃîñđîñĝ îñ
É-04. Öţĥéŕ ƃîñđîñĝš (ţĥé þŕöĵéçţ šţöŕé, à
.kpz ŵöŕķšþàçé, îñţéŕçĥàñĝé îḿþöŕţ/éẋþöŕţ) ƒééđ àñđ đŕàîñ ţĥé šàḿé Part
šţŕéàḿ ŵîţĥöüţ à ŕéàđéŕ öŕ ŵŕîţéŕ, šö à ƒļöŵ îš àĝñöšţîç ţö ŵĥéŕé îţš çöñţéñţ
éñţéŕš àñđ ļéàṽéš.
Éàçĥ îñţéŕƒàçé îš à çöḿþöšîţîöñ öƒ ñàŕŕöŵ ƒàçéţš, šö à çöñšüḿéŕ ţĥàţ öñļý ñééđš ţö îđéñţîƒý à ƒöŕḿàţ, öŕ öñļý ţö àþþļý çöñƒîĝüŕàţîöñ, çàñ đéþéñđ öñ ţĥàţ ƒàçéţ àļöñé:
type DataFormatReader interface {
FormatDescriptor // Name, DisplayName, Signature
Configurable // Config, SetConfig
PartReader // Open, Read, Close
}
type DataFormatWriter interface {
Name() string
OutputSink // SetOutput(path), SetOutputWriter(io.Writer)
SetLocale(locale model.LocaleID)
SetEncoding(encoding string)
PartWriter // Write, Close
}
Ţĥé ŕéàđéŕ ļîƒéçýçļé îš Open → Read → Close. Open àţţàçĥéš ţĥé ŕéàđéŕ ţö à
model.RawDocument (ŕàŵ ƃýţéš öŕ à šţŕéàḿîñĝ ŕéàđéŕ, þļüš ḿéţàđàţà šüçĥ àš
šöüŕçé ļöçàļé àñđ ƒîļé þàţĥ). Read ŕéţüŕñš à çĥàññéļ öƒ
model.PartResult{Part, Error}: ţĥé ŕéàđéŕ þŕöđüçéš Þàŕţš üñţîļ ţĥé đöçüḿéñţ îš
éẋĥàüšţéđ öŕ àñ éŕŕöŕ öççüŕš, ţĥéñ çļöšéš ţĥé çĥàññéļ. Close ŕéļéàšéš ĥéļđ
ŕéšöüŕçéš.
Ţĥé ŵŕîţéŕ ļîƒéçýçļé îš SetOutput → Write → Close. Write çöñšüḿéš à çĥàññéļ
öƒ *model.Part üñţîļ ţĥé çĥàññéļ çļöšéš, þŕöđüçîñĝ öüţþüţ öñ ţĥé ŵŕîţéŕ'š
đéšţîñàţîöñ.
Éṽéŕý ŕéàđ àñđ ŵŕîţé ŕüñš îñšîđé à šþàñ öñ ţĥé ƒŕàḿéŵöŕķ'š öƃšéŕṽàţîöñ šéàḿ
(format.read, format.write;
É-01), ŵĥîçĥ îš à ñö-öþ üñļéšš à
ĥöšţ ŕéĝîšţéŕš à ţŕàçéŕ.
ƂàšéƑöŕḿàţŔéàđéŕ àñđ ƂàšéƑöŕḿàţŴŕîţéŕ
BaseFormatReader àñđ BaseFormatWriter þŕöṽîđé šĥàŕéđ ƃéĥàṽîöüŕ ţĥàţ çöñçŕéţé
ƒöŕḿàţš éḿƃéđ:
- Đöçüḿéñţ-ļéṽéļ Ļàýéŕ ƃŕàçķéţîñĝ (
PartLayerStart/PartLayerEndƒöŕ ţĥé ŕööţ đöçüḿéñţ ļàýéŕ) - Ļöçàļé ḿéţàđàţà þŕöþàĝàţîöñ àñđ šöüŕçé/ţàŕĝéţ ļöçàļé àççéššöŕš
- Çöñšîšţéñţ éŕŕöŕ ĥàñđļîñĝ àñđ çĥàññéļ ļîƒéçýçļé
À çöñçŕéţé ƒöŕḿàţ îḿþļéḿéñţš ţĥé ƒöŕḿàţ-šþéçîƒîç þàŕšîñĝ àñđ šéŕîàļîžàţîöñ àñđ đéļéĝàţéš ļîƒéçýçļé ţö ţĥé ƃàšé éḿƃéđ.
À đöçüḿéñţ'š çĥàŕšéţ îš šéţţļéđ öñçé, àţ ţĥé îñĝéšţîöñ šéàḿ. Éṽéŕý çàļļéŕ
ţĥàţ ŕéàđš à đöçüḿéñţ öþéñš îţ ţĥŕöüĝĥ format.OpenDocument, ŵĥîçĥ đéçöđéš
ţĥé ƃýţéš ţö ÜŢƑ-8 ƃéƒöŕé ţĥé ŕéàđéŕ šééš ţĥéḿ: à ƃýţé-öŕđéŕ ḿàŕķ ŵîñš, ţĥéñ
ţĥé đéçļàŕéđ éñçöđîñĝ (--encoding, ţĥé ŕéçîþé'š defaults.encoding), àñđ
ŵîţĥ ñéîţĥéŕ ţĥé ƃýţéš þàšš ţĥŕöüĝĥ àš ÜŢƑ-8. Ţĥé ŕéàđéŕ ŕéçöŕđš ţĥé šéţţļéđ
éñçöđîñĝ öñ ţĥé ŕööţ Layer, àñđ à ŕéàđéŕ ŵîţĥ à çĥàŕšéţ ĥéüŕîšţîç öƒ îţš öŵñ
(ţĥé ẊḾĻ þŕöļöĝ, ţĥé ÞÖ ĥéàđéŕ) àþþļîéš îţ öñļý ţö à đöçüḿéñţ ţĥé šéàḿ ļéƒţ
üñšéţţļéđ. Öñ ţĥé ŵàý öüţ BaseFormatWriter.SetEncoding îñšţàļļš ţĥé ḿàţçĥîñĝ
éñçöđéŕ, šö à ŵŕîţéŕ šéŕîàļîšéš ÜŢƑ-8 àñđ ţĥé ƃàšé éñçöđéš ţĥé ŵĥöļé šţŕéàḿ îñ
ţĥé ŕüñ'š çĥàŕšéţ. À ƒöŕḿàţ ŵĥöšé ƃýţéš àŕé ñöţ ţéẋţ đéçļàŕéš Binary öñ îţš
šîĝñàţüŕé àñđ îţš ŵŕîţéŕ, àñđ ţĥé šéàḿ ĥàñđš îţ ţĥé ƃýţéš àš ţĥéý àŕé. Ţĥé
çöñţŕîƃüţöŕ ĝüîđé'š đöçüḿéñţ éñçöđîñĝ
šéçţîöñ šţàţéš ţĥé ŕüļé ƒöŕ à ƒöŕḿàţ àüţĥöŕ.
BaseFormatWriter àļšö öŵñš ţĥé šĥàŕéđ ƃýţé-ļéṽéļ öüţþüţ öþţîöñš
(format.OutputOptions): output.bom (add|remove|keep), output.newline
(lf|crlf|keep), àñđ output.encoding (àñý çĥàŕšéţ îñ core/encoding; àñ
éẋþļîçîţ ṽàļüé ŵîñš öṽéŕ ţĥé ŕüñ'š éñçöđîñĝ). Ŕéàđéŕš àļŕéàđý ñöŕḿàļîžé ƂÖḾ àñđ
ñéŵļîñéš àţ þàŕšé ţîḿé, šö ţĥéšé éẋîšţ öñļý ţö çöñţŕöļ öüţþüţ šţýļé; ţĥéý
àŕé ŵŕîţéŕ çöñƒîĝüŕàţîöñ ŕàţĥéŕ ţĥàñ à þîþéļîñé šţàĝé. Ţĥéý àŕé šéţ üñđéŕ ţĥé
ŕéšéŕṽéđ output ķéý öƒ ţĥé öŕđîñàŕý þéŕ-ƒöŕḿàţ çöñƒîĝ
(defaults.formats[<id>].config îñ à kapi.yaml ŕéçîþé);
format.SplitOutputConfig šţŕîþš ţĥàţ ķéý ƃéƒöŕé þéŕ-ƒöŕḿàţ ŕéàđéŕ/ŵŕîţéŕ çöñƒîĝ
îš àþþļîéđ, àñđ ţĥé ƃàšé ŵŕîţéŕ ŵŕàþš îţš öüţþüţ šţŕéàḿ ŵîţĥ ţĥé þöšţ-éñçöđé çĥàîñ
(ñéŵļîñé çöñṽéŕšîöñ → ƂÖḾ þöļîçý → çĥàŕšéţ éñçöđîñĝ), šö éṽéŕý ŵŕîţéŕ ţĥàţ éḿƃéđš
ţĥé ƃàšé îñĥéŕîţš ţĥé ƃéĥàṽîöüŕ ŵîţĥ ñö þéŕ-ƒöŕḿàţ çöđé.
Ƃüîļţ-îñ ƒöŕḿàţš
Ţĥé ƃüîļţ-îñ ƒöŕḿàţš üñđéŕ core/formats/ šþàñ šéṽéŕàļ ƒàḿîļîéš:
- Ḿàŕķüþ: ĤŢḾĻ, ẊḾĻ, Ḿàŕķđöŵñ / ḾĐẊ, ÀšçîîĐöç, àñđ šţŕüçţüŕéđ-đöçüḿéñţ ƒöŕḿàţš.
- Ţŕàñšļàţîöñ éẋçĥàñĝé: ẊĻÎƑƑ 1.2 / 2.ẋ, ŢḾẊ, Ĝéţţéẋţ ÞÖ/ḾÖ.
- Šţŕüçţüŕéđ đàţà: ĴŠÖÑ, ÝÀḾĻ, ÇŠṼ/ŢŠṼ, àñđ đéšîĝñ-ţöķéñ àñđ àþþ
ḿéššàĝé-çàţàļöĝ ṽàŕîàñţš (
xcstrings,arb,i18next,resx, Àñđŕöîđ šţŕîñĝš, Àþþļé šţŕîñĝš, …). - Öƒƒîçé àñđ þüƃļîšĥîñĝ: ÖþéñẊḾĻ (
.docx,.xlsx,.pptx), ÖĐƑ, ÉÞÜƂ, àñđ ŕéļàţéđ þàçķàĝéđ ƒöŕḿàţš. - Šüƃţîţļé àñđ ḿéđîà: ŠŔŢ, ṼŢŢ, þļüš àüđîö, ṽîđéö àñđ îḿàĝé ŕéàđéŕš. ÞĐƑ
àñđ šöüŕçé çöđé àŕŕîṽé àš þļüĝîñ ƒöŕḿàţš (
kapi-pdfium,kapi-sourcecode; É-05, É-08), ŵîţĥ ţĥéîŕ çöñƒîĝ đéƒîñîţîöñš üñđéŕcore/formats/šö éàçĥ ƒöŕḿàţ ĥàš öñé šçĥéḿà ŵĥéŕéṽéŕ îţš ŕéàđéŕ ŕüñš.
Ţĥé ƒüļļ, àüţĥöŕîţàţîṽé ļîšţ öƒ ŕéĝîšţéŕéđ ƒöŕḿàţš (ŵîţĥ éẋţéñšîöñš, ḾÎḾÉ ţýþéš, àñđ þéŕ-ƒöŕḿàţ öþţîöñš) îš ţĥé ĝéñéŕàţéđ Ƒöŕḿàţ Ŕéƒéŕéñçé. Îţ îš đéŕîṽéđ ƒŕöḿ ţĥé ļîṽé ŕéĝîšţŕý, šö îţ ñéṽéŕ đŕîƒţš ƒŕöḿ ţĥé çöđé.
À ƒöŕḿàţ þàçķàĝé üñđéŕ core/formats/<name>/ ţýþîçàļļý çöñţàîñš reader.go,
writer.go, àñđ config.go; à ŕéàđ-öñļý ƒöŕḿàţ ĥàš ñö ŵŕîţéŕ.
formats.RegisterAll(reg, opts...) îñ core/formats/register.go ŕéĝîšţéŕš
éṽéŕý ƃüîļţ-îñ ƒàçţöŕý, àñđ ţĥé ĥöšţ çàļļš îţ ŵĥéñ îţ ƃüîļđš îţš ŕéĝîšţŕý.
ƑöŕḿàţŔéĝîšţŕý
À šîñĝļé *registry.FormatRegistry éẋþöšéš ƒàçţöŕý ļööķüþ. Ñàḿéš àŕé ţĥé
FormatID šţŕîñĝ ţýþé; ŕéĝîšţŕàţîöñ ţàķéš à ƒàçţöŕý þļüš šţàţîç ḿéţàđàţà, šö ñö
ŕéàđéŕ îñšţàñçé îš ƃüîļţ àţ šţàŕţüþ:
func (r *FormatRegistry) RegisterReader(name FormatID, factory FormatReaderFactory, sig format.FormatSignature, displayName string)
func (r *FormatRegistry) RegisterWriter(name FormatID, factory FormatWriterFactory)
func (r *FormatRegistry) NewReader(name FormatID) (format.DataFormatReader, error)
func (r *FormatRegistry) NewWriter(name FormatID) (format.DataFormatWriter, error)
func (r *FormatRegistry) FormatInfos() []FormatInfo
func (r *FormatRegistry) Detect(path string, opts DetectOptions) (FormatID, error)
Ţŵö ţîéŕš öƒ ŕéĝîšţŕàţîöñ ḿàķé ƃüîļţ-îñ àñđ þļüĝîñ ƒöŕḿàţš îñđîšţîñĝüîšĥàƃļé ţö çàļļéŕš:
- Ƃüîļţ-îñš: ŕéĝîšţéŕéđ ƃý
formats.RegisterAllŵĥéñ ţĥé ĥöšţ šţàŕţš. - Þļüĝîñ ƒöŕḿàţš: ŕéĝîšţéŕéđ ƃý
pluginhost.RegisterModeCFormatsƒŕöḿ ţĥéformatsçàþàƃîļîţý éàçĥ þļüĝîñ'šmanifest.jsonđéçļàŕéš, ŕéàđ ƒŕöḿ đîšķ đüŕîñĝ đîšçöṽéŕý ŵîţĥöüţ ļàüñçĥîñĝ à šüƃþŕöçéšš. Ţĥé ḿàñîƒéšţ šééđš ţĥé ƒöŕḿàţ'š ḿéţàđàţà (ñàḿé, éẋţéñšîöñš, ḾÎḾÉ ţýþéš, ţĥégenerativeàñđinterchangeçàþàƃîļîţîéš, àñđ ţĥé àţţŕîƃüţéš àñđ çöđé ţýþéš îţš ŵŕîţéŕ ŵŕîţéš); ţĥé ŕéàđéŕ àñđ ŵŕîţéŕ ƒàçţöŕîéš đîàļ ţĥé þļüĝîñ'š Ḿöđé-Ç đàéḿöñ öñ đéḿàñđ (É-05). À þļüĝîñ ƒöŕḿàţ ŵîţĥ ţĥé šàḿé ñàḿé àš à ƃüîļţ-îñ öṽéŕŕîđéš îţ, ƃéçàüšé îñšţàļļîñĝ à þļüĝîñ ƒöŕ à ƒöŕḿàţ îš àñ éẋþļîçîţ šîĝñàļ ţö þŕéƒéŕ îţ; ţŵö þļüĝîñš çļàîḿîñĝ öñé ñàḿé ķééþ ţĥé ƒîŕšţ ŕéĝîšţéŕéđ.
À ƒöŕḿàţ ŕéƒéŕéñçé îñ üšéŕ-ƒàçîñĝ çöñƒîĝüŕàţîöñ üšéš ţĥé šýñţàẋ
name[@engine][@version][:preset], é.ĝ. okf_html@1.46.0:wellFormed öŕ
html@okapi-bridge. À ţöķéñ àƒţéŕ @ ţĥàţ šţàŕţš ŵîţĥ à đîĝîţ îš à ṽéŕšîöñ;
àñý öţĥéŕ ñàḿéš ţĥé éñĝîñé ŵĥöšé ƒöŕḿàţ ƒöŕ ţĥé šàḿé éẋţéñšîöñš ţĥé ŕéƒéŕéñçé
ḿéàñš (FormatRegistry.EngineFormat). Ţĥé ŕéĝîšţŕý ŕéšöļṽéš ţĥé ŕéƒéŕéñçé ţö
ţĥé àþþŕöþŕîàţé ƒàçţöŕý.
Ƒöŕḿàţ đéţéçţîöñ
Detect(path, DetectOptions) ŕéšöļṽéš ţĥé ƒöŕḿàţ ƒöŕ à þàţĥ, àñđ
Resolve(path, DetectOptions) îš ţĥé šàḿé çàļļ ŵîţĥ ţĥé đéçîšîöñ ŕéþöŕţéđ
(ţĥé ƒöŕḿàţ, îţš éñĝîñé, ţĥé ŕüļé ţĥàţ çĥöšé ţĥé éñĝîñé, àñđ éṽéŕý çļàîḿàñţ).
Éṽéŕý šüŕƒàçé ţĥàţ đéţéçţš à ƒöŕḿàţ ƒöŕ à ñàḿéđ ƒîļé ĝöéš ţĥŕöüĝĥ îţ: ţĥé ţööļ
àñđ ƒļöŵ ŕüññéŕš, ţĥé ţööļƃöẋ, þŕöĵéçţ çöñţéñţ ŕéšöļüţîöñ, ḿéŕĝé àñđ ţĥé
đéšķţöþ. À ƒîļé ŕéšöļṽéš ţö ţĥé šàḿé ƒöŕḿàţ ƒŕöḿ éàçĥ, àñđ kapi formats explain þŕîñţš ţĥé đéçîšîöñ ƒöŕ öñé.
Ŕéšöļüţîöñ ŕàñķš éñĝîñéš ƃéƒöŕé ƒöŕḿàţš. Àñ éñĝîñé îš à ƒöŕḿàţ þŕöṽîđéŕ: ţĥé
ƃüîļţ-îñ ƒöŕḿàţš (native) öŕ öñé þļüĝîñ. Ƒöŕ àñ éẋţéñšîöñ šéṽéŕàļ éñĝîñéš
çļàîḿ, ţĥé éñĝîñé öŕđéŕ đéçîđéš ţĥé þŕöṽîđéŕ, ƒîŕšţ ţö ļàšţ: à þéŕ-ƒöŕḿàţ þîñ
(DetectOptions.FormatEngines, ƒŕöḿ à ŕéçîþé'š
defaults.formats.<name>.engine), ţĥé ĥöšţ'š öṽéŕŕîđé (SetEngineOverride,
ƒŕöḿ --engine), ţĥé đéţéçţîöñ'š þŕéƒéŕéñçé (DetectOptions.Engine, ƒŕöḿ
defaults.engine), ţĥé ĥöšţ'š đéƒàüļţ (SetDefaultEngine, ƒŕöḿ ţĥé çöñƒîĝ'š
formats.engine), ţĥé ƃüîļţ-îñ ƒöŕḿàţš, ţĥé ŕàñķéđ þļüĝîñš
(DetectOptions.EngineOrder, ƒŕöḿ plugins.<name>.format_priority), ţĥéñ
éṽéŕý öţĥéŕ šöüŕçé îñ ñàḿé öŕđéŕ. Ţĥé ƒîŕšţ éñĝîñé ŵîţĥ à çļàîḿàñţ ŵîñš. À
þŕîöŕîţý ñéṽéŕ ḿöṽéš à ƒöŕḿàţ àçŕöšš éñĝîñéš: ŵîţĥîñ ţĥé çĥöšéñ éñĝîñé, ţĥé
ƒîļé ĥéàđ đéçîđéš ŵĥéñ šéṽéŕàļ öƒ îţš ƒöŕḿàţš çļàîḿ ţĥé éẋţéñšîöñ (.xliff
çàñ ƃé ẊĻÎƑƑ 1.ẋ öŕ 2.ẋ; .xml îš çļàîḿéđ ƃý šéṽéŕàļ ƒöŕḿàţš), àñđ ţĥé
ƒöŕḿàţš' þŕîöŕîţîéš đéçîđé öţĥéŕŵîšé. DetectOptions àļšö çàŕŕîéš
ExtensionOnly ƒöŕ ţĥé đéţéŕḿîñîšţîç þîçķ ŵîţĥöüţ ŕéàđîñĝ ţĥé ƒîļé,
AllowedSources ƒöŕ ţĥé þŕöĵéçţ'š šöüŕçé ŕéšţŕîçţîöñ, PriorityOverrides ƒöŕ
þéŕ-çàļļ þŕîöŕîţîéš àñđ Writer ţö ŕéšöļṽé ţĥé ƒöŕḿàţ ţĥàţ ŵŕîţéš à þàţĥ.
Öñļý ţĥé ĥéàđ öƒ ţĥé ƒîļé îš ŕéàđ; àñý ŕéàđ éŕŕöŕ ƒàļļš ƃàçķ ţö ţĥé éẋţéñšîöñ
þîçķ. WriterFormatFor ŕéšöļṽéš ţĥé ŵŕîţéŕ ƒöŕ àñ öüţþüţ þàţĥ ŵîţĥîñ ţĥé
ŕéàđéŕ'š éñĝîñé ƒîŕšţ, šö à ƒöŕḿàţ ñàḿéđ ŵîţĥ --format þîñš ţĥé ŕéàđéŕ àñđ
ţĥé ŵŕîţéŕ ţö öñé éñĝîñé.
Éàçĥ ƒöŕḿàţ ŕéĝîšţéŕš à FormatSignature đéçļàŕîñĝ ţĥé ḾÎḾÉ ţýþéš, éẋţéñšîöñš,
ḿàĝîç ƃýţéš, àñđ öþţîöñàļ šñ ƒüñçţîöñ îţ çļàîḿš, šö ţĥé çàšçàđé îš đàţà-đŕîṽéñ
ŕàţĥéŕ ţĥàñ ĥàŕđçöđéđ. FormatSignature.Binary ḿàŕķš à ƒöŕḿàţ ŵĥöšé ŕéàđéŕ
çöñšüḿéš ƃîñàŕý çöñţéñţ, šö đéţéçţîöñ đöéš ñöţ đéçļîñé îţ ƒöŕ ƃîñàŕý îñþüţ ţĥé
ŵàý îţ đéçļîñéš à ţéẋţ ƒöŕḿàţ ḿàţçĥéđ öñļý ƃý éẋţéñšîöñ.
ķàþî'š öŵñ öñ-đîšķ çöñṽéñţîöñš üšé çöḿþöüñđ šüƒƒîẋéš (.kbf.json,
.memory.json, .terms.json, .overlays.json, .overlays.jsonl) šö ţĥé
ḿàŕķéŕ šüŕṽîṽéš ŵĥîļé ţĥé ƒîļé šţîļļ ŕéàđš àš ţĥé ĴŠÖÑ îţ îš. path/filepath.Ext
ŕéþöŕţš .json ƒöŕ àļļ öƒ ţĥéḿ, šö éẋţéñšîöñ-đŕîṽéñ çöđé ĝöéš ţĥŕöüĝĥ
format.Ext / TrimExt / Stem îñšţéàđ, ŵĥîçĥ ŕéţüŕñ ţĥé ḿöšţ šþéçîƒîç
ŕéĝîšţéŕéđ šüƒƒîẋ.
Ţĥé šķéļéţöñ šţöŕé
Ñöñ-ţŕàñšļàţàƃļé çöñţéñţ îš þŕéšéŕṽéđ ƒöŕ ŵŕîţé-ƃàçķ ƃý öñé ḿéçĥàñîšḿ:
format.SkeletonStore, àñ àþþéñđ-öñļý šéǫüéñçé öƒ ţýþéđ éñţŕîéš ţĥé ŕéàđéŕ
éḿîţš đüŕîñĝ éẋţŕàçţîöñ àñđ ţĥé ŵŕîţéŕ ŕéþļàýš đüŕîñĝ ŕéçöñšţŕüçţîöñ. Ţĥé
þîþéļîñé ñéṽéŕ šééš îţ; ţööļš çàŕŕý öñļý ƃļöçķš. À ŕéàđéŕ ţĥàţ þŕöđüçéš öñé
îḿþļéḿéñţš SkeletonStoreEmitter, à ŵŕîţéŕ ţĥàţ çöñšüḿéš öñé
SkeletonStoreConsumer, àñđ ñéàŕļý éṽéŕý ƃüîļţ-îñ ƒöŕḿàţ đöéš ƃöţĥ. À šķéļéţöñ
îš ţĥé ţýþéđ šçàƒƒöļđîñĝ öƒ öñé ƒöŕḿàţ, šö format.WireSkeleton çöññéçţš à
ŕéàđéŕ ţö à ŵŕîţéŕ öñļý ŵĥéñ ţĥéý àŕé ţĥé šàḿé ƒöŕḿàţ (šéé "Šķéļéţöñš àŕé ţýþéđ
þéŕ ƒöŕḿàţ" ƃéļöŵ).
Ţĥé šţöŕé ĥàš šéṽéŕàļ ƃàçķîñĝš ƃéĥîñđ öñé ÀÞÎ: à ţéḿþ ƒîļé
(NewSkeletonStore), ḿéḿöŕý (NewMemorySkeletonStore), ñöţĥîñĝ àţ àļļ ƒöŕ à
þàšš ţĥàţ ŕéàđš à đöçüḿéñţ àñđ ŵŕîţéš ñöñé (NewDiscardSkeletonStore, ŵĥîçĥ
format.NewWiredReadSkeleton ŵîŕéš šö à ŕéàđ šééš ţĥé ƃļöçķš à ŵŕîţé ŵöüļđ), à
çöñçüŕŕéñţ çĥàññéļ ƒöŕ šţŕéàḿîñĝ þàîŕš (NewStreamingSkeletonStore), àñđ à
þéŕšîšţéđ ƒîļé ţĥàţ
öüţļîṽéš ţĥé þŕöçéšš (NewSkeletonStoreAt / OpenSkeletonStore,
NewSkeletonStoreFromBytes), ŵĥîçĥ îš ĥöŵ à .kpz ŵöŕķšþàçé çàŕŕîéš à šķéļéţöñ
ƃéţŵééñ extract àñđ merge. format.NewWiredSkeleton(reader, writer) îš ţĥé
öñé šéàḿ éṽéŕý ŕüññéŕ üšéš ţö ĝîṽé à šàḿé-ƒöŕḿàţ ŕöüñđ ţŕîþ îţš šţöŕé. Îţ
ŕéţüŕñš ñö šţöŕé ƒöŕ à þàîŕ ŵîţĥ ñö šķéļéţöñ þàţĥ, àñđ îţ ŕéţüŕñš àñ éŕŕöŕ ŵĥéñ
à šţöŕé îš ñééđéđ àñđ çàññöţ ƃé çŕéàţéđ; ţĥàţ éŕŕöŕ îš ñéṽéŕ šŵàļļöŵéđ, ƃéçàüšé
šîļéñţļý ŕéçöñšţŕüçţîñĝ ƒŕöḿ ţĥé çöñţéñţ ḿöđéļ ŵöüļđ đŕöþ šţŕüçţüŕé ţĥé ŕéàđéŕ
çöüļđ ñöţ ḿöđéļ ŵĥîļé ţĥé çöḿḿàñđ šţîļļ ŕéþöŕţéđ šüççéšš.
Ţŵö éñţŕý ţýþéš ḿàķé àñ üñţöüçĥéđ đöçüḿéñţ ŕöüñđ-ţŕîþ ƃýţé ƒöŕ ƃýţé éṽéñ ŵĥéŕé
éẋţŕàçţîöñ ñöŕḿàļîžéđ îţš ţéẋţ. À ŕéàđéŕ ţĥàţ çöļļàþšéš ŵĥîţéšþàçé öñ ţĥé ŵàý îñ
ŵŕîţéš ţĥé šöüŕçé ƃýţéš ƃéšîđé ţĥé ŕéƒéŕéñçé (SkeletonOriginal); ţĥé ŵŕîţéŕ
ŕéþļàýš ţĥöšé ƃýţéš ŵĥîļé ţĥé ƃļöçķ îš üñéđîţéđ àñđ ŕéñđéŕš ţĥé ƃļöçķ öñļý öñçé
îţ ĥàš çĥàñĝéđ. SkeletonTrimmed đöéš ţĥé šàḿé ƒöŕ ţĥé ƃýţéš à ŕéàđéŕ ţŕîḿḿéđ
àƒţéŕ à ƃļöçķ. Éẋţŕàçţîöñ šţîļļ ýîéļđš çļéàñ ţéẋţ, àñđ à ñö-öþ ŕöüñđ ţŕîþ îš ţĥé
îđéñţîţý.
À ŵŕîţéŕ ĝîṽéñ ñö šţöŕé ƒàļļš ƃàçķ îñ à ƒîẋéđ öŕđéŕ: ŕé-þàŕšé ţĥé öŕîĝîñàļ
đöçüḿéñţ (OriginalContentSetter / SourcePathSetter) àñđ þàţçĥ ţŕàñšļàţîöñš
îñţö îţ, öŕ, ƒàîļîñĝ ţĥàţ, ƃüîļđ ţĥé đöçüḿéñţ ƒŕöḿ ţĥé ƃļöçķš àļöñé. Ţĥé
ƒàļļƃàçķš ţŕàđé ƒîđéļîţý ƒöŕ àṽàîļàƃîļîţý àñđ éẋîšţ ƒöŕ ţĥé çŕöšš-ƒöŕḿàţ àñđ
ñö-šöüŕçé çàšéš; à šàḿé-ƒöŕḿàţ ŕüñ àļŵàýš ĥàš ţĥé šţöŕé. Šéé
Šķéļéţöñ šţöŕé àñđ šţŕéàḿîñĝ
ƒöŕ ţĥé éñţŕý ƒöŕḿàţ, ţĥé šüƃ-šķéļéţöñ àñđ ţĥé šţŕéàḿîñĝ þŕöţöçöļ.
Šţŕéàḿîñĝ ŕéàđéŕš àñđ ƃöüñđéđ-ḿéḿöŕý Î/Ö
Ţĥé ŕéàđ → þŕöçéšš → ŵŕîţé þàţĥ šţŕéàḿš éñđ-ţö-éñđ šö þéàķ ḿéḿöŕý ţŕàçķš à ƃöüñđéđ ŵîñđöŵ, ñöţ ţĥé đöçüḿéñţ šîžé. Ţĥŕéé éđĝéš çööþéŕàţé:
- Šöüŕçé éđĝé. Ţĥé ƒîļé-ŕüñ þàţĥ (
core/flow.FileRunner) ĥàñđš ţĥé ŕéàđéŕ à šţŕéàḿîñĝ, ƃýţé-ƃüđĝéţéđio.ReadCloseröṽéŕ ţĥé ƒîļé (core/safeioéñƒöŕçéđ üñîƒöŕḿļý) îñšţéàđ öƒ ŕéàđîñĝ ţĥé ŵĥöļé ƒîļé îñţö à ƃüƒƒéŕ üþ ƒŕöñţ. À ļîñé öŕ ŕéçöŕđ ŕéàđéŕ þüļļš ƃýţéš öñ đéḿàñđ àñđ ñéṽéŕ ĥöļđš ţĥé ŵĥöļé îñþüţ; à ŵĥöļé-đöçüḿéñţ ŕéàđéŕ šţîļļ ŕéàđš îţ öñçé, îñ ƒüļļ. - Ŕéàđéŕ → éẋéçüţöŕ. Ŵĥéñ ţĥé ŕéàđéŕ đéçļàŕéš ţĥé
format.StreamingReaderçàþàƃîļîţý, îţšReadçĥàññéļ îš ƒéđ šţŕàîĝĥţ îñţö ţĥé éẋéçüţöŕ ŕàţĥéŕ ţĥàñ ƃéîñĝ çöļļéçţéđ îñţö à[]*Partšļîçé ƃéţŵééñ ŕéàđéŕ àñđ ţööļš, šö ţĥé ŕéàđéŕ ŕüñš çöñçüŕŕéñţļý ŵîţĥ ţĥé ŵŕîţéŕ. Ţĥîš îš ĝàţéđ öñ ţĥé çàþàƃîļîţý ƃéçàüšé îţ öṽéŕļàþš ţĥé ŕéàđ àñđ ţĥé ŵŕîţé: öñļý îñ-þŕöçéšš, þüŕé-Ĝö ŕéàđéŕš ḿàý öþţ îñ, ñéṽéŕ à đàéḿöñ-ƃàçķéđ þļüĝîñ, ŵĥîçĥ ķééþš ţĥé ŕéàđ-ƒüļļý-ţĥéñ-ŵŕîţé öŕđéŕ îţš öñé-šţŕéàḿ-àţ-à-ţîḿé çöñţŕàçţ ŕéǫüîŕéš. - Šķéļéţöñ. À ƃýţé-éẋàçţ ŕöüñđ-ţŕîþ ñééđš ţĥé šķéļéţöñ, ƃüţ ţĥé ƃüƒƒéŕéđ
šķéļéţöñ ŵŕîţéŕ çöļļéçţš éṽéŕý ƃļöçķ îñţö à ḿàþ àñđ ŕéþļàýš ţĥé šķéļéţöñ öñļý
àƒţéŕ îţ îš ƒüļļý ŵŕîţţéñ: Ö(ƃļöçķš) ḿéḿöŕý. À ŕéàđéŕ àñđ ŵŕîţéŕ ţĥàţ ƃöţĥ
đéçļàŕé šţŕéàḿîñĝ (
StreamingReader+format.StreamingWriter) îñšţéàđ šĥàŕé à çöñçüŕŕéñţ, çĥàññéļ-ƃàçķéđ šķéļéţöñ šţöŕé: ţĥé ŕéàđéŕ àþþéñđš éñţŕîéš ŵĥîļé ţĥé ŵŕîţéŕ þöþš ţĥéḿ, çöñšüḿîñĝ éàçĥSkeletonRef'š ƃļöçķ ƒŕöḿ ţĥé Þàŕţ šţŕéàḿ öñ đéḿàñđ (format.StreamSkeletonWrite). Ƃéçàüšé à šţŕéàḿîñĝ ŕéàđéŕ éḿîţš ŕ郚 àñđ ţĥéîŕ ƃļöçķš îñ ţĥé šàḿé öŕđéŕ, ţĥé þéñđîñĝ-ƃļöçķ ŵîñđöŵ šţàýš šḿàļļ. Öüţþüţ îš ƃýţé-îđéñţîçàļ ţö ţĥé ƃüƒƒéŕéđ šķéļéţöñ þàţĥ: ţĥé šàḿé éñţŕîéš îñ ţĥé šàḿé öŕđéŕ, ĵüšţ çöñšüḿéđ îñţéŕļéàṽéđ îñšţéàđ öƒ àƒţéŕ à ƒļüšĥ. Ƃöţĥ çàþàƃîļîţîéš àŕé ƃàŕé ḿàŕķéŕš (StreamingReader()/StreamingWriter()), þŕöƃéđ ṽîàIsStreamingReader/IsStreamingWriter; à ŵŕîţéŕ šîĝñàļš îţ ţööķ ţĥé šţŕéàḿîñĝ þàţĥ ƃý çĥéçķîñĝSkeletonStore.IsStreaming()îñWrite.
À ƒöŕḿàţ šţŕéàḿš ŵĥéñ ƃöţĥ îţš ŕéàđéŕ àñđ îţš ŵŕîţéŕ đéçļàŕé ţĥé ḿàŕķéŕš. Ţĥé
ŕéçöŕđ- àñđ éñţŕý-öŕîéñţéđ ƒöŕḿàţš đö, ĥöļđîñĝ öñļý ţĥé îñ-þŕöĝŕéšš üñîţ, àñđ
ţĥé ĝéñéŕàţéđ Ƒöŕḿàţ Ŕéƒéŕéñçé šàýš ŵĥîçĥ. Ţĥé ƒîļé ŕüññéŕ đéçîđéš
öñçé þéŕ ŕüñ, îñ ţŵö šţéþš (streamingFeed, ţĥéñ wireSkeleton): à šţŕéàḿîñĝ
ŕéàđéŕ ŵîţĥ ñö þŕé-ŕéàđ šöüŕçé îš ƒéđ çöñçüŕŕéñţļý, àñđ à šţŕéàḿîñĝ ŵŕîţéŕ ţĥéñ
ŕéçéîṽéš ţĥé çĥàññéļ-ƃàçķéđ šţöŕé; àñý öţĥéŕ þàîŕ ŕéçéîṽéš ţĥé ţéḿþ-ƒîļé šţöŕé.
Éàçĥ šţŕéàḿîñĝ ŵŕîţéŕ'š SkeletonRef ŕéñđéŕîñĝ îš ƒàçţöŕéđ îñţö à šĥàŕéđ ĥéļþéŕ
šö ţĥé ƃüƒƒéŕéđ àñđ šţŕéàḿîñĝ šķéļéţöñ þàţĥš àŕé ƃýţé-îđéñţîçàļ.
À ƒöŕḿàţ ţĥàţ ḿüšţ ḿàţéŕîàļîšé îţš ŵĥöļé îñþüţ ţö þàŕšé îţ (à þàçķàĝéđ
žîþ-ƃàçķéđ ƒöŕḿàţ, à ĐÖḾ-ƃüîļđîñĝ ḿàŕķüþ ŕéàđéŕ) đöéš ñöţ đéçļàŕé ţĥé
çàþàƃîļîţý, àñđ à üñîƒöŕḿ ƒàļļƃàçķ ķééþš îţš öüţþüţ ƃýţé-îđéñţîçàļ. Ţĥé çöñţàîñéŕ
þàţĥ đŕîṽéš öñé àŕçĥîṽé éñţŕý ţĥŕöüĝĥ FileRunner.RunStream (ƃýţéš îñ, ƃýţéš
öüţ, ñö ţéḿþ ƒîļé); à šţŕéàḿîñĝ-çàþàƃļé îññéŕ ƒöŕḿàţ îš ñöţ éṽéñ ƃüƒƒéŕéđ ŵĥöļé
(É-04).
Ŵŕîţéŕ öüţþüţ ḿöđéš: ĝéñéŕàţîṽé ṽš šķéļéţöñ-ƃöüñđ
À šķéļéţöñ îš ƒöŕḿàţ-šþéçîƒîç: îţ îš ţĥé ñöñ-ţŕàñšļàţàƃļé šçàƒƒöļđîñĝ öƒ öñé ƒîļé, çàþţüŕéđ ƃý ţĥàţ ƒöŕḿàţ'š ŕéàđéŕ. Šö à ŵŕîţéŕ'š àƃîļîţý ţö þŕöđüçé öüţþüţ đéþéñđš öñ ŵĥéţĥéŕ îţ çàñ ƃüîļđ à ŵĥöļé đöçüḿéñţ ƒŕöḿ ţĥé çöñţéñţ ḿöđéļ àļöñé, öŕ öñļý ƃý îñĵéçţîñĝ ţŕàñšļàţéđ ţéẋţ ƃàçķ îñţö à šķéļéţöñ îţ ŵàš ĝîṽéñ. Ţŵö öŕţĥöĝöñàļ çàþàƃîļîţîéš çàþţüŕé ţĥîš:
- Ĝéñéŕàţîṽé: ţĥé ŵŕîţéŕ çàñ šéŕîàļîžé à çöḿþļéţé, ṽàļîđ đöçüḿéñţ ƒŕöḿ ţĥé çöñţéñţ ḿöđéļ (ŕöļéš, ŕüñš, šţŕüçţüŕé) ŵîţĥ ñö šķéļéţöñ.
- Šķéļéţöñ-çöñšüḿîñĝ: ţĥé ŵŕîţéŕ üšéš à šķéļéţöñ ŵĥéñ ĝîṽéñ öñé, ƒöŕ
ƃýţé-éẋàçţ ƒîđéļîţý, ṽîà ţĥé
SkeletonStoreConsumerîñţéŕƒàçé. Îţ šàýš ţĥé ŵŕîţéŕ ŵîļļ üšé à šķéļéţöñ, àñđ šàýš ñöţĥîñĝ àƃöüţ ŵĥéţĥéŕ îţ ñééđš öñé.
Ţĥéšé çöḿþöšé îñţö ţĥŕéé ŵŕîţéŕ çļàššéš:
- Ĝéñéŕàţîṽé đöçüḿéñţ àñđ đàţà ŵŕîţéŕš (
generative, ñöţ îñţéŕçĥàñĝé). ĤŢḾĻ îš ţĥé àŕçĥéţýþé: ŵîţĥ ţĥé šöüŕçé ƒîļé'š šķéļéţöñ îţ ŕöüñđ-ţŕîþš ļöššļéššļý, àñđ ŵîţĥöüţ öñé îţ šţîļļ ŵŕîţéš à çļéàñ đöçüḿéñţ, šö îţ îš àļšö à ţàŕĝéţ ƒöŕ çöñţéñţ ţĥàţ àŕŕîṽéđ ƒŕöḿ à đéŕéñţ ƒöŕḿàţ. Ḿàŕķđöŵñ, ĐöçĻàñĝ, ÀšçîîĐöç, þļàîñ ţéẋţ, àñđ ţĥé đàţà àñđ çàţàļöĝ ƒöŕḿàţš ƃéĥàṽé ţĥé šàḿé. Ţĥéšé àŕé ţĥéconvertţàŕĝéţš. - Ƃîļîñĝüàļ îñţéŕçĥàñĝé ŵŕîţéŕš (
generativeàñđinterchange). ẊĻÎƑƑ, ÞÖ, ŢḾẊ, ḾÖ, àñđ ĶƂƑ àŕé ĝéñéŕàţîṽé ƒîļéš, ƃüţ ţĥéý ƃéļöñĝ ţö ţĥé éẋţŕàçţ → ţŕàñšļàţé → ḿéŕĝé ļööþ, ñöţ ţö đöçüḿéñţ çöñṽéŕšîöñ:kapi extractçàþţüŕéš ţĥé šöüŕçé šķéļéţöñ šökapi mergeçàñ ŕöüñđ-ţŕîþ ţŕàñšļàţîöñš ƃàçķ îñţö ţĥé öŕîĝîñàļ ƒöŕḿàţ. Àconvert-þŕöđüçéđ îñţéŕçĥàñĝé ƒîļé çàŕŕîéš ñö šķéļéţöñ àñđ çàññöţ ƃé ḿéŕĝéđ ƃàçķ (à đéàđ éñđ), šö îñţéŕçĥàñĝé ƒöŕḿàţš àŕé éẋçļüđéđ àšconvertţàŕĝéţš àñđ ŕéàçĥéđ ṽîàextract/merge(Ḿ-01). - Šķéļéţöñ-ƃöüñđ ŵŕîţéŕš (ñöţ ĝéñéŕàţîṽé). Þàçķàĝéđ ƒöŕḿàţš (ÖþéñẊḾĻ, ÖĐƑ, ÉÞÜƂ, îḿàĝé) ŵŕàþ çöñţéñţ îñ à ƒîẋéđ þàçķàĝé ţĥàţ çàññöţ ƃé ŕéĝéñéŕàţéđ ƒŕöḿ ţĥé ḿöđéļ; ţĥéý öñļý éṽéŕ ŵŕîţé ƃàçķ îñţö ţĥéîŕ öŵñ šķéļéţöñ. Šàḿé-ƒöŕḿàţ àñđ ḿéŕĝé ŵŕîţéŕš, ñéṽéŕ à çŕöšš-ƒöŕḿàţ ţàŕĝéţ.
Çŕöšš-ƒöŕḿàţ çöñṽéŕšîöñ (Š-04) ŕéçöñšţŕüçţš ţĥé
ţàŕĝéţ ƒŕöḿ ţĥé çöñţéñţ ḿöđéļ àñđ ñéṽéŕ çàŕŕîéš à ƒöŕéîĝñ šķéļéţöñ îñţö ţĥé
ŵŕîţéŕ. À ŵŕîţéŕ îš à ṽàļîđ çöñṽéŕšîöñ ţàŕĝéţ  îţ îš ĝéñéŕàţîṽé àñđ ñöţ
îñţéŕçĥàñĝé. Ƃöţĥ àŕé đéçļàŕéđ ŵŕîţéŕ çàþàƃîļîţîéš: ţĥé ŵŕîţéŕ šţàţéš ŵĥàţ
îţ çàñ ŵŕîţé ṽîà GenerativeWriter.Generative() (ţĥé îñṽéŕšé öƒ
BaseFormatWriter.RequiresSkeleton) àñđ InterchangeWriter.IsInterchange(). Ţĥé
ŕéĝîšţŕý ŕéçöŕđš ţĥéḿ öñ FormatInfo.Generative / FormatInfo.Interchange:
þŕöƃéđ öñçé ƒŕöḿ ţĥé ƃüîļţ-îñ ŵŕîţéŕ àţ ŕéĝîšţŕàţîöñ, àñđ ƒöŕ þļüĝîñ ƒöŕḿàţš ţàķéñ
ƒŕöḿ ţĥé çàçĥéđ ḿàñîƒéšţ'š generative / interchange çàþàƃîļîţîéš, šö
çöñṽéŕšîöñ, ţĥé Çöñṽéŕšîöñ ļàƃ, àñđ kapi formats ŕéàđ öñé
àüţĥöŕîţàţîṽé šöüŕçé ŵîţĥöüţ ļöàđîñĝ àñý þļüĝîñ. Ñéîţĥéŕ îš đéŕîṽéđ ƒŕöḿ
SkeletonStoreConsumer (ñéàŕļý éṽéŕý ŵŕîţéŕ çöñšüḿéš à šķéļéţöñ îƒ öƒƒéŕéđ, šö
ţĥàţ ƃîţ đöéš ñöţ đîšţîñĝüîšĥ à ţàŕĝéţ) ñöŕ þŕöƃéđ éḿþîŕîçàļļý.
Ţŵö đéŕîṽéđ ƒļàĝš šîţ ƃéšîđé ţĥéḿ. FormatInfo.RoundTrip, þŕöƃéđ ƒŕöḿ
SkeletonStoreConsumer, šàýš ţĥé ŵŕîţéŕ ŕéçöñšţŕüçţš ƒŕöḿ à šķéļéţöñ, šö àñ éđîţ
çĥàñĝéš öñļý ţĥé éđîţéđ ţéẋţ. FormatInfo.Editable (à ŕéàđéŕ àñđ à ŵŕîţéŕ, àñđ
ñöţ îñţéŕçĥàñĝé) îš ţĥé šéţ à çàļļéŕ-šüþþļîéđ çöñţéñţ éđîţ çàñ ţàŕĝéţ.
Ḿàŕķš à ŵŕîţéŕ çàñ đŕàŵ
À ƃļöçķ'š ŕüñš çàŕŕý ŵĥàţ ţĥé šöüŕçé đöçüḿéñţ šţŕüçţüŕàļļý çöñţàîñéđ. Ŵĥàţ à
ĝöṽéŕñàñçé þàšš çöñçļüđéđ àƃöüţ ţĥàţ çöñţéñţ ŕîđéš šţàñđ-öƒƒ öñ à
model.Anchor: à ļöçàţéđ ţéŕḿ, à ṽöîçé ƒîñđîñĝ, à šţýļé ṽîöļàţîöñ
(Ƒ-02). Šöḿé ƒöŕḿàţš ĥàṽé šöḿéŵĥéŕé ţö
þüţ šüçĥ à çöñçļüšîöñ, àñđ ḿöšţ đö ñöţ: ẊĻÎƑƑ ĥàš <mrk>, ĤŢḾĻ ĥàš <span>,
þļàîñ ţéẋţ ĥàš ñöţĥîñĝ àţ àļļ.
Šö đŕàŵîñĝ ţĥéḿ îš à đéçļàŕéđ ŵŕîţéŕ çàþàƃîļîţý, ţĥé ƒöüŕţĥ öƒ ţĥé ķîñđ
Generative àñđ Interchange àļŕéàđý àŕé. InlineAnnotationWriter ñàḿéš ţĥé
àññöţàţîöñ ţýþéš ţĥé ŵŕîţéŕ ķñöŵš ĥöŵ ţö đŕàŵ, àñđ ţĥé ŕéĝîšţŕý ŕéçöŕđš ţĥéḿ öñ
FormatInfo.InlineAnnotations, þŕöƃéđ öñçé ƒŕöḿ ţĥé ƃüîļţ-îñ ŵŕîţéŕ àţ
ŕéĝîšţŕàţîöñ; à þļüĝîñ ƒöŕḿàţ đéçļàŕéš ñöñé. kapi formats àñđ ţĥé ŵŕîţéŕ
šéļéçţîöñ ţĥéŕéƒöŕé ŕéàđ öñé àüţĥöŕîţàţîṽé šöüŕçé ŵîţĥöüţ ļöàđîñĝ àñý þļüĝîñ. À
ŵŕîţéŕ ţĥàţ îḿþļéḿéñţš ñöţĥîñĝ çàŕŕîéš ñö ḿàŕķš.
Ţĥé đéçļàŕàţîöñ îš à çéîļîñĝ, àñđ defaults.annotations.write îñ ţĥé ŕéçîþé
ñàŕŕöŵš îţ:
defaults:
annotations:
write: [term] # voice findings stay stand-off
Ñàŕŕöŵîñĝ öñļý, ñéṽéŕ ŵîđéñîñĝ, àñđ ţŵö ţĥîñĝš ƒöļļöŵ ƒŕöḿ ţĥàţ đîŕéçţîöñ. À ƒöŕḿàţ ţĥàţ ĝàîñš ţĥé çàþàƃîļîţý šţàŕţš þŕöĵéçţîñĝ ŵîţĥöüţ àñýöñé éđîţîñĝ à ŕéçîþé, ŵĥîçĥ îš ŵĥàţ ķééþš ţĥé ŕéçîþé ƒŕöḿ ƃéîñĝ à ļîšţ à þŕöĵéçţ ĥàš ţö ḿàîñţàîñ àĝàîñšţ ţĥé ƒöŕḿàţ çàţàļöĝ. Àñđ ñàḿîñĝ à ţýþé à ƒöŕḿàţ çàññöţ çàŕŕý àšķš ƒöŕ ñöţĥîñĝ ŕàţĥéŕ ţĥàñ ƒàîļîñĝ, ƃéçàüšé öñé ŕéçîþé đéšçŕîƃéš ḿàñý öüţþüţš àñđ à þŕöĵéçţ ţĥàţ ŵàñţš ţéŕḿš ḿàŕķéđ ŵĥéŕéṽéŕ ţĥéý çàñ ƃé šĥöüļđ ñöţ ĥàṽé ţö éñüḿéŕàţé ŵĥîçĥ öƒ îţš ƒöŕḿàţš ĥàþþéñ ţö šüþþöŕţ îţ.
Ţĥé đéƒàüļţ îš ţĥàţ à đöçüḿéñţ ļéàṽéš àš à đöçüḿéñţ. Àñ àññöţàţîöñ ţŕàṽéļš ƃéšîđé ţĥé çöñţéñţ îñ àñ öṽéŕļàý šîđéçàŕ üñļéšš à ŵŕîţéŕ ƃöţĥ çàñ đŕàŵ îţ àñđ ŵàš ñöţ ţöļđ öţĥéŕŵîšé.
ẊĻÎƑƑ 2 îš ţĥé ƒîŕšţ ŵŕîţéŕ ţö đéçļàŕé ţĥé çàþàƃîļîţý, àñđ îţ đŕàŵš à ţéŕḿ àš àñ
<sm>/<em> þàîŕ ŕàţĥéŕ ţĥàñ àñ <mrk>. Ƃöţĥ àŕé šþéç šĥàþéš àñđ <mrk> ŕéàđš
ƃéţţéŕ ŵĥéñ à šþàñ ñéšţš çļéàñļý îñšîđé öñé éļéḿéñţ, ƃüţ öñļý ţĥé þàîŕ çàñ çàŕŕý
à šþàñ ţĥàţ đöéš ñöţ, àñđ à ţéŕḿ ŕüññîñĝ ƒŕöḿ ƃéƒöŕé à <pc> ţö àƒţéŕ îţ îš
éẋàçţļý ŵĥàţ àñ Anchor îš ƃüîļţ ţö éẋþŕéšš. Ƃéçàüšé ţĥé ţŵö ḿàŕķéŕš àŕé
îñđéþéñđéñţ ñöđéš, éàçĥ îš þļàçéđ ŵĥéŕéṽéŕ îţš öŵñ ƃöüñđàŕý ļàñđš, îñçļüđîñĝ
îñšîđé àñ éļéḿéñţ ŵĥöšé þàŕţñéŕ šîţš öüţšîđé.
À šþàñ à šéĝḿéñţàţîöñ çàññöţ çàŕŕý, öñé šţŕàđđļîñĝ ţŵö <segment> éļéḿéñţš,
îš ŕéçöŕđéđ öñ ţĥé ŵŕîţéŕ (UnplacedTermMarks) ŕàţĥéŕ ţĥàñ ĥàļƒ-đŕàŵñ.
Éđîţš à ŵŕîţéŕ çàñ ŵŕîţé
À šàḿé-ƒöŕḿàţ ŵŕîţéŕ ŕéþļàýš îţš šķéļéţöñ àñđ ŵŕîţéš ţĥé ţéẋţ öƒ ţĥé ƃļöçķš àñ
éđîţ çĥàñĝéđ. Šöḿé éđîţš çĥàñĝé ḿöŕé ţĥàñ ţéẋţ: ţĥé ţàŕĝéţ öƒ à ļîñķ, öŕ à ñéŵ
ƃöļđ šþàñ öṽéŕ ŵöŕđš ţĥàţ ĥàđ ñöñé. Ţĥé çĥàñĝé
çöñţŕàçţ çàŕŕîéš ţĥéḿ àš
set_attribute, mark àñđ à ñéŵ çöđé îñ à runs þàýļöàđ, àñđ à ƒöŕḿàţ àççéþţš
éàçĥ öñé öñļý ŵĥéŕé îţš ŵŕîţéŕ đéçļàŕéš îţ. Ƒöüŕ đéçļàŕéđ ŵŕîţéŕ çàþàƃîļîţîéš
šàý ŵĥàţ à ŵŕîţéŕ çàñ ŵŕîţé ƃéýöñđ îţš šķéļéţöñ, îñ core/format/editcaps.go
àñđ core/format/structural.go:
| Îñţéŕƒàçé | Đéçļàŕéš | Üšéđ ƃý |
|---|---|---|
AttrWriter | WritableAttrs(): þéŕ çöđé ţýþé, ţĥé àţţŕîƃüţéš ŵĥöšé ṽàļüé ţĥé ŵŕîţéŕ ŵŕîţéš | set_attribute |
CodeSynthesizer | Synthesizes(): ţĥé ṽöçàƃüļàŕý ţýþéš ţĥé ŵŕîţéŕ ŵŕîţéš àš à ñéŵ þàîŕéđ çöđé | mark, à ñéŵ çöđé îñ runs |
StructureEditor | Structural(): insert_block, delete_block, ŵîţĥ EditStructure, ŵĥîçĥ ŵŕîţéš ţĥéḿ | ţĥé šţŕüçţüŕàļ öþéŕàţîöñš |
NativeEditor | NativeOps(): ƒöŕḿàţ-šþéçîƒîç öþéŕàţîöñš àñđ ţĥéîŕ àŕĝüḿéñţ šçĥéḿàš | native |
Ţĥé ŕéĝîšţŕý ŕéçöŕđš ţĥéḿ öñ FormatInfo.EditCapabilities, ŵĥîçĥ đéšçŕîƃéš ţĥé
ƒöŕḿàţ'š ŕéĝîšţéŕéđ ŵŕîţéŕ. À ƃüîļţ-îñ ŵŕîţéŕ'š đéçļàŕàţîöñ îš þŕöƃéđ öñçé ŵĥéñ
îţ îš ŕéĝîšţéŕéđ, ţĥé ŵàý Generative àñđ InlineAnnotations àŕé. À þļüĝîñ
ƒöŕḿàţ đéçļàŕéš writable_attrs àñđ synthesizes îñ îţš ḿàñîƒéšţ éñţŕý, ŕéàđ
đüŕîñĝ đîšçöṽéŕý ŵîţĥöüţ ļàüñçĥîñĝ ţĥé þļüĝîñ, àñđ ţĥé þļüĝîñ ĥöšţ ŕéçöŕđš ţĥéḿ
ŵĥéñ îţ ŕéĝîšţéŕš ţĥé þļüĝîñ'š ŵŕîţéŕ. À þļüĝîñ ţĥàţ ŕéþļàçéš à ƃüîļţ-îñ
ƒöŕḿàţ'š ŵŕîţéŕ ŕéþļàçéš îţš đéçļàŕàţîöñ ŵîţĥ ţĥéḿ, àñ éḿþţý öñé îñçļüđéđ.
AttrWriter.WriteAttr šþéļļš à ñéŵ ṽàļüé îñţö ţĥé çöđé'š ñàţîṽé đàţà, éšçàþéđ
ƒöŕ ŵĥéŕé îţ šîţš, üþđàţéš ţĥé çöđé'š àţţŕîƃüţéš ţö ḿàţçĥ ŵĥàţ ţĥé ŕéàđéŕ ŵöüļđ
ŕéàđ, àñđ ŕéţüŕñš ţĥé šàḿé ŕüñš îñ ţĥé šàḿé öŕđéŕ. CodeSynthesizer ŕéţüŕñš ƃöţĥ
ĥàļṽéš öƒ à ñéŵ çöđé àš ţĥé ƒöŕḿàţ'š ŕéàđéŕ ŵöüļđ ŕéàđ ţĥéḿ ƃàçķ, ñàţîṽé đàţà,
šüƃţýþé, đîšþļàý àñđ çöñšţŕàîñţš îñçļüđéđ. Ţĥé çĥàñĝé àþþļîéŕ çàļļš ţĥéḿ ŵĥéñ îţ
àþþļîéš ţĥé öþéŕàţîöñ (change.WriterCapabilities ĥàñđš îţ ţĥé ŵŕîţéŕ), šö ţĥé
ƃļöçķ ĥöļđš ţĥé ƃýţéš îţ îš ŵŕîţţéñ ŵîţĥ, àñđ éṽéŕý ŵŕîţé þàţĥ, šķéļéţöñ ŕéþļàý
îñçļüđéđ, ŵŕîţéš ţĥéḿ. À þļüĝîñ'š ŵŕîţéŕ ŕüñš öüţšîđé ţĥé þŕöçéšš: ţĥé çöđé îţ
ŕéçéîṽéš çàŕŕîéš ţĥé ñéŵ ṽàļüé àḿöñĝ îţš àţţŕîƃüţéš, öŕ à ñéŵ çöđé çàŕŕîéš îţš
ţýþé àñđ àţţŕîƃüţéš àñđ ñö đàţà, àñđ ţĥé þļüĝîñ'š ŵŕîţéŕ šþéļļš îţ.
Éàçĥ đéçļàŕàţîöñ àļšö ŕéƒüšéš ŵĥàţ îţ çàññöţ ŵŕîţé, ŵîţĥ ţĥé ŕéàšöñ îñ ţĥé ŕéƒüšàļ:
| Ƒöŕḿàţ | Ŵŕîţéš | Ŕéƒüšéš, ŵîţĥ à ŕéàšöñ |
|---|---|---|
| ĤŢḾĻ | href öƒ link:hyperlink, src öƒ media:image; ñéŵ fmt:bold àñđ fmt:italic îñ ţĥé éļéḿéñţš ţĥé ƒöŕḿàţ'š þŕöĵéçţîöñ öƒ ţĥé ṽöçàƃüļàŕý ñàḿéš (<strong>, <em>), àñđ ñéŵ link:hyperlink (<a href>) | à ţîţļé öŕ àļţ ţéẋţ, ŵĥîçĥ ţĥé ŕéàđéŕ šüŕƒàçéš àš à ƃļöçķ öƒ îţš öŵñ; à ñéŵ çöđé îñ àñ àţţŕîƃüţé ṽàļüé, ţĥé đöçüḿéñţ ţîţļé öŕ à ţéẋţàŕéà; à ļîñķ îñšîđé öŕ àŕöüñđ à ļîñķ öŕ à ƃüţţöñ, ŵĥéţĥéŕ ţĥàţ éļéḿéñţ îš à çöđé öƒ ţĥé ƃļöçķ öŕ ḿàŕķüþ ţĥé ƃļöçķ šîţš îñšîđé |
| Ḿàŕķđöŵñ | ţĥé đéšţîñàţîöñ öƒ àñ îñļîñé ļîñķ öŕ îḿàĝé; ñéŵ **…**, *…* àñđ […](href) | à ŕéƒéŕéñçé ļîñķ, ŵĥöšé đéšţîñàţîöñ îš îñ à đéƒîñîţîöñ öţĥéŕ ļîñķš ḿàý šĥàŕé; àñ àüţöļîñķ; à ţîţļé, ŵĥîçĥ îš ţéẋţ öƒ ţĥé ƃļöçķ; à ļîñķ àƒţéŕ à !, ŵĥîçĥ ŵöüļđ ŕéàđ àš àñ îḿàĝé; ḿàŕķüþ à ƃàçķšļàšĥ îñ ţĥé ţéẋţ ŵöüļđ éšçàþé; éḿþĥàšîš ÇöḿḿöñḾàŕķ ŵöüļđ ñöţ ŕéàđ àš éḿþĥàšîš, šüçĥ àš öñé šţàŕţîñĝ ŵîţĥ à šþàçé; à ñéŵ çöđé îñ à çöđé šþàñ öŕ à ļîţéŕàļ ƃļöçķ |
| ẊḾĻ | àñý àţţŕîƃüţé àñ îñļîñé éļéḿéñţ'š çöđé ŕéçöŕđš (* ƒöŕ éṽéŕý ţýþé àñđ àţţŕîƃüţé) | àñ àţţŕîƃüţé ţĥé éļéḿéñţ đöéš ñöţ šþéļļ, šîñçé ţĥé ƒöŕḿàţ ĥàš ñö šçĥéḿà ţö šàý ŵĥîçĥ îţ ḿàý çàŕŕý; à ñàḿéšþàçé đéçļàŕàţîöñ; àñ àţţŕîƃüţé ţĥé ŕéàđéŕ šüŕƒàçéš àš à ƃļöçķ; àñ àţţŕîƃüţé ţĥé ŕéàđéŕ ŕéàđš àš àñ îñšţŕüçţîöñ |
Ţĥé ẊḾĻ ŕéàđéŕ ŕéçöŕđš öñ àñ îñļîñé éļéḿéñţ'š çöđé ţĥé àţţŕîƃüţéš
set_attribute çàñ çĥàñĝé, šö à ŕéàđ šĥöŵš ţĥéḿ. Îţ ļéàṽéš öüţ ţĥé àţţŕîƃüţéš
ŵĥöšé ṽàļüé đéçîđéš ĥöŵ ţĥé đöçüḿéñţ ŕéàđš: xml:lang, xml:space àñđ ţĥé
öţĥéŕ xml: àţţŕîƃüţéš, ţĥé ÎŢŠ àţţŕîƃüţéš, àñđ àñý àţţŕîƃüţé à ŕüļé öƒ ţĥé
ŕéàđéŕ'š çöñƒîĝüŕàţîöñ öŕ öƒ ţĥé đöçüḿéñţ'š ÎŢŠ ŕüļéš šéļéçţš, ţéšţš öŕ þöîñţš
àţ. À çĥàñĝé ţö öñé öƒ ţĥöšé ŵöüļđ çĥàñĝé ŵĥàţ ţĥé ñéẋţ ŕéàđ éẋţŕàçţš.
Ţĥé Ḿàŕķđöŵñ ŵŕîţéŕ þàŕšéš à ñéŵ çöđé'š ḿàŕķüþ îñ þļàçé, ŵîţĥ ţĥé ţéẋţ àŕöüñđ
îţ, üšîñĝ ţĥé ŕéàđéŕ'š þàŕšéŕ, àñđ ŵŕîţéš ţĥé çöđé öñļý ŵĥéŕé îţ ŕéàđš ƃàçķ àš
ţĥàţ çöđé öṽéŕ éẋàçţļý ţĥé ŕàñĝé àñđ ļéàṽéš éṽéŕý öţĥéŕ þîéçé öƒ ḿàŕķüþ îñ ţĥé
ƃļöçķ ŕéàđîñĝ àš ƃéƒöŕé. Ţĥé ŕéƒüšàļš àƃöṽé ĝîṽé ţĥé çöḿḿöñ çàüšéš à ŕéàšöñ öƒ
ţĥéîŕ öŵñ, àñđ ţĥé þàŕšé ŕéƒüšéš àñý öţĥéŕ. Îñ à ţàƃļé çéļļ à ļîñķ'š
đéšţîñàţîöñ šþéļļš à þîþé àš \|, àñđ ţĥé ŕéàđéŕ ŕéàđš îţ ŵîţĥöüţ ţĥé
ƃàçķšļàšĥ, šö à đéšţîñàţîöñ šéţ ŵîţĥ à þîþé ŕéàđš ƃàçķ àš šéţ.
Àñ éđîţ ţĥàţ çĥàñĝéš à ƃļöçķ'š çöđéš àñđ ļéàṽéš îţš ţéẋţ àš ŕéàđ (à
set_attribute, à mark) îš ŵŕîţţéñ ƃý ţĥé ĤŢḾĻ ŵŕîţéŕ àš à þàţçĥ öƒ ţĥé
ƃļöçķ'š öŵñ ƃýţéš: éàçĥ çĥàñĝéđ çöđé'š ḿàŕķüþ îš ŕéþļàçéđ, éàçĥ ñéŵ çöđé îš
îñšéŕţéđ ŵĥéŕé îţ šîţš îñ ţĥé ţéẋţ, àñđ ţĥé ļîñé ƃŕéàķš, îñđéñţàţîöñ àñđ
çĥàŕàçţéŕš ţĥé ŕéàđéŕ ñöŕḿàļîžéđ öŕ ţĥé éñçöđîñĝ þàšš ŵöüļđ ŕéšþéļļ ķééþ ţĥé
đöçüḿéñţ'š šþéļļîñĝ.
Ţĥé öþéŕàţîöñš ḿàţŕîẋ þŕöṽéš éṽéŕý đéçļàŕàţîöñ. TestCapabilityMatrix
(core/formats/opsmatrix_capabilities_test.go) ŕéàđš à ƒîẋţüŕé, àþþļîéš ţĥé
öþéŕàţîöñ ţĥŕöüĝĥ ţĥé çĥàñĝé àþþļîéŕ ŵîţĥ ţĥé ŵŕîţéŕ'š çàþàƃîļîţîéš, ŵŕîţéš
ţĥé đöçüḿéñţ ţĥŕöüĝĥ ţĥé šàḿé ŵŕîţéŕ, àñđ àššéŕţš ţĥàţ ţĥé öüţþüţ îš ţĥé îñþüţ
ŵîţĥ éẋàçţļý ţĥé çéļļ'š çĥàñĝé, šþéļļéđ àñđ éšçàþéđ àš ţĥé çéļļ ñàḿéš îţ, àñđ
ţĥàţ éṽéŕý ƃļöçķ ŕéàđš ƃàçķ àš ţĥé öþéŕàţîöñ ļéƒţ îţ. Éàçĥ mark çéļļ àļšö ŕüñš
àš à set_content ñàḿîñĝ ţĥé ñéŵ çöđé îñ à ŕüñš þàýļöàđ. Ŕéƒüšàļ çéļļš àššéŕţ
ţĥé ŕéàšöñ àñđ àñ üñçĥàñĝéđ đöçüḿéñţ. TestCapabilityMatrixCoversEveryDeclaration
ƒàîļš ţĥé ƃüîļđ ŵĥéñ à ƃüîļţ-îñ ŵŕîţéŕ đéçļàŕéš àñ àţţŕîƃüţé, à ţýþé, à
šţŕüçţüŕàļ öŕ à ñàţîṽé öþéŕàţîöñ ţĥàţ ñö çéļļ þŕöṽéš. À ŵîļđçàŕđ àţţŕîƃüţé
đéçļàŕàţîöñ çöüñţš àš þŕöṽéñ öñļý ŵîţĥ þàššîñĝ çéļļš öñ ţŵö àţţŕîƃüţéš àñđ à
çéļļ ţĥàţ ŕéƒüšéš öñé.
change.FormatOps ƃüîļđš ţĥé çĥàñĝé šéŕṽîçé'š đéšçŕîþţîöñ öƒ à ƒöŕḿàţ ƒŕöḿ
ţĥé öþéŕàţîöñš îţš ŕöüñđ ţŕîþ çàŕŕîéš àñđ ţĥéšé đéçļàŕàţîöñš; àñ öþéŕàţîöñ
ñöţĥîñĝ đéçļàŕéš îš null, àñđ ŕéƒüšéđ àš unsupported.
Šķéļéţöñš àŕé ţýþéđ þéŕ ƒöŕḿàţ. À SkeletonStore çàŕŕîéš àñ OriginFormat
šţàḿþ, àñđ format.WireSkeleton(store, reader, writer) çöññéçţš à ŕéàđéŕ'š
šķéļéţöñ éḿîššîöñ ţö à ŵŕîţéŕ öñļý ŵĥéñ ţĥéý àŕé ţĥé šàḿé ƒöŕḿàţ, šö ţĥé
ŕüļé ţĥàţ à šķéļéţöñ ƒŕöḿ ƒöŕḿàţ À îš ƒöŕéîĝñ ţö ƒöŕḿàţ Ƃ'š ŵŕîţéŕ îš éñƒöŕçéđ
çéñţŕàļļý, ñöţ ļéƒţ ţö éàçĥ çàļļ šîţé. À çŕöšš-ƒöŕḿàţ çöñṽéŕšîöñ ţĥéŕéƒöŕé ñéṽéŕ
ƒééđš à ƒöŕéîĝñ šķéļéţöñ îñţö ţĥé ţàŕĝéţ ŵŕîţéŕ; ţĥàţ ŵŕîţéŕ ţàķéš ţĥé ĝéñéŕàţîṽé
çöñţéñţ-ḿöđéļ ŕöüţé éṽéŕý ŵŕîţéŕ šĥàŕéš.
Ƃļöçķš à ŵŕîţéŕ çàñ àđđ àñđ ŕéḿöṽé
À šķéļéţöñ ĥàš à šļöţ ƒöŕ éṽéŕý ƃļöçķ ţĥé ŕéàđéŕ ŕéàđ àñđ ñöñé ƒöŕ à ƃļöçķ ñöƃöđý ŕéàđ, šö ŕéþļàýîñĝ îţ çàñ çĥàñĝé à ƃļöçķ'š çöñţéñţ àñđ ñöţĥîñĝ ḿöŕé. Àđđîñĝ à ƃļöçķ ţö à đöçüḿéñţ, öŕ ŕéḿöṽîñĝ öñé ţöĝéţĥéŕ ŵîţĥ ţĥé ḿàŕķüþ àŕöüñđ îţ, çĥàñĝéš ţĥé đöçüḿéñţ'š šţŕüçţüŕé, àñđ öñļý ţĥé ƒöŕḿàţ ķñöŵš ŵĥàţ ţĥàţ ḿàŕķüþ îš. Îñ à ķéý-ṽàļüé çàţàļöĝ îţ îš šḿàļļ: à ƃļöçķ'š šĥéļļ îš îţš ķéý àñđ ţĥé ṽàļüé ƃéšîđé îţ.
À ŵŕîţéŕ ţĥàţ çàñ ŵŕîţé šüçĥ àñ éđîţ đéçļàŕéš îţ. StructureEditor.Structural
ļîšţš ţĥé öþéŕàţîöñš îţ ŵŕîţéš, insert_block àñđ delete_block, àñđ
StructureEditor.EditStructure ḿàķéš ţĥéḿ: ĝîṽéñ à ŵĥöļé đöçüḿéñţ àñđ ţĥé
éđîţš îñ öŕđéŕ, îţ ŕéţüŕñš ţĥé đöçüḿéñţ ŵîţĥ à ñéŵ ķéý àñđ ṽàļüé ƃéšîđé à
ñàḿéđ ƃļöçķ (öŕ ļàšţ), öŕ à ƃļöçķ'š ķéý àñđ ṽàļüé ŕéḿöṽéđ ŵîţĥ ţĥé šéþàŕàţöŕ
ţĥàţ ķéþţ îţ ƒŕöḿ îţš ñéîĝĥƃöüŕš, àñđ éṽéŕý öţĥéŕ ƃýţé àš îţ ŵàš. Îţ ñàḿéš à
ƃļöçķ ƃý ţĥé ķéý îţš ŕéàđéŕ ĝîṽéš îţ àñđ ƒîñđš à ƃļöçķ îţ ŕéàđ ƃý ŵĥàţ ţĥé
ŕéàđéŕ ŕéçöŕđéđ öñ îţ. Àñ éđîţ îţ çàññöţ ḿàķé îš à StructureError ñàḿîñĝ ţĥé
éđîţ àñđ ŵĥý: ţĥé ķéý îš ĥéļđ àļŕéàđý, ţĥé ƃļöçķ îš ñöţ ţĥéŕé, öŕ ţĥé ƒöŕḿàţ
ĥàš ñö ŵàý ţö ŵŕîţé îţ ţĥéŕé. format.StructuralOps ŕéþöŕţš ŵĥàţ à ŵŕîţéŕ
đéçļàŕéš àñđ ŵŕîţéš, àñđ ProbeEditCapabilities ŕéçöŕđš îţ àḿöñĝ ţĥé ŵŕîţéŕ'š
éđîţ çàþàƃîļîţîéš (EditCapabilities.Structural), ŵĥîçĥ ţĥé çĥàñĝé šéŕṽîçé
(É-09) đéšçŕîƃéš à ƒöŕḿàţ àñđ à đöçüḿéñţ ƃý, šö
đéšçŕîƃîñĝ à ƒöŕḿàţ àñđ àþþļýîñĝ à çĥàñĝé šéţ àĝŕéé; à þļüĝîñ ƒöŕḿàţ đéçļàŕéš
ñöñé. À ŵŕîţéŕ àñšŵéŕš Structural ƒöŕ
îţš öŵñ çöñƒîĝüŕàţîöñ: ŵĥéŕé à đöçüḿéñţ'š çöñƒîĝüŕàţîöñ ḿàķéš ḿöŕé ţĥàñ ţĥé ķéý
àñđ îţš ṽàļüé þàŕţ öƒ à ƃļöçķ'š šĥéļļ, đéšçŕîƃîñĝ ţĥàţ đöçüḿéñţ ŕéþöŕţš ñéîţĥéŕ
öþéŕàţîöñ àñđ àþþļýîñĝ öñé îš ŕéƒüšéđ.
À ñéŵ ƃļöçķ ĝöéš ŵĥéŕé à ŕéàđéŕ ŵöüļđ ļööķ ƒöŕ îţš ķéý þàţĥ. Ŕéàđéŕš ñàḿé à
ṽàļüé îñ à ñéšţéđ öƃĵéçţ àñđ öñé üñđéŕ à ƒļàţ đöţţéđ ķéý ţĥé šàḿé ŵàý
(nav.checkout), šö ţĥé ŵŕîţéŕ þüţš ţĥé ñéŵ ķéý îñ ţĥé đééþéšţ öƃĵéçţ öŕ
ḿàþþîñĝ ţĥàţ ţĥé šţàŕţ öƒ îţš ķéý þàţĥ ñàḿéš, ƃéšîđé îţš àñçĥöŕ öŕ ļàšţ ţĥéŕé,
àñđ ƃüîļđš ţĥé öƃĵéçţš öŕ ḿàþþîñĝš ţĥé þàţĥ ñàḿéš ţĥàţ ţĥé đöçüḿéñţ ļàçķš. Àñ
öƃĵéçţ ţĥàţ àļŕéàđý ñàḿéš ṽàļüéš ƃý ƒļàţ đöţţéđ ķéýš ţàķéš ţĥé ŕéšţ öƒ ţĥé
þàţĥ àš öñé ķéý. Àñ àñçĥöŕ öüţšîđé ţĥàţ öƃĵéçţ îš ŕéƒüšéđ.
Ţĥé ĴŠÖÑ, ÝÀḾĻ àñđ ÀŔƂ ŵŕîţéŕš đéçļàŕé ƃöţĥ öþéŕàţîöñš:
- ĴŠÖÑ àđđš à ḿéḿƃéŕ ŵîţĥ ţĥé îñđéñţàţîöñ, ļîñé ƃŕéàķš àñđ çöļöñ šþàçîñĝ ţĥé
öƃĵéçţ àļŕéàđý üšéš, àñđ à ƃüîļţ öƃĵéçţ ƒöļļöŵš ţĥé šàḿé ļàýöüţ öñé šţéþ
đééþéŕ. Îţ ŕéḿöṽéš à ḿéḿƃéŕ ŵîţĥ ţĥé çöḿḿà ƃéƒöŕé öŕ àƒţéŕ îţ àñđ à çöḿḿéñţ
ţĥàţ éñđš öñ ţĥé ḿéḿƃéŕ'š öŵñ ļîñé. À ṽàļüé îñ àñ àŕŕàý îš ñàḿéđ ƃý îţš
þöšîţîöñ àñđ îš ñéṽéŕ àđđéđ öŕ ŕéḿöṽéđ. À çöñƒîĝüŕàţîöñ ţĥàţ ŕéàđš à ƃļöçķ'š
ñöţé, îđ öŕ ḿéţàđàţà ƒŕöḿ ţĥé ḿéḿƃéŕš ƃéšîđé îţ (
noteRules,idRules,useIdStack,genericMetaRules,maxwidthRules) đéçļàŕéš ñéîţĥéŕ öþéŕàţîöñ, àñđ üñđéŕuseFullKeyPathà ñàḿé šüçĥ àš/nav/homeîš ŕéàđ àš ţĥé ķéý þàţĥ îţ šþéļļš. - ÝÀḾĻ àđđš à ļîñé àţ ţĥé îñđéñţàţîöñ öƒ ţĥé ḿàþþîñĝ'š ķéýš, àƒţéŕ éṽéŕý ļîñé
öƒ ţĥé àñçĥöŕ'š ṽàļüé, öŕ àƃöṽé ţĥé çöḿḿéñţ đîŕéçţļý öṽéŕ ţĥé ķéý îţ ĝöéš
ƃéƒöŕé. Îţ ŕéḿöṽéš à ķéý'š ļîñéš ŵîţĥ ţĥàţ çöḿḿéñţ, ŵĥîçĥ ţĥé ŕéàđéŕ ŕéàđš àš
ţĥé ƃļöçķ'š ñöţé, àñđ ļéàṽéš éṽéŕý öţĥéŕ çöḿḿéñţ ŵĥéŕé îţ îš. À ķéý îñ à ƒļöŵ
ḿàþþîñĝ, öñ à šéǫüéñçé îţéḿ'š đàšĥ ļîñé, ŕéàçĥéđ ţĥŕöüĝĥ àñ àļîàš, ĥöļđîñĝ àñ
àñçĥöŕ, öŕ îñšîđé à ñöđé ŵîţĥ àñ àñçĥöŕ îš ŕéƒüšéđ. À ñéŵ ķéý öŕ ṽàļüé îš
ŵŕîţţéñ þļàîñ ŵĥéŕé ÝÀḾĻ 1.2 àñđ ÝÀḾĻ 1.1 þàŕšéŕš ƃöţĥ ŕéàđ îţ ƃàçķ àš ţĥé
šàḿé šţŕîñĝ, àñđ đöüƃļé-ǫüöţéđ öţĥéŕŵîšé (
yes,off,1:20), àñđ ŕéḿöṽîñĝ à ḿàþþîñĝ'š ļàšţ ķéý ļéàṽéš îţ{}, àƒţéŕ ţĥé ţàĝ îţ çàŕŕîéš. - ÀŔƂ ķééþš à ḿéššàĝé'š
@ḿéţàđàţà ƃéšîđé îţ: à ḿéššàĝé àđđéđ àƒţéŕ àñöţĥéŕ ĝöéš àƒţéŕ ţĥàţ ḿéššàĝé'š ḿéţàđàţà, öñé àđđéđ ƃéƒöŕé ĝöéš ƃéƒöŕé ḿéţàđàţà ţĥàţ þŕéçéđéš îţ, àñđ à ŕéḿöṽéđ ḿéššàĝé ţàķéš îţš ḿéţàđàţà ŵîţĥ îţ. Àñ îđ šţàŕţîñĝ ŵîţĥ@îš ŕéƒüšéđ.
Ŕéàđéŕ öüţþüţ þöļîçý: ţĥŕéé đéšţîñàţîöñš
Ţĥé šķéļéţöñ îš ñöţ ţĥé öñļý ĥöḿé ƒöŕ ñöñ-ţŕàñšļàţàƃļé çöñţéñţ. À ŕéàđéŕ çļàššîƒîéš éàçĥ ƒŕàĝḿéñţ ţĥŕéé ŵàýš:
| Ƒŕàĝḿéñţ | Đéšţîñàţîöñ |
|---|---|
| Ţŕàñšļàţàƃļé þŕöšé | Block{Translatable: true}; ţĥé þîþéļîñé þŕöçéššéš îţ |
| Þüŕé šţŕüçţüŕé (đéļîḿîţéŕš, ǫüöţîñĝ, ŵĥîţéšþàçé) | šķéļéţöñ ƃýţéš |
| Ñöñ-ţŕàñšļàţàƃļé ƃüţ ḿéàñîñĝƒüļ çöñţéẋţ | šüŕƒàçéđ; šéé ţĥé ţŵö çĥàññéļš ƃéļöŵ |
Ţĥé ţĥîŕđ çàţéĝöŕý (çöđé, ṽéŕƃàţîḿ àñđ ļîţéŕàļ ţéẋţ, çàþţîöñš, àļţ-ţéẋţ, ƒöŕḿüļàš, đö-ñöţ-ţŕàñšļàţé šţŕîñĝš, çöñƒîĝ-éẋçļüđéđ ṽàļüéš, çöḿḿéñţš) îš šüŕƒàçéđ ŕàţĥéŕ ţĥàñ çöļļàþšéđ îñţö ţĥé šéçöñđ. Îţ ƃéçöḿéš çöñţéñţ àñ îñĝéšţîöñ çöñšüḿéŕ çàñ ŕéàđ, ŵĥîļé šţàýîñĝ öüţšîđé ţĥé ţŕàñšļàţîöñ þàýļöàđ.
Ţĥîš îñţŕöđüçéš ñö ñéŵ çöñţéñţ-ḿöđéļ ţýþé. Ţĥé Translatable ƒļàĝ, ţĥé
SemanticRole ţàẋöñöḿý, Data, àñđ ñöţéš àŕé àļļ ţĥé çöñţéñţ ḿöđéļ'š
(Ƒ-02); ţĥé šķéļéţöñ àñđ šüƃ-šķéļéţöñ
ḿéçĥàñîšḿš àŕé ţĥîš ÀĐ'š.
Ţŵö šüŕƒàçîñĝ çĥàññéļš
Ŵĥàţ à ƒŕàĝḿéñţ îš đéţéŕḿîñéš ŵĥîçĥ çĥàññéļ çàŕŕîéš îţ. Ŕéñđéŕàƃļé çöñţéñţ, ţéẋţ ţĥàţ ĥàš à þļàçé îñ ţĥé ŕéñđéŕéđ đöçüḿéñţ, ƃéçöḿéš à çöñţéñţ ƃļöçķ; öüţ-öƒ-ƃàñđ àññöţàţîöñ, ţéẋţ àƃöüţ ţĥé đöçüḿéñţ, ƃéçöḿéš đàţà öŕ à ñöţé.
| Çĥàññéļ | Çàŕŕîéŕ | Üšéđ ƒöŕ | Ŕöüñđ-ţŕîþ |
|---|---|---|---|
| Ŕéñđéŕàƃļé çöñţéẋţüàļ çöñţéñţ | Block{Translatable:false} + SemanticRole + šķéļéţöñ ŕéƒ | çöđé ƃļöçķš, ļîţéŕàļ ţéẋţ, çàþţîöñš, àļţ-ţéẋţ, ƒöŕḿüļàš, đö-ñöţ-ţŕàñšļàţé šţŕîñĝš, çöñƒîĝ-éẋçļüđéđ ṽàļüéš | ṽéŕƃàţîḿ ƃýţéš šţàý îñ ţĥé šķéļéţöñ; ţĥé šüŕƒàçéđ ƃöđý ŕîđéš à šķéļéţöñ ŕéƒ, šö ţĥé ŵŕîţéŕ ŕéþļàýš ţĥé öŕîĝîñàļ éẋàçţļý |
| Çöḿḿéñţ / ḿéţàđàţà çöñţéẋţ | Data þàŕţ öŕ à ñöţé àññöţàţîöñ | đéṽéļöþéŕ àñđ ţŕàñšļàţöŕ çöḿḿéñţš, ŕéṽîéŵ àññöţàţîöñš, éđîţöŕîàļ ñöţéš | ţĥé çöḿḿéñţ ƃýţéš ŕöüñđ-ţŕîþ ṽéŕƃàţîḿ ţĥŕöüĝĥ ţĥé šķéļéţöñ; ţĥé šüŕƒàçéđ çöþý îš îñƒöŕḿàţîöñàļ öñļý |
À ƃļöçķ ƒŕöḿ ţĥé ƒîŕšţ çĥàññéļ çàŕŕîéš ţĥé ŕöļé ţĥàţ ñàḿéš îţš ķîñđ (àļţ-ţéẋţ àš
RoleCaption, à çöđé ļîšţîñĝ àš RoleCode, àñ éǫüàţîöñ àš RoleFormula, à
ñöñ-ţŕàñšļàţàƃļé çéļļ àš RoleTableCell), àñđ îš ƒļàĝĝéđ šö ţŕàñšļàţîöñ šķîþš îţ
(É-07). Ţĥé šéçöñđ çĥàññéļ ķééþš çöḿḿéñţ çöñţéẋţ àš
đàţà: à çöḿḿéñţ îš ñöţ þàŕţ öƒ ţĥé ŕéñđéŕéđ ţéẋţ, šö þŕöḿöţîñĝ îţ
ţö à çöñţéñţ ƃļöçķ ŵöüļđ ḿîšŕéþŕéšéñţ ţĥé đöçüḿéñţ'š šţŕüçţüŕé; îţ šţàýš à Data
þàŕţ öŕ à ñöţé ţĥàţ îñĝéšţîöñ çàñ ŕéàđ àñđ ţĥé éđîţöŕ çàñ šĥöŵ.
Ţĥé çöḿḿéñţ ļàýéŕ
À çĥéçķ ŕéàđš çöḿḿéñţš àš þŕöšé ţĥŕöüĝĥ à ţĥîŕđ þàţĥ ţĥàţ ļéàṽéš ƃöţĥ çĥàññéļš
àš ţĥéý àŕé. Ţĥé çöḿḿéñţ ļàýéŕ (core/comment) ļöçàţéš éàçĥ çöḿḿéñţ ŵîţĥ à
ĥàļƒ-öþéñ ƃýţé šþàñ àñđ àñ îñçļüšîṽé ļîñé ŕàñĝé, àñđ ƃüîļđš à ƃļöçķ ƒŕöḿ îţ ƒöŕ
çĥéçķîñĝ. Ţĥöšé ƃļöçķš ñéṽéŕ éñţéŕ à ŕéàđéŕ'š þàŕţ šţŕéàḿ, šö ŕöüñđ-ţŕîþ àñđ
þàŕîţý àŕé üñàƒƒéçţéđ.
À ƒîļé ñö ƒöŕḿàţ ŕéàđéŕ çöṽéŕš ŕéàçĥéš ţĥé ļàýéŕ ţĥŕöüĝĥ à ļàñĝüàĝé þŕöṽîđéŕ.
Ţĥé Ĝö þŕöṽîđéŕ üšéš go/parser ƒöŕ þöšîţîöñš àñđ go/doc/comment ƒöŕ ţĥé
îñţéŕîöŕ, ƒŕöḿ ţĥé šţàñđàŕđ ļîƃŕàŕý. Îţ çļàššîƒîéš đîŕéçţîṽéš, ĝéñéŕàţéđ ƒîļéš,
ţĥé çĝö þŕéàḿƃļé àñđ éẋàḿþļé öüţþüţ àš ñöţ àđđŕéššàƃļé, àñđ ţüŕñš çöđé ƃļöçķš
àñđ ŕéƒéŕéñçéš ţö đéçļàŕàţîöñš îñţö þļàçéĥöļđéŕš, šö à çĥéçķ ŕéàđš šéñţéñçéš
öñļý. Ţĥé þàŕšéŕ çöñšüḿéš à ļîšţ îţéḿ'š ḿàŕķéŕ, šö éàçĥ îţéḿ öþéñš ŵîţĥ à
þļàçéĥöļđéŕ öƒ ţýþé list:item (comment.TypeListItem) ţĥàţ ķééþš öñé îţéḿ'š
þŕöšé àþàŕţ ƒŕöḿ ţĥé ñéẋţ. À þŕöṽîđéŕ îš ñöţ à ƒöŕḿàţ: ñöţĥîñĝ ŕéĝîšţéŕš öñé îñ ţĥé ƒöŕḿàţ ŕéĝîšţŕý,
àñđ à ŕéçîþé đéçļàŕéš šüçĥ ƒîļéš ŵîţĥ comments: true öñ à çöñţéñţ îţéḿ, ŵĥîçĥ
éṽéŕý þàţĥ ţĥàţ ŕéàđš ṽàļüéš ţĥéñ þàššéš öṽéŕ (ResolvedFile.CommentsOnly).
À þļüĝîñ çàñ šüþþļý ļàñĝüàĝé þŕöṽîđéŕš ţöö. Ţĥé šöüŕçéçöđé þļüĝîñ ļîšţš ţĥé
ļàñĝüàĝéš îţ ŕéàđš îñ îţš ḿàñîƒéšţ, šüçĥ àš ŢýþéŠçŕîþţ, Þýţĥöñ àñđ ÇŠŠ, àñđ ţĥé
ĥöšţ ŕéĝîšţéŕš à þŕöṽîđéŕ ƒöŕ éàçĥ ļàñĝüàĝé'š éẋţéñšîöñš ţĥàţ šéñđš à ƒîļé'š
ƃýţéš ţö ţĥé þļüĝîñ àñđ ŕéàđš ƃàçķ ţĥé ļöçàţéđ çöḿḿéñţš. Ţĥé þļüĝîñ þàŕšéš éàçĥ
ƒîļé ŵîţĥ ţĥé ļàñĝüàĝé'š ţŕéé-šîţţéŕ ĝŕàḿḿàŕ, šö à ḿàŕķéŕ îñšîđé à šţŕîñĝ, à
ţéḿþļàţé ļîţéŕàļ, à ŕéĝüļàŕ éẋþŕéššîöñ, ĴŠẊ ţéẋţ, à ĥéŕéđöç öŕ àñ üñǫüöţéđ ÇŠŠ
url() îš çöñţéñţ. Îţ šéţš àšîđé ţĥé đîŕéçţîṽéš ţĥé ļàñĝüàĝé'š ţööļš ŕéàđ, šüçĥ
àš eslint-disable, # noqa, # shellcheck àñđ ţĥé šĥéƃàñĝ, éṽéŕý çöḿḿéñţ îñ
à ƒîļé ŵĥöšé ĥéàđéŕ šàýš à ĝéñéŕàţöŕ öŵñš îţ, àñđ ƃļàñķ çöḿḿéñţ ļîñéš. Îñ
ŢýþéŠçŕîþţ àñđ ĴàṽàŠçŕîþţ à /** */ ƃļöçķ îš à đöç çöḿḿéñţ öñļý ŵĥéñ ñöţĥîñĝ
ƃüţ ŵĥîţéšþàçé šéþàŕàţéš îţ ƒŕöḿ à đéçļàŕàţîöñ, àñđ îţš ţàĝš, îñļîñé ļîñķš àñđ
çöđé šþàñš àŕé þļàçéĥöļđéŕš. Îñ Ŕüšţ /// àñđ /** */ đöçüḿéñţ ţĥé îţéḿ àƒţéŕ
ţĥéḿ àñđ //! àñđ /*! */ ţĥé ḿöđüļé ţĥéý šîţ îñ. Ĵàṽà'š Ĵàṽàđöç àñđ Ç#'š ẊḾĻ
đöçüḿéñţàţîöñ çöḿḿéñţš đöçüḿéñţ ţĥé đéçļàŕàţîöñ àƒţéŕ ţĥéḿ, àñđ ţĥéîŕ ĤŢḾĻ àñđ
ẊḾĻ ţàĝš àŕé þļàçéĥöļđéŕš. Ç àñđ Ç++ ƒîļéš àŕé àļšö ŕéàđ ƃý à ļéẋîçàļ šçàñ ţĥàţ
šĥàŕéš ñöţĥîñĝ ŵîţĥ ţĥé ĝŕàḿḿàŕ, àñđ à ƒîļé îš ļöçàţéđ öñļý ŵĥéñ ţĥé ţŕéé
ŕéþöŕţš à çöḿḿéñţ àţ éẋàçţļý ţĥé šþàñš ţĥé šçàñ ŕéàđš. À ƒîļé ŵĥöšé ḿàçŕöš ļéàṽé
šýñţàẋ éŕŕöŕš îñ ţĥé ţŕéé îš šţîļļ ļöçàţéđ, àñđ öñé ŵĥéŕé ţĥé ĝŕàḿḿàŕ ḿîšþļàçéš
àñý çöḿḿéñţ îš ñöţ. À çöḿḿéñţ ĥàš ţĥé šüƃĵéçţ comment àñđ đöçüḿéñţš ñöţĥîñĝ
ŵĥéñ ţĥé đéçļàŕàţîöñ îţ đöçüḿéñţš, öŕ öñé îţš šüƃĵéçţ þàţĥ ñàḿéš, ĥöļđš à
šýñţàẋ éŕŕöŕ. À Ŕüƃý ƒîļé
ţĥé šöüŕçéçöđé ƒöŕḿàţ ŕéàđš ĥàš îţš đéçļàŕéđ çöḿḿéñţš ŕéàđ ţĥŕöüĝĥ ţĥé šàḿé
þļüĝîñ'š çöḿḿéñţ þŕöṽîđéŕ, ƃéšîđé ţĥé ƒöŕḿàţ'š šţŕîñĝš: à ƒöŕḿàţ ţĥàţ šüþþļîéš
ñö çöḿḿéñţš öƒ îţš öŵñ ƒàļļš ƃàçķ ţö ţĥé þŕöṽîđéŕ ƒöŕ ţĥé ƒîļé'š ļàñĝüàĝé. À ƒîļé ţĥé ĝŕàḿḿàŕ çàññöţ þàŕšé ŵĥöļé îš ñöţ
ļöçàţéđ, àñđ îţš çöḿḿéñţ çĥéçķ đîđ ñöţ ŕüñ. Ţĥé çàñàŕý çöḿéš ƒŕöḿ
ţĥé þļüĝîñ'š ḿàñîƒéšţ àñđ ĝöéš ţĥŕöüĝĥ ţĥé þļüĝîñ ƃéšîđé éṽéŕý ŕéàļ ƒîļé. Ŵĥéñ ñö
îñšţàļļéđ þļüĝîñ ŕéàđš à đéçļàŕéđ ƒîļé'š ļàñĝüàĝé, à çĥéçķ öṽéŕ ţĥé þŕöĵéçţ
ŕéþöŕţš ţĥé ƒîļé üñŕéàđ àñđ ñàḿéš ţĥé þļüĝîñ ţö îñšţàļļ.
À ƒöŕḿàţ ŵĥöšé ŕéàđéŕ þàŕšéš à ƒîļé çàñ šüþþļý ţĥàţ ƒîļé'š çöḿḿéñţš ţöö. Šüçĥ à þŕöṽîđéŕ šçàñš ţĥé ƃýţéš àñđ ŕéƒüšéš à đöçüḿéñţ ŵĥöšé çöḿḿéñţš îţš šçàñ àñđ ţĥé ƒöŕḿàţ'š þàŕšéŕ đîšàĝŕéé àƃöüţ, šö à çöḿḿéñţ îš ñéṽéŕ þļàçéđ àþþŕöẋîḿàţéļý. Ţĥé ÝÀḾĻ ƒöŕḿàţ šçàñš ƒöŕ çöḿḿéñţš öüţšîđé ǫüöţéđ šçàļàŕš àñđ ƃļöçķ šçàļàŕ ƃöđîéš, àñđ ĥöļđš ţĥé šçàñ ţö ţĥé çöḿḿéñţ ļîñéš ţĥé ÝÀḾĻ þàŕšéŕ ŕéþöŕţš.
Éṽéŕý ƒöŕḿàţ ŵĥöšé ŕéàđéŕ ŕéàđš à þļàîñ ẊḾĻ ƒîļé šĥàŕéš ţĥé ẊḾĻ ƒöŕḿàţ'š
þŕöṽîđéŕ, ŕéĝîšţéŕéđ üñđéŕ éàçĥ ƒöŕḿàţ'š öŵñ ñàḿé. Îţ šçàñš ƒöŕ <!-- -->
öüţšîđé ţàĝš, ÇĐÀŢÀ šéçţîöñš, þŕöçéššîñĝ îñšţŕüçţîöñš àñđ đéçļàŕàţîöñš, àñđ
ĥöļđš éàçĥ çöḿḿéñţ ţö ţĥé öƒƒšéţš encoding/xml ŕéþöŕţš. Îţ ŕéƒüšéš à đöçüḿéñţ
ţĥé þàŕšéŕ ŕéĵéçţš, šüçĥ àš öñé ĥöļđîñĝ -- îñšîđé à çöḿḿéñţ, ŵĥîçĥ ţĥé ẊḾĻ
šþéçîƒîçàţîöñ ƒöŕƃîđš, àñđ öñé ŵîţĥ à çöḿḿéñţ îñšîđé îţš ĐÖÇŢÝÞÉ, ŵĥîçĥ ţĥé
þàŕšéŕ ŕéàđš àš þàŕţ öƒ ţĥé đéçļàŕàţîöñ. Éàçĥ çöḿḿéñţ îš ñàḿéđ ƒöŕ ţĥé éļéḿéñţ
îţ šîţš öñ, àš îñ comment/resources/string[greeting]. À ļîñé öƒ çöḿḿéñţéđ-öüţ
ḿàŕķüþ ƃéçöḿéš à þļàçéĥöļđéŕ, àñđ ţĥé šüþþŕéššîöñš Þŕéţţîéŕ, ţĥé ĴéţƂŕàîñš ÎĐÉš
àñđ ŔéŠĥàŕþéŕ ŕéàđ àŕé đîŕéçţîṽéš. À ƒöŕḿàţ ţĥàţ ķééþš îţš ẊḾĻ îñšîđé àñ àŕçĥîṽé
šüþþļîéš ñö çöḿḿéñţš, ƃéçàüšé à çöḿḿéñţ ţĥéŕé ĥàš ñö šþàñ îñ ţĥé ƒîļé.
Ţĥé ĤŢḾĻ ƒöŕḿàţ ŕéàđš çöḿḿéñţš ƃý ţĥé ĤŢḾĻ ţöķéñîžéŕ'š ŕüļéš. Îţ šçàñš ƒöŕ
<!-- öüţšîđé ţàĝš, đöçţýþéš, ƃöĝüš çöḿḿéñţš àñđ ţĥé ţéẋţ öƒ ŕàŵ ţéẋţ éļéḿéñţš
šüçĥ àš <script>, <style> àñđ <textarea>, çļöšéš à çöḿḿéñţ öñ --> öŕ
--!>, àñđ ŕéàđš <!--> àñđ <!---> àš éḿþţý çöḿḿéñţš. Îţ ĥöļđš éàçĥ çöḿḿéñţ
ţö ţĥé öƒƒšéţš ţĥé x/net/html ţöķéñîžéŕ ŕéþöŕţš, àñđ ţö ţĥé çöḿḿéñţš ţĥé ĤŢḾĻ
þàŕšéŕ ƒîñđš, ŵĥîçĥ ŕéàđš ŠṼĜ àñđ ḾàţĥḾĻ çöñţéñţ ƃý ŕüļéš öƒ îţš öŵñ. Îţ ŕéƒüšéš
à đöçüḿéñţ ţĥé ţĥŕéé đîšàĝŕéé öñ, àñđ öñé ţĥàţ éñđš îñšîđé à çöḿḿéñţ. À çöḿḿéñţ
îš ñàḿéđ ƒöŕ ţĥé éļéḿéñţ ţĥàţ ƒöļļöŵš îţ, àš îñ comment/p[greeting].
Çöñđîţîöñàļ çöḿḿéñţš, šéŕṽéŕ-šîđé îñçļüđéš, ḿàŕķđöŵñļîñţ îñšţŕüçţîöñš àñđ ţĥé
ḿàŕķéŕš Ŕéàçţ ŵŕîţéš îñţö à þàĝé îţ ŕéñđéŕš öñ ţĥé šéŕṽéŕ àŕé đîŕéçţîṽéš.
Ţĥé Ḿàŕķđöŵñ ƒöŕḿàţ ŕéàđš à đöçüḿéñţ àš îţš ŕéàđéŕ đöéš, ŵîţĥ ƒŕöñţ ḿàţţéŕ šéţ
àšîđé àñđ ţĥé ƃöđý þàŕšéđ ƃý ţĥé Ḿàŕķđöŵñ þàŕšéŕ. À çöḿḿéñţ îš àñ îñļîñé ĤŢḾĻ
çöḿḿéñţ, öŕ à çöḿḿéñţ îñšîđé àñ ĤŢḾĻ ƃļöçķ, ŵĥîçĥ ţĥé ĤŢḾĻ ƒöŕḿàţ'š šçàñ
ļöçàţéš. Éṽéŕý <!-- îñ ţĥé ƃöđý ḿüšţ öþéñ öñé öƒ ţĥöšé öŕ šîţ îñ çöñţéñţ, šüçĥ
àš à çöđé šþàñ, à ƒéñçéđ öŕ îñđéñţéđ çöđé ƃļöçķ, àñ ĤŢḾĻ ţàĝ öŕ à ƃàçķšļàšĥ
éšçàþé, öŕ ţĥé đöçüḿéñţ îš ŕéƒüšéđ. Šö îš à çöḿḿéñţ çļöšîñĝ öñ --!>, ŵĥîçĥ ţĥé
Ḿàŕķđöŵñ þàŕšéŕ àñđ àñ ĤŢḾĻ þàŕšéŕ çļöšé îñ đéŕéñţ þļàçéš. À çöḿḿéñţ îš ñàḿéđ
ƒöŕ ţĥé šéçţîöñ îţ šîţš îñ, àš îñ comment/install/from-homebrew. Ţĥé
Đöçüšàüŕüš truncate ḿàŕķéŕ, ţĥé šéçţîöñ ķàþî ŵŕîţéš îñţö à ŕüļéš ƒîļé (àñđ à
kapi:voice þöîñţéŕ šéçţîöñ), ţĥé
ḿàŕķéŕš öƒ à ĝéñéŕàţéđ ŕéĝîöñ àñđ ḿàŕķđöŵñļîñţ àñđ Þŕéţţîéŕ îñšţŕüçţîöñš àŕé
đîŕéçţîṽéš.
Ţĥé ḾĐẊ ƒöŕḿàţ ŕéàđš à đöçüḿéñţ ŵîţĥ îţš ŕéàđéŕ'š öŵñ šçàñ, ŵĥîçĥ šéþàŕàţéš
Ḿàŕķđöŵñ ƒŕöḿ ÉŠḾ šţàţéḿéñţš, ĴŠẊ éļéḿéñţš àñđ ţöþ-ļéṽéļ éẋþŕéššîöñš. À çöḿḿéñţ
îš à ţöþ-ļéṽéļ éẋþŕéššîöñ ţĥàţ ĥöļđš öñé /* */ çöḿḿéñţ, šüçĥ àš
{/* A note. */}. Éṽéŕý {/* àñđ <!-- îñ ţĥé ƒîļé ḿüšţ öþéñ šüçĥ à çöḿḿéñţ,
šîţ îñšîđé öñé, öŕ šîţ îñ çöñţéñţ: çöđé öŕ ƒŕöñţ ḿàţţéŕ îñ à Ḿàŕķđöŵñ šþàñ, ŵĥîçĥ
ţĥé Ḿàŕķđöŵñ ƒöŕḿàţ ŕéàđš, çöđé îñ ţĥé Ḿàŕķđöŵñ çĥîļđŕéñ öƒ à ĴŠẊ éļéḿéñţ, öŕ àñ
ÉŠḾ šţàţéḿéñţ. À đöçüḿéñţ ŵîţĥ àñ éẋþŕéššîöñ
çöḿḿéñţ îñšîđé à ĴŠẊ éļéḿéñţ öŕ à þàŕàĝŕàþĥ, àñ ĤŢḾĻ çöḿḿéñţ, ŵĥîçĥ ḾĐẊ đöéš ñöţ
àļļöŵ, öŕ àñ éẋþŕéššîöñ ĥöļđîñĝ ḿöŕé ţĥàñ öñé çöḿḿéñţ îš ŕéƒüšéđ. À ƒîļé ŵĥöšé
ƒîŕšţ çöḿḿéñţ šàýš DO NOT EDIT ƃéļöñĝš ţö îţš ĝéñéŕàţöŕ, àñđ îţš çöḿḿéñţš àŕé
šéţ àšîđé àš ĝéñéŕàţéđ. Þŕéţţîéŕ, Đöçüšàüŕüš truncate, ḿàŕķđöŵñļîñţ àñđ ÉŠĻîñţ
îñšţŕüçţîöñš àŕé đîŕéçţîṽéš.
Ţĥé ÞÖ ƒöŕḿàţ ŕéàđš à çöḿḿéñţ àš à ļîñé ţĥàţ öþéñš ŵîţĥ #, öţĥéŕ ţĥàñ àñ
öƃšöļéţé éñţŕý'š #~ ļîñé, àñđ ĥöļđš îţš šçàñ ţö ţĥé çöḿḿéñţš ţĥé ÞÖ ŕéàđéŕ
þàŕšéš. Ţŕàñšļàţöŕ çöḿḿéñţš àŕé þŕöšé, ñàḿéđ ƒöŕ ţĥé éñţŕý ţĥéý šîţ îñ, àš îñ
comment/menu/Goodbye. Àñ éẋţŕàçţéđ çöḿḿéñţ (#.) îš ŕéŵŕîţţéñ ƃý ţĥé ñéẋţ
éẋţŕàçţîöñ àñđ šéţ àšîđé àš ĝéñéŕàţéđ, àñđ ŕéƒéŕéñçéš, ƒļàĝš àñđ à þŕéṽîöüš
ḿšĝîđ àŕé ŕéàđ ƃý ĝéţţéẋţ'š ţööļš àñđ šéţ àšîđé àš đîŕéçţîṽéš. À ƒîļé ţĥé
ŕéàđéŕ ŕéàđš ţŕàñšçöđéđ, šüçĥ àš öñé îñ ÜŢƑ-16, îš ŕéƒüšéđ, šîñçé à šþàñ îñ ţĥé
ţéẋţ ţĥé ŕéàđéŕ ŕéàđš îš ñöţ à šþàñ îñ ţĥé ƒîļé.
Ţĥé þŕöþéŕţîéš ƒöŕḿàţ ŕéàđš à çöḿḿéñţ àš à ļîñé ţĥàţ öþéñš ŵîţĥ # öŕ !
öüţšîđé à ṽàļüé'š çöñţîñüàţîöñ, ĥöļđš îţš šçàñ ţö ţĥé ļîñéš ţĥé þŕöþéŕţîéš
ŕéàđéŕ ŕéàđš àš çöḿḿéñţš, àñđ ñàḿéš éàçĥ çöḿḿéñţ ƒöŕ ţĥé ķéý ţĥàţ ƒöļļöŵš îţ.
Öķàþî'š éẋţŕàçţîöñ đîŕéçţîṽéš, šüçĥ àš #_skip, àñđ ÎñţéļļîĴ'š
# suppress inspection àŕé đîŕéçţîṽéš.
Ƒöŕ à ƒîļé îţš ŕéàđéŕ þàŕšéš, comments: true àđđš ţĥé çöḿḿéñţ ƃļöçķš ţö ţĥé
ŕéàđéŕ'š ƃļöçķš ƒöŕ çĥéçķîñĝ, àñđ ţĥé ƒîļé çöñṽéŕĝéš ţĥŕöüĝĥ îţš ŕéàđéŕ
üñçĥàñĝéđ. comments: {only: true} ḿàķéš ţĥé çöḿḿéñţ ƃļöçķš ţĥé ƒîļé'š ŵĥöļé
çöñţéñţ: ţĥé ƒöŕḿàţ'š þŕöṽîđéŕ ļöçàţéš ţĥéḿ, ţĥé ŕéàđéŕ ñéṽéŕ ŕéàđš ţĥé ṽàļüéš,
àñđ à çĥéçķ ţĥàţ àšķš ƒöŕ ŕéàđéŕ ṽàļîđàţîöñ ŕéþöŕţš îţ üñšüþþöŕţéđ. Öñé
þŕéđîçàţé, ResolvedFile.CommentsOnly, ĥöļđš ƒöŕ šüçĥ à ƒîļé àñđ ƒöŕ à ƒîļé ñö
ŕéàđéŕ çöṽéŕš, àñđ éṽéŕý þàţĥ ţĥàţ ŕéàđš ṽàļüéš þàššéš öṽéŕ ţĥé ƒîļé ƃý îţ:
éẋţŕàçţîöñ àñđ đŕîƒţ đéţéçţîöñ (project.ExtractToBlockStore,
project.CompareSourceStamps), çöñṽéŕĝéñçé, ƒļöŵ ŕüñš, ḿéŕĝé, kapi extract,
ţĥé šöüŕçé àñđ ţàŕĝéţ üñîţš ƃéĥîñđ çöṽéŕàĝé, ţĥé þļàñ àñđ ţĥé šĥîþ ĝàţéš, ţĥé
îḿþļîçîţ îñþüţš öƒ kapi stats àñđ kapi inspect, àñđ ţĥé šçàñ à þüšĥ ŕéàđš.
À çĥéçķ ŕéàđš šüçĥ à ƒîļé ţĥŕöüĝĥ checkFormats.commentsOnly àñđ à šöüŕçé
üñîţ ñàŕŕöŵéđ ƃý VerifyUnit.OnlyComments, ƒöŕ ŵĥîçĥ readSource ŕéàđš ñö
ṽàļüé. À çĥéçķ öƒ ƒîļéš ñàḿéđ öñ ţĥé çöḿḿàñđ ļîñé öŕ ţĥŕöüĝĥ ḾÇÞ check_file
ŕéàđš ţĥéîŕ ṽàļüéš ţöö, àţ ţĥé þöîñţ ţĥé çöñţéñţ ŕéšöļṽéš ţö þàšţ ţĥé îţéḿ
(KapiProject.ContentItemForPath). Àñ îţéḿ đéçļàŕéđ ƒöŕ çöḿḿéñţš àļöñé çļàîḿš
ţĥé ṽàļüéš öƒ ñö ƒîļé, ŵĥéŕéṽéŕ ţĥé ŕéçîþé ļîšţš îţ: ţĥé ƒîŕšţ öţĥéŕ îţéḿ ţĥàţ
ḿàţçĥéš à ƒîļé çļàîḿš àñđ ŕéàđš îţš ṽàļüéš, àñđ ResolvedFile.CommentItem ñàḿéš
ţĥé îţéḿ àţ ŵĥöšé þöîñţ ţĥé çöḿḿéñţš šîţ, šö à çĥéçķ ŕéàđš ƃöţĥ ļàýéŕš öƒ ţĥàţ
ƒîļé. Ļöàđîñĝ ŕéĵéçţš only ƃéšîđé à ţàŕĝéţ, ţàŕĝéţ ļàñĝüàĝéš, à ŕéđàçţîöñ, öŕ
à ŕéàđéŕ'š çöñƒîĝ öŕ þŕéšéţ. À đéçļàŕéđ ƒöŕḿàţ ţĥàţ šüþþļîéš ñö çöḿḿéñţš ļéàṽéš ţĥé çöḿḿéñţ çĥéçķ
ñöţ ŕüñ, àñđ à ƒöŕḿàţ ŵîţĥ ñö çöḿḿéñţ ƒöŕḿàţţéŕ ŕéþöŕţš ţĥé ƒöŕḿàţţéŕ àš
üñšüþþöŕţéđ.
Éṽéŕý þŕöṽîđéŕ þàššéš öñé çöñƒöŕḿàñçé šüîţé, core/comment/commenttest. À
þŕöṽîđéŕ'š ţéšţ šüþþļîéš ƒîẋţüŕéš àñđ îţš öŵñ šçàñ öƒ ţĥé šàḿé ƃýţéš, ḿàđé
ŵîţĥöüţ ţĥé þŕöṽîđéŕ, àñđ ţĥé šüîţé ĥöļđš ŵĥàţ ţĥé þŕöṽîđéŕ ļöçàţéđ ţö ţĥàţ
šçàñ. Éàçĥ çöḿḿéñţ šîţš îñ éẋàçţļý öñé àđđŕéššàƃļé çöḿḿéñţ öŕ öñé éẋçļüšîöñ. À
šþàñ ƃéĝîñš àţ ţĥé çöḿḿéñţ'š öþéñîñĝ ḿàŕķéŕ àñđ éñđš ŵîţĥ ţĥé çöḿḿéñţ, àñđ îţš
ļîñé ŕàñĝé îš çöüñţéđ ƒŕöḿ ţĥé ƃýţéš. Ţĥé ŕüñš ķééþ ñö ḿàŕķéŕ, à ḿàŕķéŕ îñšîđé à
šţŕîñĝ öŕ öţĥéŕ ļîţéŕàļ çöñţéẋţ îš ñéṽéŕ à çöḿḿéñţ, àñđ ţĥé þŕöṽîđéŕ'š çàñàŕý
îš ļöçàţéđ ŵîţĥ îţš đöüƃļéđ ŵöŕđ ƒļàĝĝéđ ƃý ţĥé ĥýĝîéñé çĥéçķ.
À þŕöṽîđéŕ šéţš àšîđé ţĥé đîŕéçţîṽéš îţš ļàñĝüàĝé'š ţööļçĥàîñ ŕéàđš. Ţĥé
ḿàŕķéŕš à þŕöĵéçţ'š öŵñ ţööļš ŕéàđ, šüçĥ àš ţĥé okapi-skip: ļîñéš à çöñţŕàçţ
àüđîţ çöļļéçţš, àŕé đéçļàŕéđ îñ ţĥé ŕéçîþé, üñđéŕ defaults.comments.directives
öŕ àñ îţéḿ'š comments: {directives: [...]}, àñđ ţĥé ļàýéŕ šéţš ţĥéḿ àšîđé ƒöŕ
éṽéŕý þŕöṽîđéŕ îñ ţĥé šàḿé ŵàý (comment.Locate). À çöḿḿéñţ ļîñé ŵĥöšé ţéẋţ,
àƒţéŕ îţš çöḿḿéñţ ḿàŕķéŕ àñđ ļéàđîñĝ ŵĥîţéšþàçé, šţàŕţš ŵîţĥ à đéçļàŕéđ ḿàŕķéŕ
îš àñ éẋçļüšîöñ ŵîţĥ ReasonDirective àñđ ţĥé ḿàŕķéŕ àš îţš ƒöŕḿ. À ḿàŕķéŕ
îñšîđé à çöḿḿéñţ šþļîţš îţ. Ţĥé þŕöṽîđéŕ ŕéàđš ţĥé ƒîļé à šéçöñđ ţîḿé ŵîţĥ ţĥé
ḿàŕķéŕ ļîñéš ƃļàñķéđ, éàçĥ þîéçé ķééþš ţĥé šüƃĵéçţ öƒ ţĥé çöḿḿéñţ îţ çàḿé ƒŕöḿ,
àñđ ţĥé ļàýéŕ ĥöļđš ţĥàţ ŕéàđîñĝ ţö ţĥé ƒîŕšţ ƃýţé ƒöŕ ƃýţé: àŵàý ƒŕöḿ ţĥé
ḿàŕķéŕš îţ ḿüšţ ļöçàţé ţĥé šàḿé çöḿḿéñţš ŵîţĥ ţĥé šàḿé ƃýţéš, àñđ îñšîđé à šþļîţ
çöḿḿéñţ îţš þîéçéš àñđ ţĥé ḿàŕķéŕš ḿüšţ ĥöļđ éṽéŕý ƃýţé öñçé. À ŕéàđîñĝ ţĥàţ
đîšàĝŕééš ļéàṽéš ţĥé ƒîļé'š çöḿḿéñţš üñļöçàţéđ. Ŵĥàţ à çöḿḿéñţ đöçüḿéñţš çöḿéš
ƒŕöḿ ţĥé ƒîŕšţ ŕéàđîñĝ, ƃéçàüšé ƃļàñķîñĝ à ļîñé çĥàñĝéš ŵĥàţ šîţš ƃéţŵééñ à đöç
çöḿḿéñţ àñđ îţš đéçļàŕàţîöñ, àñđ à þŕöṽîđéŕ ḿàý àţţàçĥ îţ đéŕéñţļý îñ ţĥé
šéçöñđ. À þŕöṽîđéŕ'š šĥàŕé öƒ ţĥîš îš LineText, ŵĥîçĥ ŕéàđš
öñé çöḿḿéñţ ļîñé àñđ ŕéḿöṽéš îţš ḿàŕķéŕ. À ļîñé îñšîđé à đéļîḿîţéđ çöḿḿéñţ ţĥàţ
ŕüñš öṽéŕ šéṽéŕàļ ļîñéš ĥöļđš ñö ḿàŕķéŕ öƒ îţš öŵñ, šö ñö đéçļàŕéđ đîŕéçţîṽé
ḿàŕķš îţ.
À ŕéçîþé çàñ àļšö þļàçé à ƒîļé'š çöḿḿéñţš àţ à ĝöṽéŕñàñçé þöîñţ öƒ ţĥéîŕ öŵñ,
ŵîţĥ àñ îţéḿ'š comments: {channel: ...} öŕ defaults.comments.channel. À
çĥéçķ ţĥéñ ĥöļđš éàçĥ çöḿḿéñţ ƃļöçķ ţö ţĥé ṽöîçé àñđ ţéŕḿš öƒ ţĥàţ þöîñţ àñđ
éàçĥ ƃļöçķ ţĥé ŕéàđéŕ éẋţŕàçţš ţö ţĥé îţéḿ'š þöîñţ
(Ç-02). Ţĥé
ļàýéŕ ḿàŕķš îţš ƃļöçķš (comment.IsBlock), ŵĥîçĥ îš ĥöŵ à çĥéçķ ţéļļš ţĥé ţŵö
àþàŕţ.
À ƃļöçķ àļšö ŕéçöŕđš ŵĥéţĥéŕ îţš çöḿḿéñţ đöçüḿéñţš à đéçļàŕàţîöñ
(comment.doc) àñđ ŵĥéţĥéŕ îţ đöçüḿéñţš ţĥé þàçķàĝé öŕ ḿöđüļé îţš ƒîļé ƃéļöñĝš
ţö (comment.package, comment.PackageDoc). Ţĥé Ĝö þŕöṽîđéŕ àñđ ţĥé šöüŕçéçöđé
þļüĝîñ'š Ĵàṽà þŕöṽîđéŕ ĝîṽé ţĥàţ çöḿḿéñţ ţĥé šüƃĵéçţ package, àñđ ţĥé Ŕüšţ
þŕöṽîđéŕ ĝîṽéš à ƒîļé'š îññéŕ đöç çöḿḿéñţ ţĥé šüƃĵéçţ module. Ñö öţĥéŕ
þŕöṽîđéŕ ĥàš öñé. Ţĥé çöḿḿéñţ ļîḿîţš à ṽöîçé þŕöƒîļé šéţš
(Çĥéçķš) ŕéàđ ƃöţĥ ḿàŕķš ţö çĥööšé ţĥé
ļîḿîţ à çöḿḿéñţ îš ĥéļđ ţö. File.LineKinds çļàššîƒîéš éàçĥ ļîñé öƒ à ƒîļé
ƒŕöḿ ţĥé šþàñš à þŕöṽîđéŕ ļöçàţéđ, àš çöđé, çöḿḿéñţ, þàçķàĝé đöç, šéţ àšîđé öŕ
ƃļàñķ, àñđ ţĥé đéñšîţý ļîḿîţ çöüñţš à çĥàñĝé'š àđđéđ ļîñéš ŵîţĥ îţ.
À çöḿḿéñţ çàñ àļšö ƃé ŕéŵŕîţţéñ. À þŕöṽîđéŕ ţĥàţ îḿþļéḿéñţš comment.Rewriter
ŕéñđéŕš þŕöšé îñţö îţš ļàñĝüàĝé'š çöḿḿéñţ šýñţàẋ, àñđ comment.Rewrite ĥöļđš
ţĥé ŕéšüļţ ţö comment.Contain ƃéƒöŕé àñýţĥîñĝ îš ŵŕîţţéñ. Çöñţàîñ ŕéǫüîŕéš
éṽéŕý ƃýţé ƃéƒöŕé àñđ àƒţéŕ ţĥé çöḿḿéñţ'š šþàñ ţö ƃé îđéñţîçàļ. Ţĥé þŕöṽîđéŕ
ḿüšţ ļöçàţé ţĥé ŕéŵŕîţţéñ ƒîļé ŵîţĥ ţĥé šàḿé çöḿḿéñţš àñđ šéţ-àšîđé ļîñéš, ḿöṽéđ
ƃý ţĥé ŕéŵŕîţé àñđ öţĥéŕŵîšé éǫüàļ. Ţĥé ŕéŵŕîţţéñ çöḿḿéñţ ḿüšţ šîţ öñ ţĥé šàḿé
šüƃĵéçţ, ŵîţĥ ţĥé šàḿé đéþŕéçàţîöñ ḿàŕķéŕ àñđ ţĥé šàḿé þļàçéĥöļđéŕš: çöđé
ƃļöçķš, ļîñķš, ŕéƒéŕéñçéš àñđ ļîšţ îţéḿš. Ŵĥéŕé ţĥé ļàñĝüàĝé ĥàš à ƒöŕḿàţţéŕ,
îţ ḿüšţ àĝŕéé ŵîţĥ ţĥé ŕéŵŕîţţéñ çöḿḿéñţ àñđ ŵîţĥ éṽéŕý çöḿḿéñţ îţ àĝŕééđ ŵîţĥ
ƃéƒöŕé, àñđ îţ ḿüšţ ļéàṽé àš ţĥéý àŕé ţĥé ļîñéš öƒ ţĥé ƒîļé îţ ļéƒţ àš ţĥéý ŵéŕé
ƃéƒöŕé. Ţĥé ļàšţ ŕüļé ĥöļđš çöđé à ƒöŕḿàţţéŕ àļîĝñš ŵîţĥ à çöḿḿéñţ, šüçĥ àš ţĥé
ƃöđý öƒ à öñé-ļîñé ƒüñçţîöñ àƒţéŕ à /* */ çöḿḿéñţ îñ îţš šîĝñàţüŕé. À ŕéŵŕîţé
ţĥàţ ƒàîļš àñý öƒ ţĥéšé îš ŕéƒüšéđ ŵîţĥ à ŕéàšöñ, àñđ ñöţĥîñĝ îš ŵŕîţţéñ.
Ţĥé Ĝö þŕöṽîđéŕ ŕéŵŕîţéš ļîñé çöḿḿéñţš àñđ /* */ çöḿḿéñţš. Îţ ķééþš à ļîñé
çöḿḿéñţ'š îñđéñţàţîöñ àñđ ļîñé éñđîñĝ, àñđ ŵŕîţéš éàçĥ ļîñé ŵîţĥ ţĥé ḿàŕķéŕ
ĝöƒḿţ üšéš. Îţ ŕéƒļöŵš à þàŕàĝŕàþĥ öŕ ļîšţ îţéḿ öñļý ŵĥéñ öñé öƒ îţš ļîñéš îš
ŵîđéŕ ţĥàñ ţĥé çöḿḿéñţ'š ŵîđéšţ ļîñé, öŕ 80 çöļüḿñš, ŵĥîçĥéṽéŕ îš ŵîđéŕ. À
çöḿḿéñţ îñ ţĥé þöšîţîöñ ĝöƒḿţ ŕéƒöŕḿàţš àš à đöç çöḿḿéñţ ĝöéš ţĥŕöüĝĥ
go/doc/comment'š þŕîñţéŕ, àš ĝöƒḿţ đöéš. Đîŕéçţîṽéš, ĝéñéŕàţéđ ƒîļéš, ţĥé çĝö
þŕéàḿƃļé àñđ éẋàḿþļé öüţþüţ àŕé ñöţ àđđŕéššàƃļé, àñđ à ŕéƒüšàļ ñàḿéš ŵĥàţ ţĥé
ƒîļé šéţš àšîđé.
À /* */ çöḿḿéñţ îš ŵŕîţţéñ îñ ţĥé ļàýöüţ îţ àļŕéàđý ĥàš, ŵĥîçĥ
comment.ParseLayout ŕéàđš ƒŕöḿ îţš ƃýţéš: ţĥé đéļîḿîţéŕš àš ŵŕîţţéñ, šüçĥ àš
/**, ţĥé šþàçé ƃéšîđé ţĥéḿ, ŵĥéţĥéŕ ţéẋţ šţàŕţš öñ ţĥé öþéñéŕ'š ļîñé öŕ éñđš
öñ ţĥé çļöšéŕ'š, ţĥé þŕéƒîẋ éàçĥ ļîñé ƃéļöŵ ţĥé öþéñéŕ'š öþéñš ŵîţĥ, šüçĥ àš à
ļîñé öƒ *, ĥöŵ àñ éḿþţý ļîñé ƃéţŵééñ þàŕàĝŕàþĥš îš ŵŕîţţéñ, ţĥé ƃļàñķ ļîñéš
àƃöṽé àñđ ƃéļöŵ ţĥé ţéẋţ, àñđ ţĥé ļîñé éñđîñĝ. Ţĥé ţéẋţ öƒ ţĥé çöḿḿéñţ îš ŵĥàţ
ŕéḿàîñš, àñđ ţĥé Ĝö þŕöṽîđéŕ ŕéàđš ţĥé çöḿḿéñţ'š þŕöšé ƒŕöḿ ţĥàţ šàḿé ţéẋţ, šö
à çĥéçķ àñđ à ŕéŵŕîţé ŕéàđ öñé çöḿḿéñţ ţĥé šàḿé ŵàý. Ŕéñđéŕîñĝ à çöḿḿéñţ'š öŵñ
ţéẋţ îñ îţš ļàýöüţ ŕéþŕöđüçéš îţš ƃýţéš. À đéļîḿîţéđ çöḿḿéñţ éñđš àţ ţĥé ƒîŕšţ
*/, šö ţéẋţ ĥöļđîñĝ */, öŕ ţéẋţ ŵĥöšé ƒîŕšţ çĥàŕàçţéŕ çöḿþļéţéš öñé ŵîţĥ
ţĥé þŕéƒîẋ ƃéƒöŕé îţ, îš ŕéƒüšéđ àš terminator. Ñö éšçàþé ƒöŕ */ éẋîšţš
îñšîđé à Ĝö çöḿḿéñţ, àñđ à ŕéŵŕîţé ţĥàţ çĥàñĝéđ ţĥé ţéẋţ ţö àṽöîđ îţ ŵöüļđ ŵŕîţé
þŕöšé ñöƃöđý ŵŕöţé. À çöḿḿéñţ ḿàđé öƒ šéṽéŕàļ çöḿḿéñţš, šüçĥ àš à /* */
çöḿḿéñţ ƃéšîđé ļîñé çöḿḿéñţš îñ öñé ĝŕöüþ, ĥàš ñö öñé ļàýöüţ àñđ îš ŕéƒüšéđ àš
layout. TestProseP3_go ŕéŵŕîţéš éṽéŕý Ĝö çöḿḿéñţ îñ ţĥé ŕéþöšîţöŕý ŵîţĥ îţš
öŵñ þŕöšé, àñđ TestProseP4_go đöéš ţĥé šàḿé ƒöŕ éṽéŕý /* */ çöḿḿéñţ îñ ţĥé
ŕéþöšîţöŕý àñđ îñ ţĥé Ĝö ţööļçĥàîñ'š šöüŕçé ţŕéé, àñđ ŕéǫüîŕéš éàçĥ ƒîļé ţö
šţàý ƃýţé-îđéñţîçàļ.
À çöḿḿéñţ îñ à ļàñĝüàĝé ţĥé šöüŕçéçöđé þļüĝîñ ŕéàđš îš ŵŕîţţéñ ŵĥéñ ţĥé þļüĝîñ'š
ḿàñîƒéšţ đéçļàŕéš ţĥàţ ļàñĝüàĝé ŵŕîţàƃļé (rewrite öñ à capabilities.comments
éñţŕý). Ţĥé ĥöšţ ŵŕîţéš îţ, ñéṽéŕ ţĥé þļüĝîñ. Îţ ŕéàđš ţĥé çöḿḿéñţ'š ļàýöüţ ƒŕöḿ
ţĥé ƒîļé'š ƃýţéš ţĥŕöüĝĥ ţĥé ḿàŕķéŕš ţĥé ḿàñîƒéšţ ñàḿéš, comment.ParseLayout
ƒöŕ à đéļîḿîţéđ çöḿḿéñţ àñđ comment.ParseLineLayout ƒöŕ à ĝŕöüþ öƒ ļîñé
çöḿḿéñţš, ŕéñđéŕš ţĥé ţéẋţ îñţö ţĥàţ ļàýöüţ àñđ šþļîçéš îţ îñ. Contain ţĥéñ
ĥàš ţĥé þļüĝîñ ļöçàţé ţĥé ŕéŵŕîţţéñ ƒîļé ţĥŕöüĝĥ LocateComments, šö ţĥé çĥéçķ
à ŕéŵŕîţé îš ĥéļđ ţö ŕüñš îñ ţĥé þļüĝîñ'š ĝŕàḿḿàŕ àñđ šĥàŕéš ñö çöđé ŵîţĥ ţĥé
ŕéñđéŕéŕ. Ţĥé ţéẋţ îš ñöţ ŕéƒļöŵéđ, àñđ ţĥé éñţŕý'š width đöéš ñöţ àþþļý.
Šüçĥ à ŕéŵŕîţé îš ĥéļđ ţö ţĥé ƒöŕḿàţţéŕ ţĥé ƒîļé'š þŕöĵéçţ üšéš, ŵĥîçĥ ŕüñš îñ
ţĥé ĥöšţ ƃéçàüšé îţš çöñƒîĝüŕàţîöñ àñđ îĝñöŕé ƒîļéš ƃéļöñĝ ţö ţĥé þŕöĵéçţ àñđ
ţĥé þļüĝîñ šééš öñļý ƃýţéš. Ţĥé ĥöšţ ļööķš ƒöŕ ţĥé ḿàŕķéŕ ƒîļéš éàçĥ ƒöŕḿàţţéŕ
ţĥé ḿàñîƒéšţ ļîšţš, šüçĥ àš .prettierrc öŕ à vite.config.ts ţĥàţ ļöàđš
ṽîţé-þļüš, îñ ţĥé ƒîļé'š đîŕéçţöŕý àñđ ţĥé đîŕéçţöŕîéš àƃöṽé îţ, àñđ ŕüñš ţĥé
ñéàŕéšţ öñé'š çöḿḿàñđ öñ ţĥé ƒîļé'š ƃýţéš, ƒŕöḿ node_modules/.bin öŕ PATH.
Ţĥé þàţĥ îţ ĝîṽéš ţĥé ƒöŕḿàţţéŕ ĥàš îţš šýḿƃöļîç ļîñķš ŕéšöļṽéđ, šîñçé à
ƒöŕḿàţţéŕ ḿàţçĥéš îţš îĝñöŕé ƒîļéš àĝàîñšţ ţĥàţ þàţĥ. Ƃéƒöŕé îţš öüţþüţ îš
ţŕüšţéđ, ţĥé ƒöŕḿàţţéŕ ḿüšţ ŕéŵŕîţé ţĥé ḿàñîƒéšţ'š ƒöŕḿàţţéŕ çàñàŕý àţ ţĥé
ƒîļé'š öŵñ þàţĥ. À ƒöŕḿàţţéŕ ţĥàţ îš ñöţ çöñƒîĝüŕéđ, ñöţ îñšţàļļéđ, öŕ ļéàṽéš ţĥé
çàñàŕý àš îţ îš đîđ ñöţ ŕüñ: Contain ŕéţüŕñš comment.ErrFormatterNotRun, àñđ
ţĥé éñţŕý ŕéþöŕţš đîđ-ñöţ-ŕüñ ŵîţĥ ţĥé ŕéàšöñ formatter àñđ ŵŕîţéš ñöţĥîñĝ. À
çĥéçķ öƒ à ƒîļé îñ šüçĥ à ļàñĝüàĝé đöéš ñöţ ŕüñ ţĥé ƒöŕḿàţţéŕ, ŵĥîçĥ îţ ŕéþöŕţš
àš üñšüþþöŕţéđ.
Ŕüññîñĝ ţĥàţ ƒöŕḿàţţéŕ ŕüñš çöđé ţĥé þŕöĵéçţ çöñţŕöļš. Ţĥé þŕöĵéçţ çàñ îñšţàļļ
ţĥé éẋéçüţàƃļé îñ node_modules/.bin, àñđ à ƒöŕḿàţţéŕ îñšţàļļéđ àñýŵĥéŕé ļöàđš
ţĥé þŕöĵéçţ'š çöñƒîĝüŕàţîöñ: þŕéţţîéŕ îḿþöŕţš à ĴàṽàŠçŕîþţ çöñƒîĝüŕàţîöñ ƒîļé àñđ
ţĥé þļüĝîñš à .prettierrc ñàḿéš, àñđ ţĥé ṽîţé-þļüš oxfmt éṽàļüàţéš
vite.config.ts. Šö ţĥé ƒöŕḿàţţéŕ îš àñ éẋéç šîţé üñđéŕ éẋéçüţîöñ ţŕüšţ
(É-06), đéçîđéđ ŵĥéñ àñ éđîţ ŵöüļđ ŕüñ îţ. Îţš ŕéçöŕđ
îš ķéýéđ ƃý ţĥé çöñƒîĝüŕàţîöñ ƒîļé ţĥàţ šéļéçţéđ îţ, àñđ îţš đîĝéšţ ĥöļđš ţĥé
ƒöŕḿàţţéŕ'š ñàḿé àñđ çöḿḿàñđ, ţĥé ŕéšöļṽéđ éẋéçüţàƃļé'š ƃýţéš àñđ ţĥàţ ƒîļé'š
ƃýţéš, šö à ñéŵ éẋéçüţàƃļé öŕ àñ éđîţéđ çöñƒîĝüŕàţîöñ àšķš àĝàîñ. Ţĥé đîĝéšţ àļšö
ĥöļđš ţĥé îñţéŕþŕéţéŕ ţĥàţ ŕüñš ţĥé éẋéçüţàƃļé àñđ éṽéŕý çöñƒîĝüŕàţîöñ ƒîļé ţĥé
ƒöŕḿàţţéŕ çàñ ļöàđ ƃéţŵééñ ţĥé éđîţéđ ƒîļé àñđ ţĥàţ ƒîļé; ŵĥàţ ţĥàţ çöđé îḿþöŕţš
îš öüţšîđé îţ. kapi apply ŕüñš ţĥé ƒöŕḿàţţéŕ üñđéŕ KAPI_TRUST_EXEC, öñ à
ŕéçöŕđéđ àļļöŵ, öŕ àƒţéŕ àšķîñĝ à þéŕšöñ àţ à ţéŕḿîñàļ, ŵĥöšé àñšŵéŕ îţ ŕéçöŕđš,
àñđ à çĥàñĝé-šéţ ŕéàđ ƒŕöḿ šţàñđàŕđ îñþüţ ļéàṽéš ñö öñé ţö àšķ. Çöḿḿéñţ éđîţš
ŕüñ ţĥŕöüĝĥ kapi apply àļöñé, šö ţĥé àĝéñţ šüŕƒàçé šţàŕţš ñö ƒöŕḿàţţéŕ: àñ
àĝéñţ ţĥàţ ḿàý ŵŕîţé ƒîļéš çàñ ŵŕîţé ţĥé çöñƒîĝüŕàţîöñ à ƒöŕḿàţţéŕ ļöàđš.
Ŵîţĥöüţ ţŕüšţ ţĥé éđîţ
đîđ ñöţ ŕüñ, ŵîţĥ ţĥé ŕéàšöñ formatter, àñđ ñö ƒöŕḿàţţéŕ þŕöçéšš šţàŕţš. Ŵĥéñ
ţĥé ĥöšţ ļööķš ƒöŕ ţĥé éẋéçüţàƃļé öñ PATH, îţ šķîþš àñ éñţŕý ţĥàţ îš ñöţ àñ
àƃšöļüţé þàţĥ, šîñçé šüçĥ àñ éñţŕý ñàḿéš à đîŕéçţöŕý ŕéļàţîṽé ţö ţĥé ŵöŕķîñĝ
đîŕéçţöŕý, àñđ à ñöţ-îñšţàļļéđ đéţàîļ ļîšţš ţĥé éñţŕîéš îţ šķîþþéđ. À Ĝö çöḿḿéñţ
îš ĥéļđ ţö go/format, ţĥé ļîƃŕàŕý ĝöƒḿţ îš ƃüîļţ öñ, îñšîđé ţĥé ķàþî ƃîñàŕý, šö
à Ĝö éđîţ ŕüñš ñö ƒöŕḿàţţéŕ éẋéçüţàƃļé.
ŢýþéŠçŕîþţ, ŢŠẊ àñđ ĴàṽàŠçŕîþţ àŕé đéçļàŕéđ ŵŕîţàƃļé. À ĴŠĐöç ƃļöçķ'š ţàĝš,
ţĥéîŕ ţýþéš àñđ ñàḿéš, àñđ îţš {@link} ŕéƒéŕéñçéš àŕé þļàçéĥöļđéŕš, šö à
ŕéŵŕîţé ţĥàţ đŕöþš öŕ àđđš öñé îš ŕéƒüšéđ àš structure. Àñ éñţŕý ñàḿîñĝ à ƒîļé
ŵĥöšé çöḿḿéñţš öñļý à þļüĝîñ ŕéàđš, ŵĥéñ ñö šüçĥ þļüĝîñ îš îñšţàļļéđ, đîđ ñöţ
ŕüñ, ŵîţĥ ţĥé ŕéàšöñ no-reader àñđ ţĥé çöḿḿàñđ ţĥàţ îñšţàļļš ţĥé þļüĝîñ.
TestProseP3_typescript, TestProseP3_tsx àñđ TestProseP3_javascript ŕéŵŕîţé
éṽéŕý çöḿḿéñţ öƒ ţĥéîŕ ļàñĝüàĝé îñ ţĥé ŕéþöšîţöŕý ŵîţĥ îţš öŵñ þŕöšé, ţĥŕöüĝĥ
ţĥé þļüĝîñ, àñđ ŕéǫüîŕé éàçĥ ƒîļé ţö šţàý ƃýţé-îđéñţîçàļ.
Éàçĥ çöḿḿéñţ ƒöŕḿ ţĥéîŕ çöđé üšéš îš ŕéŵŕîţţéñ îñ ţĥé ļàýöüţ îţ îš ŵŕîţţéñ îñ:
ĝŕöüþš öƒ ļîñé çöḿḿéñţš àñđ çöḿḿéñţš àƒţéŕ çöđé, /* */ çöḿḿéñţš öñ öñé ļîñé
öŕ šéṽéŕàļ, ĴŠĐöç ƃļöçķš îñçļüđîñĝ ţĥöšé ŵĥöšé ţéẋţ šţàŕţš öñ ţĥé öþéñéŕ'š ļîñé,
àñđ çöḿḿéñţš îñšîđé ĴŠẊ ({/* */}). Ţéẋţ ĥöļđîñĝ */ îš ŕéƒüšéđ îñ éàçĥ
đéļîḿîţéđ ƒöŕḿ àñđ ŵŕîţţéñ îñ à ļîñé çöḿḿéñţ, ŵĥéŕé îţ çļöšéš ñöţĥîñĝ. À ļéĝàçý
ĤŢḾĻ-ļîķé çöḿḿéñţ (<!--) îñ à šçŕîþţ öþéñš ŵîţĥ ñö đéļîḿîţéŕ ţĥé ḿàñîƒéšţ
đéçļàŕéš, šö îţ ĥàš ñö ļàýöüţ ţö ķééþ àñđ îš ŕéƒüšéđ àš layout; ñö çöđé îñ
ţĥîš ŕéþöšîţöŕý ŵŕîţéš öñé. TestProseP4_typescript, TestProseP4_tsx àñđ
TestProseP4_javascript ŕéŵŕîţé éàçĥ ƒöŕḿ ŵîţĥ éẋàçţ ƃýţéš, ŵîţĥ ţĥé þļüĝîñ
ŕéàđîñĝ ţĥé ŕéšüļţ àñđ öẋƒḿţ àĝŕééîñĝ ŵîţĥ ţĥé ƒîļé.
kapi apply ŕéàçĥéš ţĥé ŕéŵŕîţé ţĥŕöüĝĥ à set_content öþéŕàţîöñ öñ ţĥé
çöḿḿéñţ'š ƃļöçķ, àđđŕéššéđ ƃý ƒîļé àñđ ţĥé îđ à çĥéçķ ŕéþöŕţš, îţš if_match
ţĥé çöḿḿéñţ'š ŕéṽîšîöñ (r: àñđ ţĥé ƒîŕšţ šîẋţééñ ĥéẋ đîĝîţš öƒ ţĥé
ƒîñĝéŕþŕîñţ); ḾÇÞ apply_edits ŕéƒüšéš à çöḿḿéñţ àš unsupported. À çĥéçķ ĝîṽéš éàçĥ ƒîñđîñĝ öñ à
çöḿḿéñţ location.comment_sha256, ţĥé ŠĤÀ-256 öƒ ţĥé çöḿḿéñţ'š ƃýţéš
(comment.Fingerprint), àñđ ţĥé éñţŕý çàŕŕîéš îţ ƃàçķ àš ţĥé ĝüàŕđ: à çöḿḿéñţ
ŵĥöšé ƃýţéš đéŕ îš ŕéƒüšéđ àš çĥàñĝéđ, àñđ öñé ţĥàţ öñļý ḿöṽéđ ţö öţĥéŕ
ļîñéš îš ŕéŵŕîţţéñ ŵĥéŕé îţ ñöŵ šîţš. Àñ éñţŕý ḿàý çàŕŕý ţĥé þŕöšé àš îţ ŵàš
ŕéàđ, current_text, îñšţéàđ, àñđ àñ éñţŕý ŵîţĥ ñéîţĥéŕ ĝüàŕđ îš ŕéĵéçţéđ
ƃéƒöŕé àñý éñţŕý îš àþþļîéđ. Ƃéƒöŕé ţĥé ƒîŕšţ çöḿḿéñţ öƒ à ļàñĝüàĝé îš ŵŕîţţéñ
îñ à ŕüñ, comment.VerifyRewriter ŕüñš à ŵŕîţé çàñàŕý: à ķñöŵñ çöḿḿéñţ
ŕéŵŕîţţéñ ŵîţĥ îţš öŵñ þŕöšé ḿüšţ šţàý ƃýţé-îđéñţîçàļ, àñđ à ķñöŵñ-ƃàđ ţéẋţ, à
ŕéŵŕîţé ĝüàŕđéđ ƃý à ƒîñĝéŕþŕîñţ ţĥé çöḿḿéñţ đöéš ñöţ ĥàṽé, àñđ à šþļîçé öñé
ƃýţé ƃéƒöŕé ţĥé çöḿḿéñţ ḿüšţ éàçĥ ƃé ŕéƒüšéđ. À ļàñĝüàĝé ŵîţĥ /* */ çöḿḿéñţš
àđđš öñé ţö ţĥé çàñàŕý, ŵĥîçĥ ḿüšţ àļšö ŕéŵŕîţé ţö îţšéļƒ, àñđ ţéẋţ ĥöļđîñĝ îţš
çļöšéŕ ḿüšţ ƃé ŕéƒüšéđ àš terminator. Ŵĥéñ ţĥé
çàñàŕý ƒàîļš, ñö çöḿḿéñţ öƒ ţĥàţ ļàñĝüàĝé îš ŵŕîţţéñ. À ƒîļé'š éđîţš àþþļý ƒŕöḿ
îţš ļàšţ çöḿḿéñţ ţö îţš ƒîŕšţ, ţĥé ƒîļé îš ŕéàđ àĝàîñ ƃéƒöŕé îţ îš ŵŕîţţéñ, àñđ
à çĥéçķ šçöþéđ ţö ţĥé ŵŕîţţéñ çĥàñĝé çöḿéš ƃàçķ ŵîţĥ ţĥé ŕéšüļţ.
Đéƒàüļţ öñ, ṽîà àñ îñṽéŕţéđ öþţ-öüţ
Šüŕƒàçîñĝ îš ţĥé đéƒàüļţ, çöñţŕöļļéđ þéŕ ƒöŕḿàţ ƃý à šîñĝļé ƃööļéàñ,
extractNonTranslatableContent, éẋþöšéđ àš à šçĥéḿà þŕöþéŕţý îñ ţĥé ĝéñéŕàţéđ
ƒöŕḿàţ ŕéƒéŕéñçé àñđ àççéþţéđ îñ ApplyMap üñđéŕ ţĥàţ ķéý. Ţĥé îḿþļéḿéñţàţîöñ îš
àñ îñṽéŕţéđ þŕîṽàţé ƒîéļđ:
// zero value false ⇒ surfacing ON (the opt-out default)
disableNonTranslatableContent bool
func (c *Config) ExtractNonTranslatableContent() bool { return !c.disableNonTranslatableContent }
func (c *Config) SetExtractNonTranslatableContent(v bool) { c.disableNonTranslatableContent = !v }
Ţĥé îñṽéŕšîöñ ḿéàñš à ƒŕéšĥļý žéŕö-ṽàļüéđ çöñƒîĝ (à ñéŵ ƒöŕḿàţ ţĥàţ ĥàš ñöţ ýéţ
ļéàŕñéđ àƃöüţ ţĥé ƒļàĝ, à çàļļéŕ ţĥàţ çöñšţŕüçţš à çöñƒîĝ ŵîţĥöüţ çàļļîñĝ
Reset) šüŕƒàçéš çöñţéñţ àüţöḿàţîçàļļý, ƃéçàüšé ţĥé đîšàƃļé ƃîţ ḿüšţ ƃé šéţ
éẋþļîçîţļý ţö ţüŕñ îţ öƒƒ. Ţĥé šàƒé-ƒöŕ-îñĝéšţîöñ ƃéĥàṽîöüŕ ñééđš ñö
çöñƒîĝüŕàţîöñ; öþţîñĝ öüţ îš éẋþļîçîţ. Ţĥé öƒƒ šŵîţçĥ éẋîšţš ƒöŕ ţŵö çàļļéŕš:
ţĥé þàŕîţý ĥàŕñéšš, ŵĥîçĥ þîñš ţĥé ƃŕîđĝé-ḿàţçĥîñĝ çöñƒîĝüŕàţîöñ, àñđ
ṽàļîđàţîöñ-öñļý öŕ þüŕé-þàššţĥŕöüĝĥ ƒļöŵš ţĥàţ ŵàñţ ñöţĥîñĝ ƃüţ šķéļéţöñ.
À ƒöŕḿàţ ḿàý àļšö šçöþé ŵĥàţ çöüñţš àš ḿéàñîñĝƒüļ çöñţéẋţ. Ţĥé đéšîĝñ-ţöķéñš
ŕéàđéŕ çöḿþöšéš ţĥé ĝéñéŕîç ĴŠÖÑ ŕéàđéŕ ƃüţ çàļļš
SetExtractNonTranslatableContent(false) öñ ţĥàţ îññéŕ çöñƒîĝ: à ţöķéñ'š
$value, $type, àñđ $extensions àŕé šţŕüçţüŕéđ ḿàçĥîñé đàţà (çöļöüŕš,
đîḿéñšîöñš, ƒöñţ ñàḿéš) ŕàţĥéŕ ţĥàñ çöñţéẋţüàļ þŕöšé, šö đéšîĝñ ţöķéñš šüŕƒàçé öñļý
$description àš ţŕàñšļàţàƃļé þŕöšé àñđ ļéţ éṽéŕýţĥîñĝ éļšé þàšš ţĥŕöüĝĥ àš
ñöñ-ţŕàñšļàţàƃļé šţŕüçţüŕé. Ţĥé çöñṽéñţîöñ îš üñîƒöŕḿ; éàçĥ ŕéàđéŕ đéçîđéš ŵĥîçĥ
öƒ îţš ƒŕàĝḿéñţš àŕé ĝéñüîñéļý çöñţéẋţ ŕàţĥéŕ ţĥàñ îñéŕţ đàţà.
Ŵĥîçĥ ƒöŕḿàţš éẋþöšé ţĥé ƒļàĝ, àñđ éẋàçţļý ŵĥàţ éàçĥ šüŕƒàçéš, îš ĝéñéŕàţéđ îñţö ţĥé Ƒöŕḿàţ Ŕéƒéŕéñçé; çöñţéñţ-ƒîđéļîţý îš ţĥé ŕéçîþé ƒöŕ àđđîñĝ šüŕƒàçîñĝ ţö à ƒöŕḿàţ.
Ŕöüñđ-ţŕîþ, ţŕàñšļàţîöñ-šķîþ, àñđ þàŕîţý àļļ šţîļļ ĥöļđ
Šüŕƒàçîñĝ îš àđđîţîṽé öṽéŕ ţĥé éẋîšţîñĝ ĝüàŕàñţééš.
- Ƃýţé-éẋàçţ ŕöüñđ-ţŕîþ. Ţĥé ṽéŕƃàţîḿ šöüŕçé ƃýţéš ñéṽéŕ ļéàṽé ţĥé šķéļéţöñ. À šüŕƒàçéđ ŕéñđéŕàƃļé ƃļöçķ šţàñđš îñ ƒöŕ ţĥé ŕéñđéŕéđ ƃöđý ṽîà à šķéļéţöñ ŕéƒ, öŕ à šüƃ-šķéļéţöñ: ṽéŕƃàţîḿ šéĝḿéñţš îñţéŕļéàṽéđ ŵîţĥ ŕ郚 ţö ţŕàñšļàţàƃļé šþàñš îñšîđé àñ öţĥéŕŵîšé-öþàǫüé þàýļöàđ. À šüŕƒàçéđ çöḿḿéñţ'š ƃýţéš àŕé çöþîéđ ṽéŕƃàţîḿ. Àñ üñţŕàñšļàţéđ ŕöüñđ-ţŕîþ îš ƃýţé-îđéñţîçàļ ŵîţĥ ţĥé ƒļàĝ öñ àñđ ŵîţĥ îţ öƒƒ. Ţŕàñšļàţîöñ öƒ à šüŕƒàçéđ ţŕàñšļàţàƃļé šþàñ šþļîçéš îñ þļàçé; ţĥé šüŕŕöüñđîñĝ šţŕüçţüŕé îš üñţöüçĥéđ.
- Ţŕàñšļàţîöñ-šķîþ. À šüŕƒàçéđ ƃļöçķ çàŕŕîéš
Translatable: false, šö ţĥé ţŕàñšļàţîöñ ţööļš šķîþ îţ ƃý ţĥé šàḿé ŕüļé ţĥéý àļŵàýš ĥàṽé (É-07); ţĥé þàýļöàđ šéñţ ţö à ḿöđéļ îš üñçĥàñĝéđ. - Þàŕîţý. Ţĥé ƃŕîđĝé ĥàš ñö ñöţîöñ öƒ šüŕƒàçéđ çöñţéẋţ, šö à ĥéàđ-ţö-ĥéàđ ŵîţĥ
šüŕƒàçîñĝ öñ ŵöüļđ đîṽéŕĝé ƃý çöñšţŕüçţîöñ: ţĥé ñàţîṽé šţŕéàḿ ŵöüļđ çàŕŕý éẋţŕà
Block/Dataþàŕţš ţĥé ƃŕîđĝé ñéṽéŕ éḿîţš, àñđ ţĥé çàñöñîçàļ þŕöĵéçţîöñ çöḿþàŕéš ţĥéPartTypešéǫüéñçé àñđ þéŕ-ƃļöçķTranslatableƒļàĝ. Ţĥé þàŕîţý çöñţŕàçţ îš "šàḿé šéḿàñţîç çöñƒîĝ → šàḿé ŕéšüļţš" ŕàţĥéŕ ţĥàñ "šàḿé đéƒàüļţš": ţĥé þàŕîţý ŕüññéŕ đüçķ-ţýþéšinterface{ SetExtractNonTranslatableContent(bool) }öñ ţĥé ŕéàđéŕ'š çöñƒîĝ àñđ ƒöŕçéš îţ ƒàļšé ƃéƒöŕé ŕéàđîñĝ, šö ţĥé ñàţîṽé šţŕéàḿ ḿàţçĥéš ţĥé ƃŕîđĝé. Ţĥé ŕöļéš àñđ þŕöþéŕţîéš à šüŕƒàçéđ ƃļöçķ çàŕŕîéš àŕé àđđîţîöñàļļý þàŕîţý-šàƒé çàŕŕîéŕš (ţĥé çàñöñîçàļ þŕöĵéçţîöñ éẋçļüđéšSemanticRole,Properties,Annotations, àñđ ţĥé þļàçéĥöļđéŕEquiv/Disp), ƃüţ ţĥé ƒļàĝ ŕàţĥéŕ ţĥàñ ţĥé þŕöĵéçţîöñ îš ŵĥàţ ķééþš ţĥé šüŕƒàçéđ þàŕţš ţĥéḿšéļṽéš öüţ öƒ ţĥé ĥéàđ-ţö-ĥéàđ (À-02).
Ţĥé SkeletonStore àļšö šüþþöŕţš ţĥé šüƃ-šķéļéţöñ îñ îţš öŵñ ŕîĝĥţ: ṽéŕƃàţîḿ
šéĝḿéñţš öƒ àñ öţĥéŕŵîšé-öþàǫüé þàýļöàđ îñţéŕļéàṽéđ ŵîţĥ ŕ郚 ţö ţŕàñšļàţàƃļé
šþàñš îñšîđé îţ. Ţĥîš îš ĥöŵ ţŕàñšļàţàƃļé þŕöšé éḿƃéđđéđ îñ àñ öþàǫüé šţŕüçţüŕé,
ţĥé ñàţüŕàļ-ļàñĝüàĝé ţéẋţ îñšîđé à Ŵöŕđ éǫüàţîöñ, îš ţŕàñšļàţéđ ŵĥîļé ţĥé
šüŕŕöüñđîñĝ ḿàţĥ îš ŕéþļàýéđ ƃýţé-ƒöŕ-ƃýţé
(Ḿ-04; šéé
Šķéļéţöñ Šţöŕé).
Ŕéàđéŕ-àššîĝñéđ îđéñţîţý
À ŕéàđéŕ ḿîñţš éàçĥ ƃļöçķ'š ID ƒŕöḿ ŵĥàţ ţĥé ƒöŕḿàţ öƒƒéŕš (àñ ẊĻÎƑƑ üñîţ îđ,
à ķéý þàţĥ, à þöšîţîöñàļ ñàḿé) àñđ ķééþš îţ üñîǫüé ŵîţĥîñ ţĥé đöçüḿéñţ ţĥŕöüĝĥ
model.IDBuilder: ţĥé ƒîŕšţ ƃļöçķ ţö çļàîḿ àñ îđ ķééþš îţ, à ŕéþéàţ îš
šéþàŕàţéđ ŵîţĥ àñ öŕđîñàļ (id#2), àñđ ţĥé đöçüḿéñţ'š öŵñ šþéļļîñĝ îš ŕéçöŕđéđ
üñđéŕ PropDocumentID šö ţĥé ŵŕîţéŕ çàñ þüţ îţ ƃàçķ. À çöñţàîñéŕ ţĥàţ đéļéĝàţéš
à ḿéḿƃéŕ ţö àñöţĥéŕ ŕéàđéŕ (àñ àŕçĥîṽé éñţŕý, àñ éḿƃéđđéđ ĤŢḾĻ šţŕîñĝ, àñ ÖĐƑ
þàŕţ) ǫüàļîƒîéš ţĥé ḿéḿƃéŕ'š îđš ŵîţĥ ţĥé çĥîļđ ļàýéŕ'š îđ ţĥŕöüĝĥ
model.QualifyMemberID, ĵöîñéđ ƃý MemberIDSeparator (_), šö ţŵö ḿéḿƃéŕš'
tu1 àŕé ţŵö îđš àñđ ţĥé ǫüàļîƒîéđ îđ šţîļļ šàţîéš àñ ẊĻÎƑƑ xs:NMTOKEN.
Ţĥéšé îđš àŕé ƒîļé-ļöçàļ; ĥöŵ ţĥéý ƃéçöḿé đüŕàƃļé îđéñţîţý àçŕöšš ŕéàđš îš
Ƒ-03.
Éđîţîöñš à ŕéàđéŕ ŕéàđš àñđ à ŵŕîţéŕ ŵŕîţéš
À ƃļöçķ ĥöļđš îţš çöñţéñţ àš þééŕ éđîţîöñš
(Ƒ-02). À ŕéàđéŕ ƒîļéš ţĥé éđîţîöñ îţ
ŕéàđ üñđéŕ ţĥé žéŕö éđîţîöñ ķéý, ţĥé đöçüḿéñţ'š öŵñ éđîţîöñ, ŵĥàţéṽéŕ ļàñĝüàĝé
SourceLocale ñàḿéš. À ƃîļîñĝüàļ ŕéàđéŕ (ẊĻÎƑƑ 1.2 àñđ 2, ÞÖ, Ǫţ ŢŠ, ŢḾẊ,
ẋçšţŕîñĝš, ÇŠṼ, ĶƂƑ) àļšö ƒîļéš éàçĥ ţŕàñšļàţîöñ îţ ŕéàđš üñđéŕ ţĥàţ
ţŕàñšļàţîöñ'š ķéý àñđ ḿàŕķš îţ ŵîţĥ Block.MarkNative, šö NativeEditions()
ļîšţš ţĥé éđîţîöñš ţĥé ƒîļé ĥöļđš, ţĥé đöçüḿéñţ'š öŵñ ƒîŕšţ.
À ŵŕîţéŕ ŵŕîţéš ţĥé đöçüḿéñţ'š öŵñ éđîţîöñ, àñđ ţĥé ţŕàñšļàţîöñ ƒîļéđ üñđéŕ ţĥé
ļöçàļé îţš SetLocale ñàḿéš, ŵĥîçĥ îţ ŕéàđš ţĥŕöüĝĥ TargetRuns öŕ
TargetEdition. Ŕéàđéŕš àñđ ŵŕîţéŕš ŕéàçĥ éđîţîöñš öñļý ţĥŕöüĝĥ ţĥé àççéššöŕš
îñ core/model (SetSourceRuns, SetTargetRuns, SetTargetEdition,
SourceRuns, TargetRuns), àñđ ñö ƒöŕḿàţ þàçķàĝé îñđéẋéš Block.Editions
đîŕéçţļý. Ţĥé ƒîļé ĥöḿé (core/change/filehome,
É-09) çĥööšéš ŵĥîçĥ éđîţîöñ à þàšš ŵŕîţéš ƃý
šéţţîñĝ ţĥé ŵŕîţéŕ'š ļöçàļé: éḿþţý ƒöŕ ţĥé đöçüḿéñţ'š öŵñ éđîţîöñ, ţĥé
éđîţîöñ'š ļàñĝüàĝé ƒöŕ à ţŕàñšļàţîöñ îñ à ƃîļîñĝüàļ ƒîļé.
ĶƂƑ, ţĥé çöñţéñţ ƃüñđļé, çàŕŕîéš ţĥé éđîţîöñš ţĥéḿšéļṽéš. Šçĥéḿà 2.0
(kbf.SchemaVersion) ĝîṽéš éàçĥ ƃļöçķ àñ editions ḿàþ ķéýéđ ƃý ţĥé éđîţîöñ
ķéý'š ţéẋţ ƒöŕḿ (fr, fr;tone=formal, en;channel=short), ŵîţĥ ţĥé
đöçüḿéñţ'š öŵñ éđîţîöñ üñđéŕ ţĥé éḿþţý ķéý, àñđ éàçĥ éđîţîöñ ĥöļđš îţš runs,
status, origin, score àñđ derived (ţĥé éđîţîöñ îţ ŵàš ḿàđé ƒŕöḿ àñđ ţĥàţ
éđîţîöñ'š ŕéṽîšîöñ). À ţŕàñšļàţîöñ à ŕéàđéŕ ƒîļéđ üñđéŕ ñö ļàñĝüàĝé ŕîđéš
ƃéšîđé ţĥé ḿàþ àš unlabelled. Ţĥé Ĝö ŕéàđéŕ (core/kbf) àñđ ţĥé ŢýþéŠçŕîþţ
ŕéàđéŕ (@neokapi/kapi-format) àļšö ŕéàđ šçĥéḿà 1.0, ŵĥöšé source ŕüñš àñđ
targets ḿàþ đéçöđé îñţö ţĥé šàḿé éđîţîöñš, àñđ ƃöţĥ ŵŕîţéŕš ŵŕîţé 2.0. Ţĥé
çöñţéñţ ƃüñđļé ŕéƒéŕéñçé îš ţĥé
ñöŕḿàţîṽé šçĥéḿà.
Đéçîđîñĝ ţŕàñšļàţàƃîļîţý
Ŵĥîçĥ ţéẋţ ƃéļöñĝš ţö ţĥé ţŕàñšļàţöŕ îš đéçîđéđ öñçé þéŕ ƒàḿîļý ŕàţĥéŕ ţĥàñ þéŕ
ŕéàđéŕ. Ţĥé ḿàŕķüþ ŕéàđéŕš (markdown, mdx) çļàššîƒý éļéḿéñţš ŵîţĥ ţĥé Ŵ3Ç
ĤŢḾĻ5 ţŕàñšļàţàƃîļîţý ţàƃļé îñ core/translatability, ĝéñéŕàţéđ ƒŕöḿ ţĥé šàḿé
šöüŕçé ţĥé Ŕéàçţ î18ñ ţŕàñšƒöŕḿ üšéš, šö àñ éļéḿéñţ ñöƃöđý ĥàš çļàššîƒîéđ îš à
çöñţàîñéŕ ŵĥöšé đîŕéçţ ţéẋţ îš þŕöḿöţéđ ŕàţĥéŕ ţĥàñ đŕöþþéđ: þŕöšé îñšîđé àñ
üñƒàḿîļîàŕ çöḿþöñéñţ îš ţŕàñšļàţéđ àñđ ŕéþöŕţéđ, ñéṽéŕ ļöšţ îñ šîļéñçé. ẊḾĻ
ŕéàđéŕš àþþļý ÎŢŠ 2.0 ŕüļéš àñđ ļöçàļ àţţŕîƃüţéš ţĥŕöüĝĥ core/its. Ţéẋţ à
ŕéàđéŕ çļàššîƒîéš àš çöđé (à çöđé šþàñ, <kbd>, <samp>) šţàýš à ŕüñ ḿàŕķéđ
NoTranslate (Ƒ-02), ŵĥîçĥ éṽéŕý
ţŕàñšļàţîöñ þàţĥ ļéàṽéš üñţöüçĥéđ, àñđ à šþàñ ţĥé ḿöđéļ çàññöţ ţàķé îš šķîþþéđ
àñđ ŕéþöŕţéđ ŕàţĥéŕ ţĥàñ çöšţîñĝ ţĥé þàĝé îţš ţŕàñšļàţîöñ.
Šüƃƒîļţéŕš àñđ ñéšţéđ ļàýéŕš
Ƒöŕḿàţ ŕéàđéŕš çàñ éḿîţ çĥîļđ Ļàýéŕš ŵĥéñ ţĥéý éñçöüñţéŕ éḿƃéđđéđ çöñţéñţ îñ à
đéŕéñţ ƒöŕḿàţ (ĤŢḾĻ îñšîđé ĴŠÖÑ, Ḿàŕķđöŵñ îñšîđé ÇŠṼ). Ţĥé çĥîļđ ŕéàđéŕ îš
ŕéšöļṽéđ ṽîà à SubfilterResolver îñĵéçţéđ ƃý ţĥé FormatRegistry. Ţĥé
ḿéçĥàñîšḿ îš đéƒîñéđ îñ Ƒ-02; ƒöŕḿàţ
ŕéàđéŕš îḿþļéḿéñţ SubfilterAware àñđ đéçļàŕé þàţţéŕñš îñ ţĥéîŕ çöñƒîĝ.
Îḿþļéḿéñţîñĝ à ñéŵ ƒöŕḿàţ
- Çŕéàţé
core/formats/<name>/ŵîţĥreader.go,writer.go, àñđconfig.go. - Îḿþļéḿéñţ
DataFormatReaderƃý éḿƃéđđîñĝBaseFormatReaderàñđ þŕöṽîđîñĝ ţĥé ƒöŕḿàţ-šþéçîƒîç þàŕšé ļöĝîç. - Îḿþļéḿéñţ
DataFormatWriterƃý éḿƃéđđîñĝBaseFormatWriteràñđ þŕöṽîđîñĝ ţĥé ƒöŕḿàţ-šþéçîƒîç šéŕîàļîžé ļöĝîç. - Þöþüļàţé éṽéŕý ƒîéļđ öñ éàçĥ îñļîñé-çöđé ŕüñ ƒöŕ àñý îñļîñé ḿàŕķüþ:
ID,Type/SubType,Data,Disp,Equiv,Constraints(Ƒ-02). - Éḿîţ àñđ çöñšüḿé ţĥé šķéļéţöñ šţöŕé (
SkeletonStoreEmitter/SkeletonStoreConsumer), àššîĝñ îđš ţĥŕöüĝĥmodel.IDBuilder, àñđ đéçļàŕé ţĥé šţŕéàḿîñĝ ḿàŕķéŕš îƒ ţĥé ŕéàđéŕ àñđ ŵŕîţéŕ çàñ ƃöţĥ ĥöñöüŕ ţĥéḿ. - Ŕéĝîšţéŕ ţĥé ŕéàđéŕ àñđ ŵŕîţéŕ ƒàçţöŕîéš îñ
formats.RegisterAll(core/formats/register.go). - ΃ ţĥé ƒöŕḿàţ çàñ ĥöšţ éḿƃéđđéđ çöñţéñţ, îḿþļéḿéñţ
SubfilterAwareàñđ àççéþţSubfilters []SubfilterMappingîñ ţĥé çöñƒîĝ. - ΃ ţĥé ŵŕîţéŕ çàñ ŵŕîţé à çĥàñĝéđ àţţŕîƃüţé öŕ à ñéŵ îñļîñé çöđé, îḿþļéḿéñţ
AttrWriteröŕCodeSynthesizeràñđ àđđ ţĥé çéļļš ţĥàţ þŕöṽé éàçĥ đéçļàŕàţîöñ ţö ţĥé öþéŕàţîöñš ḿàţŕîẋ. - ΃ à ƃļöçķ'š šĥéļļ îš šḿàļļ éñöüĝĥ ţö ŵŕîţé öñ îţš öŵñ, àš à çàţàļöĝ'š ķéý
àñđ ṽàļüé àŕé, îḿþļéḿéñţ
StructureEditoràñđ àđđ ţĥé ƒöŕḿàţ'š çéļļš ţö ţĥé šţŕüçţüŕàļ öþéŕàţîöñš ḿàţŕîẋ (core/formats/opsmatrix_structural_test.go), ŵĥîçĥ ƒàîļš ŵĥîļé à đéçļàŕàţîöñ ĥàš ñö þàššîñĝ çéļļ.
Šéé Îḿþļéḿéñţîñĝ Ƒöŕḿàţš ƒöŕ à ŵàļķţĥŕöüĝĥ, àñđ Šķéļéţöñ šţöŕé àñđ šţŕéàḿîñĝ ƒöŕ ţĥé šţöŕé'š đéţàîļš.
Çöñšéǫüéñçéš
- Ƒöŕḿàţ ŕéàđéŕš éḿîţ ţĥé šàḿé šţŕéàḿîñĝ Þàŕţ þŕöţöçöļ ŕéĝàŕđļéšš öƒ šöüŕçé ƒöŕḿàţ, šö ţööļš ñéṽéŕ ñééđ ƒöŕḿàţ-šþéçîƒîç çöđé.
- Ƒöŕḿàţ ŵŕîţéŕš ŕéþļàý
Run.Dataṽéŕƃàţîḿ (Ƒ-02), šö ŵŕîţé-ƃàçķ ƒîđéļîţý îš îñĥéŕîţéđ ƒŕöḿ ţĥé çöñţéñţ ḿöđéļ. - Ƃüîļţ-îñ àñđ þļüĝîñ ƒöŕḿàţš çöéẋîšţ îñ öñé ŕéĝîšţŕý; ţĥé þîþéļîñé ţŕéàţš ţĥéḿ îđéñţîçàļļý.
- Ţĥé éẋţéñšîöñ/þŕîöŕîţý/çöñţéñţ çàšçàđé ŕéšöļṽéš ḿöšţ ƒîļéš ŵîţĥöüţ üšéŕ çöñƒîĝüŕàţîöñ; àḿƃîĝüöüš çàšéš ƒàļļ ƃàçķ ţö àñ éẋþļîçîţ ƒöŕḿàţ ƒļàĝ.
- Öñé šķéļéţöñ šţöŕé çöṽéŕš ţĥé ƒüļļ šþàñ öƒ ƒîļé ƒöŕḿàţš ƒŕöḿ šţŕéàḿîñĝ ţéẋţ ţö žîþ-þàçķàĝéđ ḿàŕķüþ, àñđ ţĥé šţŕéàḿîñĝ ḿàŕķéŕš ĝîṽé ŕéçöŕđ-öŕîéñţéđ ƒöŕḿàţš ƃöüñđéđ ḿéḿöŕý ŵîţĥöüţ çĥàñĝîñĝ àñýöñé'š öüţþüţ ƃýţéš.
- Ñéŵ ƒöŕḿàţš þļüĝ îñ ƃý àđđîñĝ à đîŕéçţöŕý àñđ ŕéĝîšţéŕîñĝ îñ
RegisterAll; ñö çĥàñĝéš ţö ţĥé éñĝîñé àŕé ñééđéđ. - Ţĥé ţĥŕéé-ŵàý ŕéàđéŕ öüţþüţ þöļîçý šéŕṽéš îñĝéšţîöñ àñđ ţŕàñšļàţîöñ ƒŕöḿ öñé þàŕšé, àñđ ţĥé îñṽéŕţéđ öþţ-öüţ ḿéàñš à ƒöŕḿàţ ţĥàţ ĥàš ñöţ ţĥöüĝĥţ àƃöüţ ţĥé ǫüéšţîöñ šţîļļ šüŕƒàçéš çöñţéẋţ.
Ŕéļàţéđ
- Ƒ-02: Ţĥé çöñţéñţ ḿöđéļ: ţĥé Þàŕţš ŕéàđéŕš þŕöđüçé àñđ ŵŕîţéŕš çöñšüḿé; ţĥé Ŕüñ ḿöđéļ ţĥàţ đŕîṽéš ŵŕîţé-ƃàçķ ƒîđéļîţý; ţĥé
SemanticRoleţàẋöñöḿý - É-01: Ţĥé þŕöçéššîñĝ éñĝîñé: ĥöŵ ŕéàđéŕš àñđ ŵŕîţéŕš þļüĝ îñţö ţĥé þîþéļîñé
- É-03: Ţĥé ţööļ šýšţéḿ: ţĥé ţööļš ţĥàţ šîţ ƃéţŵééñ ŕéàđéŕ àñđ ŵŕîţéŕ
- É-04: Ƒļöŵš àñđ Î/Ö ƃîñđîñĝ: ŕéàđéŕš àñđ ŵŕîţéŕš àš ţĥé
fileƃîñđîñĝ; öţĥéŕ ƃîñđîñĝš ƒééđ ţĥé šàḿé šţŕéàḿ - É-05: Ţĥé þļüĝîñ šýšţéḿ: ĥöŵ þļüĝîñ àñđ ƃŕîđĝé ƒöŕḿàţš ŕéĝîšţéŕ
- Ḿ-04: Ḿàţĥ àñđ éǫüàţîöñš: ţĥé šüƃ-šķéļéţöñ îñšîđé àñ öþàǫüé þàýļöàđ
- À-02: Þàŕîţý: ţĥé "šàḿé šéḿàñţîç çöñƒîĝ → šàḿé ŕéšüļţš" çöñţŕàçţ àñđ ţĥé þàŕîţý-šàƒé çàŕŕîéŕš
- Îḿþļéḿéñţîñĝ Ƒöŕḿàţš: îḿþļéḿéñţàţîöñ ŵàļķţĥŕöüĝĥ
- Šķéļéţöñ šţöŕé àñđ šţŕéàḿîñĝ: ţĥé éñţŕý ƒöŕḿàţ, ţĥé ŵîŕîñĝ šéàḿ, ţĥé šţŕéàḿîñĝ þŕöţöçöļ
- çöñţéñţ-ƒîđéļîţý: ţĥé ŕéçîþé ƒöŕ šüŕƒàçîñĝ ñöñ-ţŕàñšļàţàƃļé çöñţéẋţ
- Ƒ-03: Îđéñţîţý: ĥöŵ ŕéàđéŕ-àššîĝñéđ îđš ƃéçöḿé đüŕàƃļé îđéñţîţý