lib/asciidoctor/gb/validate.rb
module Asciidoctor
module Gb
class Converter < ISO::Converter
def validate(doc)
content_validate(doc)
schema_validate(formattedstr_strip(doc.dup),
File.join(File.dirname(__FILE__), "gbstandard.rng"))
end
def content_validate(doc)
super
bilingual_terms_validate(doc.root)
issuer_validate(doc.root)
prefix_validate(doc.root)
bibdata_validate(doc.root)
@agencyclass.gbtype_validate(doc.root.at("//gbscope")&.text, doc.root.at("//gbprefix")&.text)
end
def bibdata_validate(doc)
doctype_validate(doc)
script_validate(doc)
end
def doctype_validate(xmldoc)
doctype = xmldoc&.at("//bibdata/ext/doctype")&.text
%w(standard recommendation).include? doctype or
@log.add("Document Attributes", nil, "#{doctype} is not a recognised document type")
end
def script_validate(xmldoc)
script = xmldoc&.at("//bibdata/script")&.text
%(Hans Latn).include?(script) or
@log.add("Document Attributes", nil, "#{script} is not a recognised script")
end
def prefix_validate(root)
prefix = root&.at("//gbprefix")&.text
scope = root&.at("//gbscope")&.text
case scope
when "social-group"
/^[A-Za-z]{3,6}$/.match(prefix) or
@log.add("Document Attributes", nil, "#{prefix} is improperly formatted for social standards")
when "enterprise"
/^[A-Z0-9]{3,}$/.match(prefix) or
@log.add("Document Attributes", nil, "#{prefix} is improperly formatted for enterprise standards")
when "sector"
%w(AQ BB CB CH CJ CY DA DB DL DZ EJ FZ GA GH GM GY HB HG HJ HS HY
JB JC JG JR JT JY LB LD LS LY MH MT MZ NY QB QC QJ QX SB SC SH
SJ SL SN SY TB TD TJ TY WB WH WJ WM WS WW XB YB YC YD YS YY YZ
ZY).include? prefix or
@log.add("Document Attributes", nil, "#{prefix} is not a legal sector standard prefix")
when "local"
%w(11 12 13 14 15 21 22 23 31 32 33 34 35 36 37 41 42 43 44 45 46
50 51 52 53 54 61 62 63 64 65 71 81 82 end).include? prefix or
@log.add("Document Attributes", nil, "#{prefix} is not a legal local standard prefix")
when "national"
%w(GB GBZ GJB GBn GHZB GWPB JJF JJG).include? prefix or
@log.add("Document Attributes", nil, "#{prefix} is not a legal national standard prefix")
end
end
def issuer_validate(root)
issuer = root&.at("//bibdata/contributor[role/@type = 'issuer']/"\
"organization/name")&.text
scope = root&.at("//gbscope")&.text
if %w(enterprise social).include?(scope) && issuer == "GB"
@log.add("Document Attributes", nil, "No issuer provided for #{scope} standard")
end
end
def check_bilingual(t, element)
zh = t.at(".//#{element}[@language = 'zh']")
en = t.at(".//#{element}[@language = 'en']")
(en.nil? || en.text.empty?) && !(zh.nil? || zh.text.empty?) &&
@log.add("Style", t, "GB: #{element} term #{zh.text} has no English counterpart")
!(en.nil? || en.text.empty?) && (zh.nil? || zh.text.empty?) &&
@log.add("Style", t, "GB: #{element} term #{en.text} has no Chinese counterpart")
end
def bilingual_terms_validate(root)
root.xpath("//term").each do |t|
check_bilingual(t, "preferred")
check_bilingual(t, "admitted")
check_bilingual(t, "deprecates")
end
end
def title_intro_validate(root)
title_intro_en = root.at("//title[@type='title-intro' and @language='en']")
title_intro_zh = root.at("//title[@type='title-intro' and @language='zh']")
if title_intro_en.nil? && !title_intro_zh.nil?
@log.add("Style", title_intro_zh, "No English Title Intro!")
end
if !title_intro_en.nil? && title_intro_zh.nil?
@log.add("Style", title_intro_en, "No Chinese Title Intro!")
end
end
def title_main_validate(root)
title_main_en = root.at("//title[@type='title-main' and @language='en']")
title_main_zh = root.at("//title[@type='title-main' and @language='zh']")
if title_main_en.nil? && !title_main_zh.nil?
@log.add("Style", title_main_zh, "No English Title!")
end
if !title_main_en.nil? && title_main_zh.nil?
@log.add("Style", title_main_en, "No Chinese Title!")
end
end
def title_part_validate(root)
title_part_en = root.at("//title[@type='title-part' and @language='en']")
title_part_zh = root.at("//title[@type='title-part' and @language='zh']")
if title_part_en.nil? && !title_part_zh.nil?
@log.add("Style", title_part_en, "No English Title Part!")
end
if !title_part_en.nil? && title_part_zh.nil?
@log.add("Style", title_part_zh, "No Chinese Title Part!")
end
end
def norm_bibitem_style(root)
root.xpath(NORM_BIBITEMS).each do |b|
if b.at(Asciidoctor::Standoc::Converter::ISO_PUBLISHER_XPATH).nil?
unless /^#{GBCODE}(?![A-Z])/.match(b.at("./docidentifier").text)
@log.add("Bibliography", b, "#{NORM_ISO_WARN}: #{b.text}")
end
end
end
end
end
end
end