@@ -205,7 +205,7 @@ func (m MetadataParser) parseMetaElement(element *xmlquery.Node) *MetadataItem {
205
205
id : element .SelectAttr ("id" ),
206
206
}
207
207
} else {
208
- propName := strings .TrimSpace (element . SelectAttr ( " property" ) )
208
+ propName := strings .TrimSpace (property )
209
209
if propName == "" {
210
210
return nil
211
211
}
@@ -238,7 +238,7 @@ func (m MetadataParser) parseDcElement(element *xmlquery.Node) *MetadataItem {
238
238
}
239
239
240
240
data := strings .ToLower (element .Data )
241
- propName := VocabularyDCTerms + data
241
+ propName := VocabularyDCTerms + element . Data
242
242
switch data {
243
243
case "creator" , "contributor" , "publisher" :
244
244
c := m .contributorWithLegacyAttr (element , propName , propValue )
@@ -399,13 +399,18 @@ func (m metadataAdapter) FirstValue(property string) string {
399
399
return item .value
400
400
}
401
401
402
+ func itemsValues (items []MetadataItem ) []string {
403
+ values := make ([]string , len (items ))
404
+ for i , item := range items {
405
+ values [i ] = item .value
406
+ }
407
+ return values
408
+ }
409
+
402
410
func (m metadataAdapter ) Values (property string ) []string {
403
411
var values []string
404
412
if items , ok := m .items [property ]; ok {
405
- values = make ([]string , len (items ))
406
- for i , item := range items {
407
- values [i ] = item .value
408
- }
413
+ values = itemsValues (items )
409
414
}
410
415
return values
411
416
}
@@ -636,18 +641,38 @@ func (m PubMetadataAdapter) LocalizedSortAs() *manifest.LocalizedString {
636
641
637
642
func (m PubMetadataAdapter ) Accessibility () * manifest.A11y {
638
643
a11y := manifest .NewA11y ()
639
- a11y .ConformsTo = m .a11yConformsTo ()
640
- a11y .Certification = m .a11yCertification ()
641
- a11y .Summary = m .a11ySummary ()
642
- a11y .AccessModes = m .a11yAccessModes ()
643
- a11y .AccessModesSufficient = m .a11yAccessModesSufficient ()
644
- a11y .Features = m .a11yFeatures ()
645
- a11y .Hazards = m .a11yHazards ()
646
- a11y .Exemptions = m .a11yExemptions ()
644
+ ct , refinedA11y := m .a11yConformsTo ()
645
+ a11y .ConformsTo = ct
646
+
647
+ certifierItem , _ := m .First (VocabularyA11Y + "certifiedBy" )
648
+ a11y .Certification = m .a11yCertification (certifierItem )
649
+
650
+ a11y .Summary = m .FirstValue (VocabularySchema + "accessibilitySummary" )
651
+
652
+ modeValues := m .Values (VocabularySchema + "accessMode" )
653
+ a11y .AccessModes = valuesToAccessModes (modeValues )
654
+
655
+ sufficientValues := m .Values (VocabularySchema + "accessModeSufficient" )
656
+ a11y .AccessModesSufficient = valuesToAccessModesSufficient (sufficientValues )
657
+
658
+ featureValues := m .Values (VocabularySchema + "accessibilityFeature" )
659
+ a11y .Features = valuesToA11yFeatures (featureValues )
660
+
661
+ hazardValues := m .Values (VocabularySchema + "accessibilityHazard" )
662
+ a11y .Hazards = valuesToA11yHazards (hazardValues )
663
+
664
+ exemptionValues := m .Values (VocabularyA11Y + "exemption" )
665
+ a11y .Exemptions = valuesToA11yExemptions (exemptionValues )
647
666
648
667
if a11y .IsEmpty () {
649
668
return nil
650
669
}
670
+
671
+ // ConformsTo refinements merge with the main a11y data
672
+ if ! refinedA11y .IsEmpty () {
673
+ a11y .Merge (& refinedA11y )
674
+ }
675
+
651
676
return & a11y
652
677
}
653
678
@@ -670,13 +695,32 @@ func (m PubMetadataAdapter) TDM() *manifest.TDM {
670
695
return tdm
671
696
}
672
697
673
- func (m PubMetadataAdapter ) a11yConformsTo () []manifest.A11yProfile {
698
+ func (m PubMetadataAdapter ) a11yConformsTo () ( []manifest.A11yProfile , manifest. A11y ) {
674
699
profiles := manifest.A11yProfileList {}
700
+ a11y := manifest .NewA11y ()
675
701
676
- if items , ok := m .items [VocabularyDCTerms + "conformsto " ]; ok {
702
+ if items , ok := m .items [VocabularyDCTerms + "conformsTo " ]; ok {
677
703
for _ , item := range items {
678
704
if profile := a11yProfile (item .value ); profile != "" {
679
705
profiles = append (profiles , profile )
706
+ for k , v := range item .children {
707
+ switch k {
708
+ case VocabularyA11Y + "certifiedBy" :
709
+ a11y .Certification = m .a11yCertification (v [0 ])
710
+ case VocabularySchema + "accessibilitySummary" :
711
+ a11y .Summary = v [0 ].value
712
+ case VocabularySchema + "accessMode" :
713
+ a11y .AccessModes = valuesToAccessModes (itemsValues (v ))
714
+ case VocabularySchema + "accessModeSufficient" :
715
+ a11y .AccessModesSufficient = valuesToAccessModesSufficient (itemsValues (v ))
716
+ case VocabularySchema + "accessibilityFeature" :
717
+ a11y .Features = valuesToA11yFeatures (itemsValues (v ))
718
+ case VocabularySchema + "accessibilityHazard" :
719
+ a11y .Hazards = valuesToA11yHazards (itemsValues (v ))
720
+ case VocabularyA11Y + "exemption" :
721
+ a11y .Exemptions = valuesToA11yExemptions (itemsValues (v ))
722
+ }
723
+ }
680
724
}
681
725
}
682
726
}
@@ -688,7 +732,7 @@ func (m PubMetadataAdapter) a11yConformsTo() []manifest.A11yProfile {
688
732
}
689
733
690
734
profiles .Sort ()
691
- return profiles
735
+ return profiles , a11y
692
736
}
693
737
694
738
func a11yProfile (value string ) manifest.A11yProfile {
@@ -722,13 +766,18 @@ func a11yProfile(value string) manifest.A11yProfile {
722
766
return manifest .EPUBA11y11WCAG21AA
723
767
case "EPUB Accessibility 1.1 - WCAG 2.1 Level AAA" :
724
768
return manifest .EPUBA11y11WCAG21AAA
769
+ case "EPUB Accessibility 1.1 - WCAG 2.2 Level A" :
770
+ return manifest .EPUBA11y11WCAG22A
771
+ case "EPUB Accessibility 1.1 - WCAG 2.2 Level AA" :
772
+ return manifest .EPUBA11y11WCAG22AA
773
+ case "EPUB Accessibility 1.1 - WCAG 2.2 Level AAA" :
774
+ return manifest .EPUBA11y11WCAG22AAA
725
775
default :
726
776
return ""
727
777
}
728
778
}
729
779
730
- func (m PubMetadataAdapter ) a11yCertification () * manifest.A11yCertification {
731
- certifierItem , _ := m .First (VocabularyA11Y + "certifiedBy" )
780
+ func (m PubMetadataAdapter ) a11yCertification (certifierItem MetadataItem ) * manifest.A11yCertification {
732
781
c := manifest.A11yCertification {
733
782
CertifiedBy : certifierItem .value ,
734
783
}
@@ -756,21 +805,15 @@ func (m PubMetadataAdapter) a11yCertification() *manifest.A11yCertification {
756
805
return & c
757
806
}
758
807
759
- func (m PubMetadataAdapter ) a11ySummary () string {
760
- return m .FirstValue (VocabularySchema + "accessibilitySummary" )
761
- }
762
-
763
- func (m PubMetadataAdapter ) a11yAccessModes () []manifest.A11yAccessMode {
764
- values := m .Values (VocabularySchema + "accessMode" )
808
+ func valuesToAccessModes (values []string ) []manifest.A11yAccessMode {
765
809
am := make ([]manifest.A11yAccessMode , len (values ))
766
810
for i , v := range values {
767
811
am [i ] = manifest .A11yAccessMode (v )
768
812
}
769
813
return am
770
814
}
771
815
772
- func (m PubMetadataAdapter ) a11yAccessModesSufficient () [][]manifest.A11yPrimaryAccessMode {
773
- values := m .Values (VocabularySchema + "accessModeSufficient" )
816
+ func valuesToAccessModesSufficient (values []string ) [][]manifest.A11yPrimaryAccessMode {
774
817
ams := make ([][]manifest.A11yPrimaryAccessMode , 0 , len (values ))
775
818
for _ , v := range values {
776
819
c := a11yAccessModesSufficient (v )
@@ -793,26 +836,23 @@ func a11yAccessModesSufficient(value string) []manifest.A11yPrimaryAccessMode {
793
836
return ams
794
837
}
795
838
796
- func (m PubMetadataAdapter ) a11yFeatures () []manifest.A11yFeature {
797
- values := m .Values (VocabularySchema + "accessibilityFeature" )
839
+ func valuesToA11yFeatures (values []string ) []manifest.A11yFeature {
798
840
features := make ([]manifest.A11yFeature , len (values ))
799
841
for i , v := range values {
800
842
features [i ] = manifest .A11yFeature (v )
801
843
}
802
844
return features
803
845
}
804
846
805
- func (m PubMetadataAdapter ) a11yHazards () []manifest.A11yHazard {
806
- values := m .Values (VocabularySchema + "accessibilityHazard" )
847
+ func valuesToA11yHazards (values []string ) []manifest.A11yHazard {
807
848
hazards := make ([]manifest.A11yHazard , len (values ))
808
849
for i , v := range values {
809
850
hazards [i ] = manifest .A11yHazard (v )
810
851
}
811
852
return hazards
812
853
}
813
854
814
- func (m PubMetadataAdapter ) a11yExemptions () []manifest.A11yExemption {
815
- values := m .Values (VocabularyA11Y + "exemption" )
855
+ func valuesToA11yExemptions (values []string ) []manifest.A11yExemption {
816
856
exemptions := make ([]manifest.A11yExemption , len (values ))
817
857
for i , v := range values {
818
858
exemptions [i ] = manifest .A11yExemption (v )
0 commit comments