<Realm>
  "Shared Worldview"@en
  "Cosmovisión compartida"@es
  comment "Shared archivistic data and definitions"@en
  comment "Definiciones y datos archivísticos compartidos"@es

  abbreviation swv
  thisOntology "http://purl.org/NET/durito/ontologies/2005/09/shared-worldview#"
  dependsRealm sys

  <RepositoryArea>
    "Shared Archival Things Area"@en
    "Área para cosas archivísticas compartidas"@es
    sharedArchivalThings
  </RepositoryArea>
</Realm>

<DefinitionSet general>
    <Vocabulary>
        <Property swv:hasName>
            "Nombre"@es
            range xsd:string
      	    adjPhraseRule es "cuyo nombre contiene <searchTerm/>" tailSearchTerm            
        </Property>

        <Property swv:hasUniqueIdentifier>
            "Código de referencia"@es
            adjPhraseRule es "cuyo código de referencia es o contiene <searchTerm/>" tailSearchTerm
        </Property>

        <Property swv:hasTitle>
            "Título"@es
            adjPhraseRule es "con el título <refTerm/>" tailReferringTerm
            adjPhraseRule es "cuyo título contiene <searchTerm/>" tailSearchTerm
            adjPhraseRule es "cuyo título" chaining M S
            searchWeight 9
            hardcoded

            # range is hardcoded as swv:Title
            # order of instantiating stuff impedes us from setting range here rather than in Java
        </Property>

        <Property swv:hasLongTitle>
            "Titulo largo"@es
            adjPhraseRule es "cuyo título largo contiene <searchTerm/>" tailSearchTerm
            searchWeight 9            
        </Property>

        <AbstractDataType swv:Title>
            "Título"@es
            hardcoded
        </AbstractDataType>

        <FundamentalDataType swv:BasicTitle>
            "Título en cadena"@es 
            subDataTypeOf swv:Title
            subDataTypeOf xsd:string
            hardcoded
        </FundamentalDataType>

        <FundamentalDataType swv:Prose>
            "Prosa"@es 
            subDataTypeOf xsd:string
            hardcoded
            unOrderable
        </FundamentalDataType>

        <Property swv:hasDescription>
            "Descripción"@es
            adjPhraseRule es "cuya descripción contiene <searchTerm/>" tailSearchTerm
            range swv:Prose
            hardcoded
            searchWeight 8
        </Property>

        <Property swv:hasNotes>
            "Notas"@es
            range sys:LFMarkup
        </Property>

        <Property swv:hasAbbreviation>
            "Abreviación"@es
            range xsd:string
        </Property>
        
        <Property swv:hasCallNumber>
            "Código de referencia"@es
            subPropertyOf swv:hasUniqueIdentifier
            range swv:CallNumber
            # adjPhraseRule es "cuyo código de referencia es <refTerm/>" tailReferringTerm
            
            # this is wrong; problems with getting a refTerm on a value. It works in our archive, though
            adjPhraseRule es "cuyo código de referencia es o contiene <searchTerm/>" tailSearchTerm
        </Property>
    
        <AbstractDataType swv:CallNumber>
            "Código de referencia"@es 
            subDataTypeOf xsd:string
            comparisonVector String correct_order default
        </AbstractDataType>          
    </Vocabulary>

    <RuleSet thing>
        <Structure>
            <Descriptor has_name>
                property swv:hasName
                multilingual
            </Descriptor>
       </Structure>  
       
        <BPVFunctions>
     		<TextBPVFunction text_ref>
         		defaultTextBPVFunction
         		slot has_name captureSearchHits
         		multilingual
         			|{ 
						(@root->has_name).text_bpv
			        }|
	    	</TextBPVFunction>
	    </BPVFunctions>
       
        <Descriptions>
            VariableDesc default
            ShortDesc default
            FullDesc default
        </Descriptions>
    </RuleSet>
</DefinitionSet>

<DefinitionSet basic_stuff>
    <Vocabulary>
        <Class swv:Place>
            "Lugar"@es
            unGroupable
        </Class>   
    </Vocabulary>
</DefinitionSet>

<DefinitionSet archival_stuff>
    <Vocabulary>
        <Class swv:ArchivalGroupLevel>
            "Nivel de agrupación archivística"@es
            unGroupable
        </Class>
        
        <Property swv:hasArchivalGroupLevel>
            "Nivel de agrupación archivística"@es
            domain sys:SiteOrgCollection
            range  swv:ArchivalGroupLevel
            adjPhraseRule es "de nivel <refTerm/>" tailReferringTerm
            adjPhraseRule es "de un nivel" chaining M S			 
			hardcoded
        </Property>
       
        <Class swv:DocumentationWorkGroup>
            "Grupo de trabajo de documentación"@es
            unGroupable
        </Class>
        
        <Property swv:hasDocumentationWorkGroup>
            "Grupo de trabajo de documentación"@es
            range  swv:DocumentationWorkGroup
            adjPhraseRule es "catalogad<hgen/><hpl/> por <refTerm/>" tailReferringTerm
            adjPhraseRule es "catalogad<hgen/><hpl/> por un grupo de trabajo" chaining M S
        </Property>
       
        <Class swv:DocumentationUpdateNote>
            "Nota de actualización de la documentación"@es
            unGroupable
        </Class>
        
        <Property swv:hasDocumentationUpdateNote>
            "Nota de actualización de la documentación"@es
            range  swv:DocumentationUpdateNote
            
            # breaking adjphrase rule contract
            adjPhraseRule es "cuya documentación fue actualizada" chaining F S			 
        </Property>

        <Property swv:hasCataloguer>
            "Documentalista"@es
            range  swv:Person
            # breaking adjphrase rule contract
            adjPhraseRule es "por <refTerm/>" tailReferringTerm
            adjPhraseRule es "por una persona" chaining F S
        </Property>
                      
        <Property swv:hasUpdateDate>
            "Fecha de la actualización"@es
            range  swv:TimeRangeOverUnit
            # breaking adjphrase rule contract
            adjPhraseRule es "el <refTerm/>" tailReferringTerm
            # adjPhraseRule es "en una fecha" chaining F S			 
        </Property>
        
        <Class swv:DocumentationStandard>
            "Norma de documentación"@es
            unGroupable
        </Class>
        
        <Property swv:hasDocumentationStandard>
            "Norma de documentación"@es
            range swv:DocumentationStandard
            adjPhraseRule es "documentada con base en <refTerm/>" tailReferringTerm
            adjPhraseRule es "documentada con base en una norma" chaining F S			 
        </Property>

        <Property swv:hasSize>
            "Volumen"@es
            range swv:Prose
            adjPhraseRule es "que incluye<hvpl/> <searchTerm/> en la descripción de su volumen" tailSearchTerm
        </Property>

        <Property swv:hasInstitutionalBiography>
            "Historia institucional / biográfica"@es
            range swv:Prose
            adjPhraseRule es "que incluye<hvpl/> <searchTerm/> en su historia institucional / biográfica" tailSearchTerm
        </Property>

        <Property swv:hasHistoryInOriginalArchive>
            "Historia en el archivo de procedencia"@es
            range swv:Prose
			adjPhraseRule es "que incluye<hvpl/> <searchTerm/> en su historia en el archivo de procedencia" tailSearchTerm
        </Property>

        <Property swv:hasIngressDetailsInOriginalArchive>
            "Forma de ingreso al archivo de procedencia"@es
            range swv:Prose
            adjPhraseRule es "que incluye<hvpl/> <searchTerm/> en la descripción de su forma de ingreso al archivo de procedencia" tailSearchTerm                     
        </Property>

        <Property swv:hasBreadthAndContent>
            "Alcance y contenido"@es
            range swv:Prose
            adjPhraseRule es "que incluye<hvpl/> <searchTerm/> en la descripción de su alcance y contenido" tailSearchTerm
        </Property>

        <Property swv:hasEvaluationAndSelectionInOriginalArchive>
            "Valoración y selección en el archivo de procedencia"@es
            range swv:Prose
			adjPhraseRule es "que incluye<hvpl/> <searchTerm/> en la descripción de la valoración y selección de materiales en el archivo de procedencia" tailSearchTerm
        </Property>

        <Property swv:hasIngressOfNewMaterialsInOriginalArchive>
            "Nuevos ingresos al archivo de procedencia"@es
            range swv:Prose
			adjPhraseRule es "que incluye<hvpl/> <searchTerm/> en la descripción de los nuevos ingresos al archivo de procedencia" tailSearchTerm
        </Property>

        <Property swv:hasOrganizationInOriginalArchive>
            "Organización en el archivo de procedencia"@es
            range swv:Prose
            adjPhraseRule es "que incluye<hvpl/> <searchTerm/> en la descripción de su organización en el archivo de procedencia" tailSearchTerm
        </Property>

        <Property swv:hasAccessTerms>
            "Condiciones de acceso"@es
            range swv:Prose
            adjPhraseRule es "que incluye<hvpl/> <searchTerm/> en la descripción de las condiciones de acceso" tailSearchTerm
        </Property>

        <Property swv:hasReproductionTerms>
            "Condiciones de reproducción"@es
            range swv:Prose
            adjPhraseRule es "que incluye<hvpl/> <searchTerm/> en las condiciones de reproducción" tailSearchTerm
        </Property>

        <Property swv:hasPhysicalCharacteristics>
            "Características físicas"@es
            range swv:Prose
            adjPhraseRule es "que incluye<hvpl/> <searchTerm/> en la descripción de sus características físicas" tailSearchTerm
        </Property>

        <Property swv:hasConservationState>
            "Estado de conservación"@es
            range swv:Prose
            adjPhraseRule es "que incluye<hvpl/> <searchTerm/> en la descripción de su estado de conservación" tailSearchTerm
        </Property>
    </Vocabulary>

    <RuleSet documentation_update_note>
        <Structure>
            <Descriptor has_cataloguer>
                property swv:hasCataloguer
            </Descriptor>

            <Descriptor has_update_date>
                property swv:hasUpdateDate
            </Descriptor>
       </Structure> 
       
        <BPVFunctions>
            <TextBPVFunction text_ref>
      	        slot has_cataloguer
      	        slot has_update_date
                defaultTextBPVFunction
                |{ 
                	ref = ""
                
						cataloguers = @root->has_cataloguer
						0.upto(cataloguers.size - 1) do |i|
							if (i == 0)
								ref << cataloguers[i].full_name_fl
							else
								ref << ", #{cataloguers[i].full_name_fl}"
							end
						end                
					ref << " / " + (@root->has_update_date).text_bpv
                }|
            </TextBPVFunction>
        </BPVFunctions>
       
	</RuleSet>
    
    <RepositorySetup>
        <SOC archival_group_level>
            "Niveles de agrupación archivística"@es
            hasGroupDomain swv:ArchivalGroupLevel
            bindToRuleSet thing
            secondaryLevel
        </SOC>
        
        <SOC documentation_standards>
            "Normas documentales"@es
            hasGroupDomain swv:DocumentationStandard
            bindToRuleSet thing
            secondaryLevel
        </SOC>  
    </RepositorySetup>
</DefinitionSet>

<DefinitionSet physical_things>
    <Vocabulary>
        <Class swv:Material>
            "Material"@es
        </Class>      

        <Property swv:hasMaterial>
            "Materiales"@es
            domain swv:PhysicalObject
            range  swv:Material
            adjPhraseRule es "de <refTerm/>" tailReferringTerm
            adjPhraseRule es "de un material" chaining M S			 
        </Property>
        
        <Class swv:PhysicalThing>
            "Cosa física"@es
        </Class>
    
        <Class swv:PhysicalObject>
            "Objeto Físico"@es
            subClassOf swv:PhysicalThing
        </Class>

        <Property swv:hasInscriptionLink>
            "Inscripción"@es
            subPropertyOf swv:hasManifestationLink
            range swv:ManifestationLink
        </Property>
        
        <Property swv:hasSealLink>
            "Sello"@es
            subPropertyOf swv:hasManifestationLink
            range swv:ManifestationLink
        </Property>                

		#La siguiente propiedad se usa para fotografías
		#soportes primarios
        <Property swv:hasMainManifestationLink>
            "Link to the main manifetation"@en
            subPropertyOf swv:hasManifestationLink
            range swv:ManifestationLink 
        </Property>
    </Vocabulary>
    
    <RuleSet physical_things>
        <Structure> 
            <Descriptor has_manifestation_link>
              property swv:hasManifestationLink
              outRequirement fromPropRange
            </Descriptor>  
        </Structure>    
    </RuleSet>
    
    <RuleSet physical_objects>
        <Structure>            
             <Descriptor has_material>
                  property swv:hasMaterial
             </Descriptor>

             <Descriptor has_dimensions>
               property swv:hasDimensions
               outRequirement fromPropRange
             </Descriptor>             
        </Structure>  
    </RuleSet>
</DefinitionSet>

<DefinitionSet spatial_measurement>
    <Vocabulary>
        <AbstractDataType swv:SpatialMeasurement>
            "Medición Espacial"@es
            comment "Las instancias de esta clase son mediciones en el espacio físico"@es
        </AbstractDataType>
        
        <ComplexDataType swv:DimensionsDescription>
            "Descripción de las dimensiones"@es
            comment "Las instancias de esta clase son descripciones de dimensiones"@es
            subDataTypeOf swv:SpatialMeasurement
            bindToRuleSet dimensions_description
            unOrderable
        </ComplexDataType>

        <FundamentalDataType swv:UnidimensionalMeasurement>
            "Medida unidimensional"@es
            subDataTypeOf xsd:float
            bindToRuleSet unidimensional_measurement
        </FundamentalDataType>

        <Property swv:hasDimensions>
            "Dimensiones"@es
            domain swv:PhysicalThing 
            range swv:DimensionsDescription
             
            # the following is a terrible hack, born of our erroneous different treatment of paths before and within
            # complex values
            # Here we should be menotymizing... or merging krrrs to make a single adj phrase rule
            adjPhraseRule es "" chaining M S
        </Property>  

        <Property swv:hasHeight>
            "Altura"@es
            comment "Señala la altura"@es
            domain  swv:DimensionsDescription
    		range xsd:float
    		adjPhraseRule es "de <searchTerm/> cm de alto" tailSearchTerm
        </Property>
        
        <Property swv:hasWidth>
            "Ancho"@es
            comment "Señala el ancho"@es
            domain swv:DimensionsDescription
            range xsd:float
            
            # this is also a hack...
            adjPhraseRule es "de <searchTerm/> cm de ancho" tailSearchTerm
        </Property>
       
        <Property swv:hasLength>
            "Largo"@es
            comment "Señala el largo"@es
            domain swv:DimensionsDescription
            range xsd:float
        </Property>

        <Class swv:MeasurementUnit>
            "Unidad de medición"@es
             comment "Las instancias de esta clase son unidades de medición"@es
        </Class>

        <Property swv:hasMeasurementUnit>
            "Unidad de medición"@es
            comment "Señala la unidad de medición"@es
            domain swv:SpatialMeasurement
            range swv:MeasurementUnit
        </Property>
    </Vocabulary>

    <RuleSet dimensions_description>
        <Structure>
            <Descriptor has_height>
                property swv:hasHeight
            </Descriptor>

            <Descriptor has_width>
                property swv:hasWidth
            </Descriptor>

            <Descriptor has_measurement_unit>
                property swv:hasMeasurementUnit
            </Descriptor>   
        </Structure>
       
        <BPVFunctions>
            <TextBPVFunction text_ref>
      	        slot has_width
      	        slot has_height
                defaultTextBPVFunction
                |{ 
                    # here we are forgoing the available method .val on literals, to invoke fetched TextBPV dependency registration
                    # and thus make search highlighting work...
                    x = (@root->has_width).just_number
                    y = (@root->has_height).just_number
                    abbrev = (@root->has_measurement_unit->measurement_unit.has_abbreviation).text_bpv
                    "#{x} x #{y} #{abbrev}"
                }|
            </TextBPVFunction>
        </BPVFunctions>
    </RuleSet>  

    <RuleSet unidimensional_measurement>
        <BPVFunctions>
            <TextBPVFunction text_ref>
                # this is an example of convoluted code that a new proposal should help us avoid
                defaultTextBPVFunction
                |{
                   in_desc = @lit->dimensions_description.has_width[inv]
                   in_desc = @lit->dimensions_description.has_height[inv] if (in_desc.size == 0)
                   mes_unit = in_desc->dimensions_description.has_measurement_unit->measurement_unit.has_abbreviation
                   "#{@lit.val} #{mes_unit.val}"
                }|
            </TextBPVFunction>
        
            <TextBPVFunction just_number>
                resultsSearchable
                |{
                    "#{@lit.val}"
                }|
            </TextBPVFunction>
        </BPVFunctions>
    </RuleSet>

    <RuleSet measurement_unit>
        <Structure> 
             <Descriptor has_name>
                useDefinition thing.has_name
             </Descriptor>
             <Descriptor has_abbreviation>
                property swv:hasAbbreviation
                multilingual
             </Descriptor>
        </Structure>              
    </RuleSet>

    <RepositorySetup>
        <SOC measurement_units>
            "Unidades de medida mencionadas para las cosas físicas"@es
            hasGroupDomain swv:MeasurementUnit
            bindToRuleSet measurement_unit
            secondaryLevel
        </SOC>
    </RepositorySetup>
</DefinitionSet>

<DefinitionSet time>
    <Vocabulary>
        <Property swv:spans>
            "Período"@es
            range swv:CalendarPointer
			
			# yet another terrible hack            
            adjPhraseRule es "<searchTerm/>" tailSearchTerm
        </Property>

        <Property swv:starts>
            "Inicio"@es
            range swv:CalendarPointer
            
             # the following is a terrible hack, born of our erroneous different treatment of paths before and within
             # complex values
             # Here we should be menotymizing... or merging krrrs to make a single adj phrase rule
             adjPhraseRule es "" chaining M S
        </Property>

        <Property swv:ends>
            "Fin"@es
            range swv:CalendarPointer
             # the following is a terrible hack, born of our erroneous different treatment of paths before and within
             # complex values
             # Here we should be menotymizing... or merging krrrs to make a single adj phrase rule
             adjPhraseRule es "" chaining M S
        </Property>

        <AbstractDataType swv:TimeData>
            "Datos de tiempo"@es
            comment "Cualquier dato acerca del tiempo"@es
        </AbstractDataType>

        <AbstractDataType swv:TimeRange>
            "Rango de tiempo"@es
            comment "Cualquier período en el tiempo"@es
            subDataTypeOf swv:TimeData
            comparisonVector Integer start_point default
        </AbstractDataType>

        <ComplexDataType swv:TimeRangeWSE>
            "Rango de tiempo con puntos inicial y final definidos"@es
            comment "Un rango de tiempo con los puntos inicial y final definidos"@es
            subDataTypeOf swv:TimeRange
            bindToRuleSet time_range_wse
        </ComplexDataType>

        <ComplexDataType swv:TimeRangeOverUnit>
            "Rango de tiempo por unidad"@es
            comment "Un rango de tiempo definido por el inicio y fin de una unidad determinada del calendario"@es
            subDataTypeOf swv:TimeRange
            # comparisonVector String time_unit default
            bindToRuleSet time_range_over_unit
        </ComplexDataType>

        <ComplexDataType swv:FullDate>
            "Fecha completa"@es
            subDataTypeOf swv:CalendarPointer
            bindToRuleSet full_date
        </ComplexDataType>

        <AbstractDataType swv:CalendarPointer>
            "Indicador sobre el calendario"@es
            subDataTypeOf swv:TimeData
            #comparisonVector Integer point default
        </AbstractDataType>

        <FundamentalDataType swv:YearInCommonEra>
            "Año en la era común"@es
            subDataTypeOf swv:CalendarPointer
            bindToRuleSet year_in_common_era
        </FundamentalDataType>

        <FundamentalDataType swv:DayOfMonth>
            "Día"@es
            bindToRuleSet day_of_month
        </FundamentalDataType>

      <Class swv:Month>           
        "Mes"@es
       </Class> 

       <Class swv:LevelOfTimePrecision>           
        "Nivel de precisión en el tiempo"@es
       </Class> 

        <Property swv:hasRelatedEventTime>
            "Momento de un evento relacionado"@es
            comment "Esta propiedad funciona principalmente como superpropiedad, cuyas descendientes se definen de manera más precisa"@es
            range swv:TimeRange
        </Property>

        <Property swv:hasLevelOfTimePrecision>
          "Nivel de precisión en el tiempo"@es
          domain swv:TimeData
          range swv:LevelOfTimePrecision        
        </Property>

        <Property swv:hasYear>
          "Año"@es
          domain swv:FullDate
          range swv:YearInCommonEra
          # the following is a terrible hack, born of our erroneous different treatment of paths before and within
          # complex values
          # Here we should be menotymizing... or merging krrrs to make a single adj phrase rule
          adjPhraseRule es "<searchTerm/>" tailSearchTerm
        </Property>

        <Property swv:hasMonth>
          "Mes"@es
          domain swv:FullDate
          range swv:Month
        </Property>
        
        <Property swv:hasDayOfMonth>
          "Día"@es
          domain swv:FullDate
          range swv:DayOfMonth
        </Property>        
    </Vocabulary>

    <RuleSet time_range_wse>
        <Structure>
            <Descriptor starts>
                property swv:starts
            </Descriptor>

            <Descriptor ends>
                property swv:ends
            </Descriptor>

            <Descriptor has_level_of_time_precision>
                property swv:hasLevelOfTimePrecision
            </Descriptor>    
        </Structure>

        <CompVectorFunctions>
            <CompVectorFunction start_point>
                # rudimentary and functional in current implementation
                |{ 
                  ((@root->starts).text_bpv).to_i
                }|
            </CompVectorFunction>
        </CompVectorFunctions>

        <BPVFunctions>
            <TextBPVFunction text_ref>
            	slot starts
            	slot ends
                defaultTextBPVFunction
                |{ (@root->starts).text_bpv + " - " + (@root->ends).text_bpv }|
            </TextBPVFunction>
        </BPVFunctions>
    </RuleSet>

    <RuleSet time_range_over_unit>
        <Structure>
            <Descriptor spans>
                property swv:spans
            </Descriptor>
            
            <Descriptor has_level_of_time_precision>
                property swv:hasLevelOfTimePrecision
            </Descriptor>    
        </Structure>

       <KRRelationRules> 
         <KRRelationRule time_precision_abbrev>
           has_level_of_time_precision->level_of_time_precision.has_abbrev 
         </KRRelationRule>           
       </KRRelationRules>

        <CompVectorFunctions>
            <CompVectorFunction start_point>
                # rudimentary and functional in current implementation
                |{
                  ((@root->spans).text_bpv).to_i
                }|
            </CompVectorFunction>
        </CompVectorFunctions>

        <BPVFunctions>
          <TextBPVFunction text_time_precision>
            defaultTextBPVFunction
            slot time_precision_abbrev
            slot spans captureSearchHits
            |{  
               abbrev = @root->time_precision_abbrev
               s = @root->spans
               if (abbrev.size > 0)
                  "#{abbrev.text_bpv} #{s.text_bpv}"
               else
                  "#{s.text_bpv}"   
               end
              
            }|  
          </TextBPVFunction>  
        </BPVFunctions>
    </RuleSet>

    <RuleSet year_in_common_era>
        <BPVFunctions>
            <TextBPVFunction text_ref>
            	defaultTextBPVFunction
                |{ 
                   @lit.val
                }|
            </TextBPVFunction>
        </BPVFunctions>
    
    
        #<CompVectorFunctions>
        #    <CompVectorFunction point>
        #        |{ Time.utc(LIT.textBPV).to_i }|
        #    </CompVectorFunction>
        #</CompVectorFunctions>
    </RuleSet>
    
    <RuleSet level_of_time_precision>
      <Structure>
       <Descriptor has_name>
         useDefinition thing.has_name
       </Descriptor>
   
       <Descriptor has_abbrev>
        property swv:hasAbbreviation
       </Descriptor>  
      </Structure>
    </RuleSet>
    
    <RuleSet day_of_month>    
        <BPVFunctions>
            <TextBPVFunction dummy>
                |{ "nada" }|
            </TextBPVFunction>
        </BPVFunctions>
    </RuleSet>

    <RuleSet full_date>
        <Structure>
            <Descriptor has_year>
                property swv:hasYear
            </Descriptor>

            <Descriptor has_month>
                property swv:hasMonth
            </Descriptor>

            <Descriptor has_day_of_month>
                property swv:hasDayOfMonth
            </Descriptor>                        
        </Structure>
    
        <BPVFunctions>
          <TextBPVFunction text_ref>
            slot has_year
            slot has_month
            slot has_day_of_month
            defaultTextBPVFunction
            |{  
				year = (@root->has_year).text_bpv
				month = (@root->has_month).text_bpv
				day = (@root->has_day_of_month).text_bpv
				"#{day} de #{month} de #{year}"
            }|  
          </TextBPVFunction>  
        </BPVFunctions>
    </RuleSet>
        
    <RepositorySetup>
        <SOC levels_of_time_precision>
            "Niveles de precisión en el tiempo"@es
            hasGroupDomain swv:LevelOfTimePrecision
            bindToRuleSet level_of_time_precision
            secondaryLevel
        </SOC>
        
        <SOC months>
            "Meses"@es
            hasGroupDomain swv:Month
            bindToRuleSet thing
            secondaryLevel
        </SOC>        
    </RepositorySetup>
</DefinitionSet>

<DefinitionSet describing_people>
    <Vocabulary>
        <Class swv:Person>
            "Persona"@es
        </Class>

        <Property swv:hasGivenNames>
            "Nombres"@es
            subPropertyOf swv:hasName
            range xsd:string
        </Property>

        <Property swv:hasLastNames>
            "Apellidos"@es
            subPropertyOf swv:hasName
            range xsd:string
        </Property>
    </Vocabulary>

    <RuleSet person>
        <Structure>
            <Descriptor has_given_names>
                property swv:hasGivenNames
            </Descriptor>
            <Descriptor has_last_names>
                property swv:hasLastNames
            </Descriptor>
        </Structure>

        <BPVFunctions>
            <TextBPVFunction full_name_fl>
                orderUsing has_last_names
                slot has_last_names captureSearchHits
                slot has_given_names captureSearchHits
                |{ (@root->has_given_names).text_bpv + " " + (@root->has_last_names).text_bpv }|
            </TextBPVFunction>
            
            <TextBPVFunction full_name_lf>
                defaultTextBPVFunction
                slot has_last_names captureSearchHits
                slot has_given_names captureSearchHits
                |{ (@root->has_last_names).text_bpv + ", " + (@root->has_given_names).text_bpv }|
            </TextBPVFunction>
        </BPVFunctions>

        <Descriptions>
            defaultOrderBy has_last_names
            VariableDesc default
            ShortDesc default
            FullDesc default
        </Descriptions>
    </RuleSet>

    <RepositorySetup>
        <SOC people>
            "Personas mencionadas en las colecciones de estos archivos"@es
            hasGroupDomain swv:Person
            bindToRuleSet person
            secondaryLevel
        </SOC>
    </RepositorySetup>
</DefinitionSet>

<DefinitionSet describing_institutions>
    <Vocabulary>
        <Class swv:Institution>
            "Institución"@es
        </Class>

		# This is used for unavailable images
        <Property swv:curatedBy>
        	"Entidad de resguardo"@es
        	range swv:Institution
        	adjPhraseRule es "resguardad<hgen/><hpl/> por <refTerm/>" tailReferringTerm
            adjPhraseRule es "resguardad<hgen/><hpl/> por una entidad" chaining F S           
        </Property>

        <Class swv:OriginalReference>
            "Referencia de procedencia"@es
            unGroupable
        </Class>

        <Property swv:hasOriginalReference>
        	"Referencia de procedencia"@es
        	range swv:OriginalReference
        	
        	# breaking contract here
            adjPhraseRule es "" chaining F S
        </Property>

        <Property swv:hasOriginalInstitution>
        	"Institución de procedencia"@es
        	range swv:Institution
        	adjPhraseRule es "procedente<hpl/> de <refTerm/>" tailReferringTerm
            adjPhraseRule es "procedente<hpl/> de una institución" chaining F S
        </Property>

		<Property swv:hasRefernceInOriginalInstitution>
        	"Referencia en la institución de procedencia"@es
        	range swv:Prose
            adjPhraseRule es "cuya referencia de procedencia contiene <searchTerm/>" tailSearchTerm         
        </Property>

        <Property swv:hasOriginOfInformation>
        	"Origen de la información"@es
        	range swv:Publication
            adjPhraseRule es "documentad<hgen/><hpl/> con base en información obtenida de <refTerm/>" tailReferringTerm
            adjPhraseRule es "documentad<hgen/><hpl/> con base en información obtenida de una publicación" chaining F S
        </Property>
        
        <Property swv:hasParentInstitution>
        	"Institución de pertenecia"@es
        	range swv:Institution
        	adjPhraseRule es "que pertenece<hvpl/> a <refTerm/>" tailReferringTerm
            adjPhraseRule es "que pertenece<hvpl/> a una institución" chaining F S           
        </Property>

        <Property swv:hasIndirectParentInstitution>
        	"Institución de pertenecia indirecta"@es
        	range swv:Institution
        	adjPhraseRule es "que pertenece<hvpl/> a <refTerm/>" tailReferringTerm
            adjPhraseRule es "que pertenece<hvpl/> a una institución" chaining F S           
        </Property>

        <Property swv:hasAcronym>
        	"Siglas"@es
        	range xsd:string
            adjPhraseRule es "cuyas siglas contienen <searchTerm/>" tailSearchTerm
            adjPhraseRule es "cuyas siglas son <refTerm/>" tailReferringTerm
        </Property>
        
        <Property swv:hasInstitutionLocation>
            "Ubicación de la institution"@es
            subPropertyOf swv:hasRelatedLocation
            range swv:Place
            adjPhraseRule es "ubicad<hgen/><hpl/> en <refTerm/>" tailReferringTerm
            adjPhraseRule es "ubicad<hgen/><hpl/> en un lugar" chaining M S
        </Property>
    </Vocabulary>

   <RuleSet institution>
        <Structure>
            <Descriptor has_name>
                useDefinition thing.has_name
            </Descriptor>

            <Descriptor has_parent_institution>
                property swv:hasParentInstitution
            </Descriptor>

            <Descriptor has_indirect_parent_institution>
                property swv:hasIndirectParentInstitution
            </Descriptor>

	        <Descriptor has_institution_location>
                property swv:hasInstitutionLocation
            </Descriptor>

            <Descriptor has_acronym>
                property swv:hasAcronym
            </Descriptor>
        </Structure>

        <BPVFunctions>
            <TextBPVFunction long_name>
                defaultTextBPVFunction
                slot has_name
                slot has_parent_institution
                slot has_institution_location
                |{ 
                   name = @root->has_name
                   parent = @root->has_parent_institution
                   loc = @root->has_institution_location 
                   if (parent.size > 0)
                   	 "#{parent.text_bpv}, #{name.text_bpv}"
                   elsif (loc.size > 0)
                     "#{loc.text_bpv}, #{name.text_bpv}"
                   else
                      name.text_bpv
                   end
                }|
            </TextBPVFunction>
        </BPVFunctions>

        <Descriptions>
            defaultOrderBy has_name
            VariableDesc default
            ShortDesc default
            FullDesc default
        </Descriptions>
    </RuleSet>

   <RuleSet original_reference>
        <Structure>
            <Descriptor has_original_institution>
                property swv:hasOriginalInstitution
            </Descriptor>

            <Descriptor has_reference_in_original_institution>
                property swv:hasRefernceInOriginalInstitution
            </Descriptor>
        </Structure>

        <BPVFunctions>        
	 		<TextBPVFunction text_ref>
                defaultTextBPVFunction	 			
	     		slot has_original_institution captureSearchHits
	     		slot has_reference_in_original_institution
	 			|{ 
					ent = @root->has_original_institution
					ref = @root->has_reference_in_original_institution
					if (ref.size > 0)
					  "#{ent.text_bpv}, #{ref.text_bpv}"
					else
					  ent.text_bpv
				    end
		        }|
	    	</TextBPVFunction>
        </BPVFunctions>	    	
	    	
    </RuleSet>
    
	<RepositorySetup>
        <SOC institutions>
            "Instituciones mencionadas en las colecciones de estos archivos"@es
            hasGroupDomain swv:Institution
            bindToRuleSet institution
            secondaryLevel
        </SOC>
    </RepositorySetup>
</DefinitionSet>

<DefinitionSet authorship>
    <Vocabulary>
        <Class swv:Author>
            "Autor"@es   
            subClassOf swv:Person    
        </Class>
      
        <Property swv:hasAuthor>
            "Autor"@es
            range swv:Person
            adjPhraseRule es "escrit<hgen/><hpl/> por <refTerm/>" tailReferringTerm
            adjPhraseRule es "escrit<hgen/><hpl/> por una persona" chaining F S
        </Property>                      
    </Vocabulary>
</DefinitionSet>

<DefinitionSet place>
    <Vocabulary>
        <Class swv:City>
            "Ciudad"@es
            subClassOf swv:Place
        </Class>

        <Class swv:Country>
            "País"@es
            subClassOf swv:Place
        </Class>

        <Class swv:State>
          "Estado"@es 
          subClassOf swv:Place  
        </Class>              
          
        <Class swv:Delegation>
          "Delegación"@es
           subClassOf swv:Place
        </Class>
        
        <Class swv:Municipality>
          "Municipio"@es
           subClassOf swv:Place
        </Class>
        
        <Class swv:Neighborhood>
          "Colonia"@es
          subClassOf swv:Place
          unGroupable
        </Class>     

        <Class swv:RuralLocality>
          "Colonia"@es
          subClassOf swv:Place
          unGroupable
        </Class>  

        <Class swv:Locality>
          "Localidad"@es
          subClassOf swv:Place
          unGroupable
        </Class>     

        <Class swv:Street>
           "Calle"@es
           subClassOf swv:Place
           unGroupable
        </Class>

        <Class swv:Square>
           "Plaza"@es
           subClassOf swv:Place
           unGroupable
        </Class>

        <Class swv:StreetLocation>
           "Ubicación de calle"@es
           subClassOf swv:Place
           unGroupable
        </Class>

          # Note: the range of the following properties is weird because of current limitations
          # in our mechanism for generating search results, as well as selection of stuff for grouping
          <Property swv:inCountry>
            "País"@es
            range swv:Place
            range swv:Country
            compactInSearch
          </Property>
          
          <Property swv:inStateOrProvince>
            "Estado"@es
            range swv:Place
            range swv:State
            compactInSearch
          </Property>
 
          <Property swv:inCity>
            "Ciudad"@es
            range swv:Place
            range swv:City
            compactInSearch
          </Property>
          
          <Property swv:inDelegation>
            "Delegación"@es
            range swv:Place
            range swv:Delegation
            compactInSearch
          </Property>

          <Property swv:inMunicipality>
            "Municipio"@es
            range swv:Place
            range swv:Municipality
            compactInSearch
          </Property>
          
          <Property swv:inNeighborhood>
            "Colonia"@es
            range swv:Place
            range swv:Neighborhood
            compactInSearch
          </Property>

          <Property swv:inRuralLocality>
            "Localidad"@es
            range swv:Place
            range swv:RuralLocality
            compactInSearch
          </Property>
          
          <Property swv:hasStreetOrSquare>
            "Calle o plaza"@es
            range swv:Place
            range swv:Street
            range swv:Square
            compactInSearch
          </Property>
          
          <Property swv:atStreetLocation>
            "Calle y número"@es
            range swv:Place
            range swv:StreetLocation
            compactInSearch
          </Property>
        
        <Property swv:hasRelatedLocation>
            "Ubicación relacionada"@es
            comment "Esta propiedad funciona principalmente como superpropiedad, cuyas descendientes se definen de manera más precisa"@es
            range swv:Place
        </Property>
    </Vocabulary>

    <RuleSet place>
        <Structure>
            <Descriptor has_name>
                useDefinition thing.has_name
            </Descriptor>

            <Descriptor has_street_location>
               property swv:atStreetLocation
            </Descriptor>

            <Descriptor has_street_or_square>
               property swv:hasStreetOrSquare
            </Descriptor>
           
            <Descriptor in_neighborhood>
               property swv:inNeighborhood
            </Descriptor>
                        
            <Descriptor in_rural_locality>
               property swv:inRuralLocality
            </Descriptor>
            
            <Descriptor in_delegation>
               property swv:inDelegation
            </Descriptor>

            <Descriptor in_municipality>
               property swv:inMunicipality
            </Descriptor>

            <Descriptor in_state_or_province>
              property swv:inStateOrProvince
            </Descriptor>
            
            <Descriptor in_country>
              property swv:inCountry
            </Descriptor>    
        </Structure>

        <BPVFunctions>
            # the following is all very, very hackish, but teaches us useful lessons
            <TextBPVFunction long_name>
            	slot has_name captureSearchHits
            	slot has_street_location
            	slot in_rural_locality            	
            	slot in_neighborhood
            	slot in_delegation
            	slot in_municipality
            	slot in_state_or_province
            	slot in_country
            	
            	# this slot isn't actually used in the function, but we need it
            	# it can't get here by slot inheritance because our slots can't do slots from functions on the same RS
            	# slot has_street_or_square
            	
            	# missing slot for this.short_name2
                defaultTextBPVFunction
                |{
                    parts = [ 
                    		  @root->in_rural_locality,
                              @root->in_neighborhood,
                              @root->in_delegation,
                              @root->in_municipality,
                              @root->in_state_or_province,
                              @root->in_country
                            ]
                    parts.map! { |part| (part.size > 0) ? part.short_name2 : nil }
                    parts.compact!
                    parts.unshift(@root.short_name2) if ((@root->has_street_location).size > 0)
                    parts.join(", ")                     
                }|
            </TextBPVFunction>
               
            <TextBPVFunction short_name1>
            	slot has_name
            	slot has_street_location
            	slot has_street_or_square
                |{
                    name = @root->has_name
                    street_location = @root->has_street_location
                    if (street_location.size > 0)
                        street_or_square = @root->has_street_or_square
                        if (street_or_square[0] == street_location[0])
                           name.text_bpv
                        else
                          "#{street_or_square.short_name1} #{name.text_bpv}"
                        end
                    else
                        name.text_bpv
                    end
                }|
            </TextBPVFunction>
            
            <TextBPVFunction short_name2>
            	slot in_neighborhood
            	# missing slot for short_name1
                |{
                    neighborhood = @root->in_neighborhood
                    if ( (neighborhood.size > 0) &&
                         (neighborhood[0] == @root))
                      "Col. #{@root.short_name1}"
                    else
                      @root.short_name1
                    end 
                }|
            </TextBPVFunction>
        </BPVFunctions>

        <Descriptions>
            VariableDesc default
            ShortDesc default
            FullDesc default
        </Descriptions>
    </RuleSet>

    <RepositorySetup>
        <SOC places>
            "Lugares"@es
            hasGroupDomain swv:Place
            bindToRuleSet place
            secondaryLevel
        </SOC>
    </RepositorySetup>
</DefinitionSet>

<DefinitionSet content_and_manifestations>
    <Vocabulary>
        <Class swv:ContentLink>
            "Content Link"@en
            "Vínculo de contenido"@es
            comment "Describes how content is inscribed in a manifestation"@en
            comment "Describe cómo los contenidos se plasman en una manifestación"@es
        </Class>
 
        <Class swv:Content>
            "Content"@en
            "Contenido"@es
        </Class>

        <Class swv:Manifestation>
            "Manifestation"@en
            "Manifestación"@es
        </Class>

        <Class swv:ManifestationLink>
            "ManifestationLink"@en
            "Vínculo a manifestación"@es
            unGroupable
        </Class>
        
        <Class swv:LocationOnObject>
            "Location On Object"@en
            "Ubicación sobre el objeto"@es
        </Class>
    
 
        <Property swv:hasLocationOnObject>
            "Location On Object"@en
            "Ubicación sobre el objeto"@es
            domain swv:ManifestationLink
            range swv:LocationOnObject
            comment "Indica la ubicación de una manifestación sobre el objeto físico"@es
        </Property>    

        
        <Property swv:hasLinkedManifestation>
            "Linked Manifestation"@en
            "Manifestación vinculada"@es
            domain swv:ManifestationLink
            range swv:Manifestation
            # esto no debe ser necesario pero lo es
            range swv:Inscription
            range swv:SealManifestation
        </Property>  
        
        <Property swv:hasManifestationLink>
            "Manifestation Link"@en
            "Vínculo a una manifestación"@es
            domain swv:PhysicalObject
            range swv:ManifestationLink
        </Property>
                                    
        <Property swv:hasLinkedContent>
            "Inscribes Content"@en
            "Plasma el contenido"@es
            # inverse "Content of"@en
            # inverse "Contenido de"@es
            range swv:Content
            
            # this shouldn't be necessary, but it is
            range swv:Seal
            range swv:Text
        </Property>

        <Property swv:hasContentLink>
            "Content Link"@en
            "Vínculo de contenido"@es
            range swv:ContentLink
        </Property>

        <Property swv:hasMainContentLink>
            "Main Content Link"@en
            "Vínculo de contenido principal"@es
            subPropertyOf swv:hasContentLink
            range swv:ContentLink
        </Property>

        <Property swv:hasMainContentTranscription>
            "Transcripción de contenido principal"@es
            subPropertyOf swv:hasContentLink
            range xsd:string
            adjPhraseRule es "que contiene <searchTerm/>" tailSearchTerm
        </Property>

        <Property swv:hasMainContent>
            "Contenido principal"@es
            subPropertyOf swv:hasContentLink
            range swv:Content
        </Property>

        <Property swv:reproducedFrom>
            "Reproduced from"@en
            "Reproducido de"@es
            domain swv:ManifestationLink
            range swv:Manifestation
        </Property>
        
        #<Property swv:hasManifestation>
        # "Manifestation"@en
        # "Manifestación"@es
        #Ojo: Puede ser que esto no se utilice
        #En la verisón anterior no especificábamos el dominio
        #domain swv:ManifestationLink
        #range swv:Manifestation
        #</Property>
       
       #Parece que esto tampoco se usa 
        #<Property swv:hasMainManifestation>
         # "Main Manifestation"@en
         # "Manifestación principal"@es
         # subPropertyOf swv:hasManifestation
        #</Property>
          
    </Vocabulary>

   <RuleSet manifestation_link>
     <Structure>
       <Descriptor has_linked_manifestation>
               property swv:hasLinkedManifestation
        </Descriptor>
        
         <Descriptor has_location_on_object>
               property swv:hasLocationOnObject
        </Descriptor>
      </Structure>
      
        <BPVFunctions>
            <TextBPVFunction full_name_lf>
                defaultTextBPVFunction
                slot has_linked_manifestation
                |{ (@root->has_linked_manifestation).text_bpv }|
            </TextBPVFunction>
        </BPVFunctions>      
   </RuleSet>

    <RuleSet content_link>
        <Structure>
            <Descriptor has_linked_content>
                property swv:hasLinkedContent
                minCardinality 1
                maxCardinality 1
                outRequirement fromPropRange
            </Descriptor>
            <Descriptor reproduced_from>
                property swv:reproducedFrom
                minCardinality 0
                maxCardinality 1
                outRequirement fromPropRange
            </Descriptor>
        </Structure>

        #<KRRelationRules>
        #    <KRRelationRule has_linked_manifestation>
        #        manifestation.has_content_link[inv]
        #        <StructRules>
        #            minCardinality 1
        #            maxCardinality 1
        #        </StructRules>
        #    </KRRelationRule>
        #</KRRelationRules>

        <BPVFunctions>
            <TextBPVFunction text_ref>
                defaultTextBPVFunction
                slot has_linked_content
                |{
					(@root->has_linked_content).text_bpv
                }|
            </TextBPVFunction>
        </BPVFunctions>

        <Descriptions>
            VariableDesc default
            ShortDesc default
            FullDesc default
        </Descriptions>
    </RuleSet>


    <RuleSet manifestation>
        <Structure>
            <Descriptor has_content_link>
                property swv:hasContentLink
                minCardinality 0
                outRequirement fromPropRange
                multipleOrdered
            </Descriptor>
            <Descriptor has_main_content_link>
                property swv:hasMainContentLink
                minCardinality 1
                maxCardinality 1
                outRequirement fromPropRange
            </Descriptor>
        </Structure>

#        <KRRelationRules>
#            <KRRelationRule has_location_on_object>
#                manifestation_link.has_linked_manifestation[inv]->manifestation_link.has_location_on_object
#            </KRRelationRule>
#            
#            <KRRelationRule has_main_content>
#              has_main_content_link->content_link.has_linked_content
#            </KRRelationRule>
#        </KRRelationRules>
    </RuleSet>


    <RuleSet inscription>
       <Structure>
            <Descriptor has_main_content_transcription>
                property swv:hasMainContentTranscription
            </Descriptor>
        </Structure>
    
        <KRRelationRules>
            <KRRelationRule has_location_on_object>
                manifestation_link.has_linked_manifestation[inv]->manifestation_link.has_location_on_object
            </KRRelationRule>
        </KRRelationRules>
            
        <BPVFunctions>
          <TextBPVFunction ref>
            slot has_main_content_transcription
            slot has_location_on_object
            defaultTextBPVFunction
            |{
              main_content = @root->has_main_content_transcription
              location_on_obj = @root->has_location_on_object
              "\"#{main_content.text_bpv}\" <span class='note'>(#{location_on_obj.text_bpv.downcase})</span>"
            }|
          </TextBPVFunction>
        </BPVFunctions>
    </RuleSet>


#    <RuleSet content>
#        <KRRelationRules>
#            <KRRelationRule has_system_accessible_digital_copy>
#                content_link.has_linked_content[inv]->content_link.has_linked_manifestation
#                <Conditions>
#                    |{ (@out.classes).includes(sys:ComputerFile) }|
#                    |{ (@out->sys.files.has_system_accessible_uri).size > 0 }|
#                </Conditions>
#            </KRRelationRule>
#        </KRRelationRules>
#    </RuleSet>

	<RepositorySetup>
         <SOC locations_on_object>
               "Ubicaciones sobre el objeto"@es
               hasGroupDomain swv:LocationOnObject
               bindToRuleSet thing
               secondaryLevel
         </SOC>   
	</RepositorySetup>
</DefinitionSet>

<DefinitionSet text>
  <Vocabulary>
      <Class swv:Text>
         "Text"@en
         "Texto"@es
         subClassOf swv:Content
      </Class>
      
      <Class swv:Inscription>
         "Inscription"@en
         "Inscripción"@es
         subClassOf swv:Manifestation
         unGroupable
      </Class>
      
      <Class swv:HandWrittenNote>
        "Handwritten Note"@en
        "Anotación manuscrita"@es
        subClassOf swv:Inscription
      </Class>      
            
      <Property swv:hasStringRepresentation>
           "String Representation"@en
           "Representación como cadena de caracteres"@es
           domain swv:Text
           range xsd:string
		   adjPhraseRule es "que contiene <searchTerm/>" tailSearchTerm
       </Property>      
                                                                       
  </Vocabulary>

  <RuleSet text>
      <Structure>
          <Descriptor has_string_representation>
                property swv:hasStringRepresentation
                multilingual
            </Descriptor>
       </Structure>  
        <Descriptions>
            VariableDesc default
            ShortDesc default
            FullDesc default
        </Descriptions>
        
        <BPVFunctions>
     		<TextBPVFunction text_ref>
     			slot has_string_representation captureSearchHits
         		defaultTextBPVFunction
         			|{ 
         			   (@root->has_string_representation).text_bpv
         			}|
        	</TextBPVFunction>
		</BPVFunctions>        	
        
  </RuleSet> 
</DefinitionSet>

<DefinitionSet publication>
	<Vocabulary>
		<Class swv:Publication>
        	"Publication"@en
        	subClassOf swv:Content
        	unGroupable
		</Class>          
	
	   	<Class swv:ContentComponentLink>
	    	"Vínculo a un componente de contenido"@es
	    	unGroupable
	   	</Class>		

		<Class swv:Publisher>
			"Editorial"@es
	    </Class>

       <FundamentalDataType swv:LocationInPublication>
			"Ubicación en la publicación"@es
			subDataTypeOf xsd:string	
			bindToRuleSet sys.xsd_string
		</FundamentalDataType>

        <Property swv:hasResearchAuthor>
            "Investigador"@es
             adjPhraseRule es "que presenta una investigación realizada por <refTerm/>" tailReferringTerm
             adjPhraseRule es "que presenta una investigación realizada por una persona" chaining F S
            subPropertyOf swv:hasAuthor
            range swv:Person
        </Property>

        <Property swv:hasPresentationAuthor>
            "Investigador"@es
             adjPhraseRule es "con una presentación realizada por <refTerm/>" tailReferringTerm
             adjPhraseRule es "con una presentación realizada por una persona" chaining F S
            subPropertyOf swv:hasAuthor
            range swv:Person
        </Property>
                
		<Property swv:hasContentComponentLink>
			"Componente de contenido"@es
			range swv:ContentComponentLink
		</Property>	

		# this property is a temporary hack, since
		# ranges and soc domains don't take into account
		# class hierarchies (though they should have)
		<Property swv:hasLinkedPublication>
			"Publicación vinculada"@es
			range swv:Publication
			adjPhraseRule es "en <refTerm/>" tailReferringTerm
			adjPhraseRule es "en una obra" chaining F S
		</Property>	

		<Property swv:hasLinkedContentComponent>
			"Componente de contenido"@es
			range swv:Content
    	</Property>			
	
    	<Property swv:hasPublicationDate>
           "Fecha de publicación"@es
           subPropertyOf swv:hasRelatedEventTime
           # this may be a range or a calendar pointer; think of the different meaning of the publication date for a newspaper or a book
           range swv:TimeData

	       # this shouldn't be necessary, but for now it is
	       range swv:TimeRangeOverUnit
	       range swv:TimeRangeWSE
	       range swv:FullDate

           # messing with chaining consistency here, but we know it'll work
           # rules for tail are irrelevant
           adjPhraseRule es "editad<hgen/><hpl/> en" chaining M S             
      	</Property>      
	        
      	<Property swv:hasPeriodicalNumberIndication>
			"Número del periódico o revista"@es
            range swv:Prose
            # adjPhraseRule es "en <refTerm/>" tailReferringTerm
            adjPhraseRule es "en un número que contiene <searchTerm/>" tailSearchTerm
      	</Property>

      	<Property swv:hasLocationInPublication>
			"Ubicación en la publicación"@es
			domain swv:ContentComponentLink
            range swv:LocationInPublication
            # adjPhraseRule es "en <refTerm/>" tailReferringTerm
            adjPhraseRule es "en una obra, en una ubicación que contiene <searchTerm/>" tailSearchTerm
      	</Property>

		<Property swv:hasPublisher>
			"Editorial"@es
			domain swv:Publication
			range swv:Publisher
            adjPhraseRule es "editad<hgen/><hpl/> por <refTerm/>" tailReferringTerm
            adjPhraseRule es "editad<hgen/><hpl/> por una casa editorial" chaining F S			
		</Property>

		<Property swv:hasPlaceOfPublication>
			"Lugar de publicación"@es
			domain swv:Publication
			range swv:Place
            adjPhraseRule es "editad<hgen/><hpl/> en <refTerm/>" tailReferringTerm
            adjPhraseRule es "editad<hgen/><hpl/> en un lugar" chaining F S			
		</Property>	
	</Vocabulary>
 
    <RuleSet publication>
        <Structure>        
            <Descriptor has_author>
                property swv:hasAuthor
            </Descriptor>            

            <Descriptor has_research_author>
                property swv:hasResearchAuthor
            </Descriptor>        
            
            <Descriptor has_presentation_author>
                property swv:hasPresentationAuthor
            </Descriptor>        
            
            <Descriptor has_title>
                property swv:hasTitle
            </Descriptor>
 
            <Descriptor has_publication_date>
            	property swv:hasPublicationDate
            </Descriptor>
            
            <Descriptor has_periodical_number_indication>
            	property swv:hasPeriodicalNumberIndication
            </Descriptor>
            
            <Descriptor has_publisher>
            	property swv:hasPublisher
            </Descriptor>
            
            <Descriptor has_place_of_publication>
            	property swv:hasPlaceOfPublication
            </Descriptor>	
        </Structure> 

        <BPVFunctions>
     		<TextBPVFunction text_ref>
     			slot has_title captureSearchHits
     			slot has_author
     			slot has_research_author
     			slot has_presentation_author
     			slot has_place_of_publication
     			slot has_publisher
     			slot has_publication_date
     			slot has_periodical_number_indication
         		defaultTextBPVFunction
         			|{ 
						ref = ""
						
						# authors
						authors = @root->has_author
						0.upto(authors.size - 1) do |i|
							if (i == 0)
								ref << authors[i].full_name_lf
							else
								if (i < authors.size - 1)
									ref << ", #{authors[i].full_name_fl}"
								else
									ref << " y #{authors[i].full_name_fl}"
								end
							end
							ref << ". " if (i == authors.size - 1)
						end
						
						# the following is a hack for a single object with a "research author"
						research_authors = @root->has_research_author
						if (research_authors.size == 1)
							ref << "#{research_authors.full_name_lf} (investigación). "
						end
						
						# the following is a hack for a single object with a "presentation author"
						presentation_authors = @root->has_presentation_author
						if (presentation_authors.size == 1)
							ref << "#{presentation_authors.full_name_lf} (presentación). "
						end
						
						# title
						title = @root->has_title
						ref << "<span class='em'>#{title.text_bpv}</span>, "
						
						# number
						number = @root->has_periodical_number_indication
						ref << "#{number.text_bpv}, " if (number.size > 0)
						
						# place of pub
						place = @root->has_place_of_publication
						ref << "#{place.short_name1}, " if (place.size > 0)
						
						# publishers
						publishers = @root->has_publisher
						if (publishers.size > 0)
							publishers_array = Array.new
							publishers.each { |publisher| publishers_array << publisher.text_bpv }
							ref << "#{publishers_array.join('/')}, "
						end
						
						# date
						date = @root->has_publication_date
						ref << "#{date.text_bpv}" if (date.size > 0)
						
						ref
			        }|
	    	</TextBPVFunction>
	    </BPVFunctions>
        
    </RuleSet>        
  
  	<RuleSet content_component_link>
  		<Structure>
  			<Descriptor has_location_in_publication>
  				property swv:hasLocationInPublication
  			</Descriptor>
  			
  			<Descriptor has_linked_content_component>
  				property swv:hasLinkedContentComponent
  			</Descriptor>
  			
  			<Descriptor has_linked_publication>
  				property swv:hasLinkedPublication
  			</Descriptor>  			
  		</Structure>
  		
        <BPVFunctions>
     		<TextBPVFunction pub_and_loc>
     		    slot has_linked_publication
     		    slot has_location_in_publication
         		defaultTextBPVFunction
         			|{ 
						for_pub = @root->has_linked_publication
						for_pub_text = for_pub.size > 0 ? for_pub.text_bpv : ""
						loc = @root->has_location_in_publication
						loc_text = loc.size > 0 ? ", #{loc.text_bpv}" : ""
						"#{for_pub_text}#{loc_text}."

			        }|
	    	</TextBPVFunction>
	    </BPVFunctions>  		
  	</RuleSet>
 
	<RepositorySetup> 
 		<SOC publishers>
 			"Editoriales"@es
 			hasGroupDomain swv:Publisher
 			bindToRuleSet thing
 			secondaryLevel
 		</SOC>
	</RepositorySetup> 
 
 
</DefinitionSet>
  
<DefinitionSet symbol>
  <Vocabulary>
    <Class swv:Seal>
      "Sello"@es
       subClassOf swv:Content
       comment "Las instancias de esta clase son sellos"@es
    </Class>
    
    <Class swv:SealManifestation>
      "Manifestación de un sello"@es
      subClassOf swv:Manifestation
    </Class>  
    
  </Vocabulary>
    <RuleSet seal_manifestation>
       <Structure>
            <Descriptor has_main_content>
                property swv:hasLinkedContent
            </Descriptor>
            
            <Descriptor has_description>
              property swv:hasDescription
            </Descriptor>
        </Structure>
    
        <KRRelationRules>
            <KRRelationRule has_location_on_object>
                manifestation_link.has_linked_manifestation[inv]->manifestation_link.has_location_on_object
            </KRRelationRule>
        </KRRelationRules>
            
        <BPVFunctions>
          <TextBPVFunction ref>
            slot has_description
            slot has_main_content
            slot has_location_on_object
            defaultTextBPVFunction
            |{
              d = @root->has_description  
              main_content = @root->has_main_content
              location_on_obj = @root->has_location_on_object
              "#{d.text_bpv} / #{main_content.text_bpv} <span class='note'>(#{location_on_obj.text_bpv.downcase})</span>"
            }|
          </TextBPVFunction>
        </BPVFunctions>
    </RuleSet>

<RuleSet seal>
      <Structure>
          <Descriptor has_string_representation>
            useDefinition text.has_string_representation
          </Descriptor>
          
          <Descriptor has_description>
              property swv:hasDescription
          </Descriptor>
       </Structure>  
                      
        <BPVFunctions>
          <TextBPVFunction ref>
            slot has_description
            slot has_string_representation
            defaultTextBPVFunction
            |{
              # note: no provisions made for having both a string rep and a description
              d = @root->has_description
              if (d.size > 0)
                "#{d.text_bpv}"
              else
                str_rep = @root->has_string_representation
                "\"#{str_rep.text_bpv}\""
              end
            }|
          </TextBPVFunction>
        </BPVFunctions>
                  
</RuleSet>
</DefinitionSet>    

 <DefinitionSet image>
  <Vocabulary>
    <Class swv:Image>
      "Imágen"@es
      subClassOf swv:Content
    </Class>   
  </Vocabulary>
 </DefinitionSet>
       
<DefinitionSet photograph>
    <Vocabulary>
        <Class swv:Photograph>   
            "Fotografía"@es
            subClassOf swv:PhysicalObject
            comment "Esta clase comprende a la fotografía con sus soportes como un solo objeto físico"@es
            gender es F
            unGroupable
        </Class>
        
        <Class swv:RoleInPhotographicProcess>
        	# fix class name
            "Rol en el preceso fotográfico"@es
        </Class>

        <Class swv:ToneAndColor>
            "Tono y color"@es
        </Class>
         
        <Class swv:ImageSupport>
          "Soporte para imágen"@es
          subClassOf swv:PhysicalObject
          comment "Clase genérica para los soporte de las imágenes"@es
        </Class>
            
        <Class swv:PhotographSupport>
          "Soporte Fotográfico"@es 
          subClassOf swv:ImageSupport   
        </Class> 
           
        <Class swv:ImageSupportMaterial>
             "Material del soporte de la imágen"@es
             subClassOf swv:Material
        </Class>             

        <Class swv:Format>
              "Formato según el tamaño de la impresión fotográfica"@es
        </Class>                  

        <Property swv:hasPrimarySupport>
              "Soporte principal"@es
              range swv:PhotographSupport
              adjPhraseRule es "con soporte primario" chaining M S
        </Property>

        <Property swv:hasSecondarySupport>
              "Soporte secundario"@es
              range swv:PhotographSupport
              adjPhraseRule es "con soporte secundario" chaining M S
        </Property>
    
        <Property swv:hasPhotographerLink>
            "Fotógrafo"@es
            adjPhraseRule es " " tailReferringTerm # review
            adjPhraseRule es " " chaining F S
			searchWeight 8
            range swv:PhotographerLink
        </Property>

        <Property swv:hasPhotographer>
            "Fotógrafo"@es
            adjPhraseRule es "tomad<hgen/><hpl/> por <refTerm/>" tailReferringTerm
            adjPhraseRule es "tomad<hgen/><hpl/> por una persona" chaining F S
			searchWeight 8
            range swv:Person
        </Property>
    
        <Property swv:hasCertaintyLevel>
            "Nivel de certeza"@es
            range swv:CertaintyLevel
        </Property>

        <Class swv:PhotographerLink>
            "Vínculo hacia fotógrafo"@es
        </Class>

        <Class swv:CertaintyLevel>
            "Nivel de certeza"@es
        </Class>

        <Property swv:hasEditor>
            "Editor"@es
            adjPhraseRule es "editad<hgen/><hpl/> por <refTerm/>" tailReferringTerm
            adjPhraseRule es "editad<hgen/><hpl/> por una entidad" chaining F S
            subPropertyOf swv:hasAuthor            
            range swv:Institution
            searchWeight 8
        </Property>

        <Property swv:hasInitialPhotoLocation>
            "Ubicación de la fotografía original"@es
            subPropertyOf swv:hasRelatedLocation
            range swv:Place
            adjPhraseRule es "tomad<hgen/><hpl/> en <refTerm/>" tailReferringTerm
            adjPhraseRule es "tomad<hgen/><hpl/> en un lugar" chaining M S
            searchWeight 7
        </Property>

        <Property swv:takenFrom>
            "Fotografía tomada desde"@es
            # adjPhraseRule es "tomad<hgen/><hpl/> desde <refTerm/>" tailReferringTerm
            adjPhraseRule es "tomad<hgen/><hpl/> desde un lugar cuya descripción contiene <searchTerm/>" tailSearchTerm
            range swv:Prose
            searchWeight 3
        </Property>

        <Property swv:takenFacing>
            "Fotografía tomada hacia"@es
            # adjPhraseRule es "tomad<hgen/><hpl/> hacia <refTerm/>" tailReferringTerm
            adjPhraseRule es "tomad<hgen/><hpl/> hacia un lugar cuya descripción contiene <searchTerm/>" tailSearchTerm
            range swv:Prose
            searchWeight 3
        </Property>

        <Property swv:hasInitialPhotoDate>
            "Fecha de la fotografía original"@es
            subPropertyOf swv:hasRelatedEventTime
            range swv:TimeRange
            
            # the following should not be necessary, but it is
            range swv:TimeRangeOverUnit
            range swv:TimeRangeWSE
            
            # messing with chaining consistency here, but we know it'll work
            # rules for tail are irrelevant
            adjPhraseRule es "tomad<hgen/><hpl/> en" chaining M S
            
            searchWeight 7
        </Property>

        <Property swv:hasRoleInPhotographicProcess>
            "Rol en el proceso fotográfico"@es
             domain swv:Photograph
             range swv:RoleInPhotographicProcess
             adjPhraseRule es "de tipo <refTerm/>" tailReferringTerm
             adjPhraseRule es "cuyo tipo contiene <searchTerm/>" tailSearchTerm                        
        </Property>

        <Property swv:hasToneAndColor>
            "Tono y color"@es
             domain swv:Photograph 
             range swv:ToneAndColor   
        </Property>
    
        <Property swv:hasFormat>
            "Formato"@es
             domain swv:Photograph 
             range swv:Format
        </Property>
        
        # properties for associated documents

        <Property swv:producedFromSameNegative>
           "Fotografía producida a partir del mismo negativo"@es
           range swv:Photograph
           # some more unpleasant hackishness here
           adjPhraseRule es "producid<hgen/><hpl/> a partir del mismo negativo que <refTerm/>" tailReferringTerm
           adjPhraseRule es "producid<hgen/><hpl/> a partir del mismo negativo que una fotografía<hpl/>" chaining F P
           searchWeight 2
        </Property>
        
        <Property swv:isReproductionOf>
           "Reprografía (la siguiente fotografía fue reproducida de la referida en esta ficha, o de otra creada a partir del mismo negativo)"@es
           range swv:Photograph
           # some more unpleasant hackishness here
           adjPhraseRule es "(posiblemente) reproducid<hgen/><hpl/> de <refTerm/>" tailReferringTerm
           adjPhraseRule es "(posiblemente) reproducid<hgen/><hpl/> de una fotografía" chaining F P
           searchWeight 2
        </Property>
        
        <Property swv:isOriginalImageOf>
           "Imagen base (la siguiente fotografía, u otra creada a partir del mismo negativo, fue empelada como base para crear la fotografía referida por esta ficha)"@es
           range swv:Photograph
           # some more unpleasant hackishness here
           adjPhraseRule es "(posiblemente) imagen base de <refTerm/>" tailReferringTerm
           adjPhraseRule es "(posiblemente) imagen base de una fotografía" chaining F P
           searchWeight 2
        </Property>

        <Property swv:isInTheSameSeries>
           "Fotografía de la misma secuencia (conjunto de fotografías tomadas casi en el mismo momento y desde el mismo lugar, apuntando la cámara hacia puntos diferentes)"@es
           range swv:Photograph
           # some more unpleasant hackishness here
           adjPhraseRule es "de la misma secuencia que <refTerm/>" tailReferringTerm
           adjPhraseRule es "de la misma secuencia que una fotografía<hpl/>" chaining F P
           searchWeight 2
        </Property>

        <Property swv:isConsecutive>
           "Fotografía consecutiva (tomada casi en el mismo momento, desde el mismo lugar y apuntando la cámara hacia el mismo punto)"@es
           range swv:Photograph
           # some more unpleasant hackishness here
           adjPhraseRule es "consecutiv<hgen/><hpl/> de <refTerm/>" tailReferringTerm
           adjPhraseRule es "consecutiv<hgen/><hpl/> de una fotografía<hpl/>" chaining F P
           searchWeight 2
        </Property>
        
        <Property swv:isASimilarShot>
           "Fotografía con encuadre similar (tomada aproximadamente desde el mismo lugar, apuntando la cámara hacia el mismo punto)"@es
           range swv:Photograph
           # some more unpleasant hackishness here
           adjPhraseRule es "con encuadre similar a <refTerm/>" tailReferringTerm
           adjPhraseRule es "con encuadre similar a una fotografía" chaining F S
           searchWeight 2
        </Property>
        
        <Property swv:hasRelatedEngraving>
           "Grabado relacionado (la fotografía referida por esta ficha, u otra creada a partir del mismo negativo, fue empleada como base para el siguiente grabado)"@es
           range swv:ContentComponentLink
           
           # violating established phrase grammar rules
           # should work with swv:hasLinkedPublication
		   adjPhraseRule es "que aparece<hvpl/> en un grabado" chaining M S
           
           # here adj phrases are taken care of with a broader krrr
           # only used for hits on locations in publications
           # adjPhraseRule es "que aparece<hvpl/> el grabado <refTerm/>" tailReferringTerm
           # adjPhraseRule es "que aparece<hvpl/> un grabado," chaining F S
          searchWeight 2
        </Property>
        
        <Property swv:publicationNote>
          "Publicación"@es
          # inverse "Obra que publica"@es
          range swv:ContentComponentLink
		  
		  # violating established phrase grammar rules
		  # should work with swv:hasLinkedPublication
		  adjPhraseRule es "que aparece<hvpl/>" chaining F S
		  
		  # here adj phrases are mainly taken care of with a broader krrr
		  # the following adj phrase rule is only for hits on locations in publications
          # adjPhraseRule es "que aparece<hvpl/> en <refTerm/>" tailReferringTerm
          # adjPhraseRule es "que aparece<hvpl/> en una obra," chaining F S
          searchWeight 2
        </Property>
        
        <Property swv:hasPhotographsManufacturedInTheSameProcess>
            "Serie fotográfica con igual manufactura (serie fotográfica creada a partir de los mismos negativos y como parte del mismo proceso de manufactura)"@es
            range sys:Group
            adjPhraseRule es "con fotografías de igual manufactura que <refTerm/>" tailReferringTerm
            adjPhraseRule es "con fotografías de igual manufactura que un conjunto " chaining M S			 
            searchWeight 2
        </Property>

        <Property swv:hasOriginalPhotographs>
            "Registros base (negativos a partir de los cuales fue creada la serie fotográfica)"@es
            range sys:Group
           adjPhraseRule es "que puede<hvpl/> ser reproducciones de <refTerm/>" tailReferringTerm
           adjPhraseRule es "que puede<hvpl/> ser reproducciones de un conjuto de negativos<hpl/>" chaining F P
           searchWeight 2
        </Property>

        <Property swv:hasReproductions>
            "Reprografías (la siguiente serie fotográfica fue reproducida de la serie referida en esta ficha, o de otra creada a partir de los mismos negativos)"@es
            range sys:Group
           adjPhraseRule es "(posiblemente) reproducid<hgen/><hpl/> de <refTerm/>" tailReferringTerm
           adjPhraseRule es "(posiblemente) reproducid<hgen/><hpl/> de un conjunto de fotografías<hpl/>" chaining F P
           searchWeight 2
        </Property>

        <Property swv:hasOriginalImages>
           "Imagen base (la siguiente serie fotográfica, u otra creada a partir de los mismos negativos, fue empelada como base para crear la serie referida en esta ficha)"@es
            "Imágenes base"@es
            range sys:Group
           adjPhraseRule es "que puede<hvpl/> ser reproducciones de <refTerm/>" tailReferringTerm
           adjPhraseRule es "que puede<hvpl/> ser reproducciones de una serie fotográfica<hpl/>" chaining F P
           searchWeight 2
        </Property>

        <Property swv:hasSimilarShots>
            "Fotografías con encuadre similar"@es
            range sys:Group
           adjPhraseRule es "con encuadre similar a <refTerm/>" tailReferringTerm
           adjPhraseRule es "con encuadre similar a una serie fotográfica" chaining F S
           searchWeight 2
        </Property>

        <Property swv:hasRelatedEngravings>
            "Grabados relacionados (la serie fotográfica referida por esta ficha, u otra creada a partir de los mismos negativos, fue empleada como base para la siguiente serie de grabados)"@es
            range swv:Publication
		   adjPhraseRule es "que aparece<hvpl/> en grabados en una publicación" chaining F P
		   adjPhraseRule es "que aparece<hvpl/> en grabados en <refTerm/>" tailReferringTerm
		   searchWeight 2
		</Property>		   
    </Vocabulary>
    
    <RuleSet photographer_link>
        <Structure>
            <Descriptor has_photographer>
                property swv:hasPhotographer
            </Descriptor>
            
            <Descriptor has_certainty_level>
                property swv:hasCertaintyLevel
            </Descriptor>
       </Structure>  
       
        <BPVFunctions>
     		<TextBPVFunction text_ref>
         		defaultTextBPVFunction
         		slot has_photographer captureSearchHits
         			|{ 
						photographer = (@root->has_photographer).text_bpv
						certainty =  @root->has_certainty_level
						
						if (certainty.size > 0)
						  "#{photographer} <span class='note'>(#{certainty.text_bpv})</span>"
						else
						  photographer
						end
			        }|
	    	</TextBPVFunction>
	    </BPVFunctions>
    </RuleSet>
    
    <RepositorySetup>
           <SOC roles_in_photographic_process>
                "Roles en el proceso fotográfico"@es
                hasGroupDomain swv:RoleInPhotographicProcess
                bindToRuleSet thing
                secondaryLevel
            </SOC>

            <SOC certainty_levels>
                "Niveles de certeza"@es
                hasGroupDomain swv:CertaintyLevel
                bindToRuleSet thing
                secondaryLevel
            </SOC>

            <SOC tones_and_colors>
                "Tones and colors"@es
                hasGroupDomain swv:ToneAndColor
                bindToRuleSet thing
                secondaryLevel
            </SOC>
            
            <SOC image_materials>
                "Materiales de imágenes"@es
                hasGroupDomain swv:Material
                bindToRuleSet thing
                secondaryLevel
            </SOC>
            
            <SOC image_support_materials>
                "Materiales de soportes de imágenes"@es
                hasGroupDomain swv:ImageSupportMaterial
                bindToRuleSet thing
                secondaryLevel
            </SOC>
            
                
            <SOC image_formats>
                 "Formatos para imágenes fotográficas"@es
                 hasGroupDomain swv:Format
                 bindToRuleSet thing
                 secondaryLevel
            </SOC>         
                         
     </RepositorySetup>
</DefinitionSet>

<DefinitionSet describing_exhibitions>
    <Vocabulary>
        <Property swv:hasExhibition>
          "Exposición pública de la fotografía"@es
          range swv:Exhibition
          
          adjPhraseRule es "expuest<hgen/><hpl/> públicamente en <refTerm/>" tailReferringTerm
          
          # hackish violation of gramatical coherence of chaining phrases
          adjPhraseRule es "expuest<hgen/><hpl/> públicamente" chaining M S

          searchWeight 2
        </Property>

        <Property swv:hasGroupExhibition>
          "Exposición pública del conjunto documental"@es
          range swv:Exhibition
          
          adjPhraseRule es "expuest<hgen/><hpl/> públicamente en <refTerm/>" tailReferringTerm
          
          # hackish violation of gramatical coherence of chaining phrases
          adjPhraseRule es "expuest<hgen/><hpl/> públicamente" chaining M S

          searchWeight 2
        </Property>
        
        <Class swv:Exhibition>
          "Exhibición"@es
          unGroupable
        </Class>

        <Property swv:hasVenue>
            "Recinto"@es
            range swv:Venue
            adjPhraseRule es "en <refTerm/>" tailReferringTerm
            adjPhraseRule es "en una sala" chaining F S
        </Property>
        
        <Class swv:Venue>
          "Recinto"@es
          subClassOf swv:Place
          unGroupable
        </Class>

        <Property swv:hasVenueLocation>
            "Ubicación del recinto"@es
            subPropertyOf swv:hasRelatedLocation
            range swv:Place
            adjPhraseRule es "ubicad<hgen/><hpl/> en <refTerm/>" tailReferringTerm
            adjPhraseRule es "ubicad<hgen/><hpl/> en un lugar" chaining M S
        </Property>
        
        <Property swv:hasExhibitionDate>
        	"Fecha de exhibición"@es
        	subPropertyOf swv:hasRelatedEventTime
        	range swv:TimeRange
        	
        	# the following shouldn't be necessary, but it is
        	range swv:TimeRangeOverUnit
        	range swv:TimeRangeWSE
        	
            # messing with chaining consistency here, but we know it'll work
            # rules for tail are irrelevant
            adjPhraseRule es "en" chaining M S        	
        </Property>
        
    </Vocabulary>
    
    <RuleSet exhibition>
        <Structure>
            <Descriptor has_title>
                property swv:hasTitle
            </Descriptor>
            
            <Descriptor has_venue>
            	property swv:hasVenue
            </Descriptor>
            
            <Descriptor has_exhibition_date>
            	property swv:hasExhibitionDate
            </Descriptor>
            
        </Structure>
        
        <BPVFunctions>
            <TextBPVFunction full_ref>
                defaultTextBPVFunction
                slot has_title captureSearchHits
                slot has_venue
                slot has_exhibition_date
                |{
                	title = (@root->has_title).text_bpv
                	venue = (@root->has_venue).text_bpv
                	date = (@root->has_exhibition_date).text_bpv                	
                	"\"#{title}\", en #{venue}, #{date}."
                }|
            </TextBPVFunction>
        </BPVFunctions>
	</RuleSet>


    <RuleSet venue>
        <Structure>
            <Descriptor has_name>
                useDefinition thing.has_name
            </Descriptor>
            
            <Descriptor has_venue_location>
            	property swv:hasVenueLocation
            </Descriptor>
        </Structure>
        
        <BPVFunctions>
            <TextBPVFunction full_ref>
                defaultTextBPVFunction
                slot has_name captureSearchHits
                slot has_venue_location
                |{
                	name = (@root->has_name).text_bpv
                	loc = (@root->has_venue_location).text_bpv
                	"#{name}, #{loc}"
                }|
            </TextBPVFunction>
        </BPVFunctions>
	</RuleSet> 

    <RepositorySetup>
        <SOC venues>
            "Recintos"@es
            hasGroupDomain swv:Venue
            bindToRuleSet venue
            secondaryLevel
        </SOC>  
   </RepositorySetup>
</DefinitionSet>

<DefinitionSet catalographic_titles>
    <Vocabulary>
#        <Property swv:hasComplexTitle>
#        	# for the time being we'll be using just the hasTitle property in current collections
#        
#            "Título"@es           
#            adjPhraseRule es "con el título <refTerm/>" tailReferringTerm
#            adjPhraseRule es "cuyo título contiene <searchTerm/>" tailSearchTerm            
#            
#            # violation of uniform gramatic structures for chaining adj phrases
#            # but we know it'll work
#            adjPhraseRule es "cuyo título" chaining M S
#            subPropertyOf swv:hasTitle
#            range swv:ComplexTitle
#            searchWeight 9
#        </Property>
    
#        <ComplexDataType swv:ComplexTitle>
#            "Título complejo"@es
#            subDataTypeOf swv:Title
#            comparisonVector String title_text default
#            bindToRuleSet complex_title
#        </ComplexDataType>

#        <Property swv:wasTakenFrom>
#            "Fue tomado de"@es
#             domain swv:ComplexTitle
#             range swv:HandWrittenNote
#             range swv:Publication
#        </Property>

        <ComplexDataType swv:ArchivalTitle>
            "Título archivístico"@es
            subDataTypeOf swv:Title
            comparisonVector String title_text default
            bindToRuleSet archival_title
        </ComplexDataType>

        <Property swv:hasTitleType>
            "Tipo de título"@es
             domain swv:ArchivalTitle
             range swv:TitleType
        </Property>

		<Class swv:TitleType>
			"Tipo de título"@es
		</Class>

        <Property swv:hasTitleNote>
            "Nota de título"@es
             range xsd:string
        </Property>

        <Property swv:usesQuotes>
             # really should be using boolean, but we're all 2:00 deadline hackish right now
             "Usa comillas"@es
             range xsd:string
        </Property>

        <Property swv:hasTitleText>
            "Texto del título"@es
            
            # violation of uniform gramatic structures for chaining adj phrases
            # but we know it'll work
 		    adjPhraseRule es "contiene <searchTerm/>" tailSearchTerm            
            range xsd:string
        </Property>
    </Vocabulary>

    <RuleSet archival_title>
        <Structure>
            <Descriptor has_title_type>
                property swv:hasTitleType
            </Descriptor>

            <Descriptor has_title_text>
                property swv:hasTitleText
            </Descriptor>
        </Structure>
        
	    <KRRelationRules>
            <KRRelationRule has_title_note>
                has_title_type->title_type.has_title_note
            </KRRelationRule>

            <KRRelationRule uses_quotes>
                has_title_type->title_type.uses_quotes
            </KRRelationRule>
        </KRRelationRules>
        
        
        <CompVectorFunctions>
          <CompVectorFunction title_text>
            |{
              title = (@root->has_title_text).val
              title.gsub!(/\,|\.|\-|\=|\;|\:|\!|\'|\"|\(|\)|\[|\]|\~|\*|\+|\?|\¿|\!|\¡/, ' ')
              title.squeeze!(' ')
              title.downcase!
              title.strip!
              title.sub(/^(el\ |la\ |los\ |las\ )/, '')
            }|
          </CompVectorFunction>
        </CompVectorFunctions>    

        <BPVFunctions>
            <TextBPVFunction noteful>
                slot has_title_text captureSearchHits
				defaultTextBPVFunction
                |{ 
                	# for now, this is a hack
                	# really we should be checking the class of a single result in from, not the number of results
                	note = @root->has_title_note
                	text = @root->has_title_text
                	# oh so hackish
                	quotes = ((@root->uses_quotes).text_bpv == "true")
                	quotes_str = (quotes ? "\"" : "")
                	if (note.size > 0)
                        "#{quotes_str}#{text.text_bpv}#{quotes_str} <span class='note'>(#{note.text_bpv})</span>" 
                    else
                    	"#{quotes_str}#{text.text_bpv}#{quotes_str}"
                   	end
                }|
            </TextBPVFunction>
            
            <TextBPVFunction noteless>
            	|{
            	    text = @root->has_title_text
                	# oh so hackish
                	quotes = ((@root->uses_quotes).text_bpv == "true")
                	quotes_str = (quotes ? "\"" : "")
                   	"#{quotes_str}#{text.text_bpv}#{quotes_str}"
            	}|
            </TextBPVFunction>
        </BPVFunctions>
        
        <BPVFunctions>
            <TextBPVFunction short_text_ref>
            	slot has_title_text
                    |{ "\"" + (@root->has_title_text).text_bpv + "\"" }|
            </TextBPVFunction>
        </BPVFunctions>
    </RuleSet>
    
    <RuleSet title_type>
        <Structure>
            <Descriptor has_title_note>
                property swv:hasTitleNote
            </Descriptor>

            <Descriptor has_name>
                useDefinition thing.has_name
            </Descriptor>

            <Descriptor uses_quotes>
                property swv:usesQuotes
            </Descriptor>            
        </Structure>    
    </RuleSet>
    
    <RepositorySetup>
        <SOC title_types>
            "Tipos de títulos"@es
            hasGroupDomain swv:TitleType
            bindToRuleSet title_type
            secondaryLevel
        </SOC>
    </RepositorySetup>
</DefinitionSet>

<DefinitionSet image_composition>
    <Vocabulary>
        <Class swv:FormalStructure>
            "Estructura Formal"@es
        </Class>

        <Class swv:Orientation>
            "Orientacion"@es
        </Class>

        <Class swv:Plane>
            "Plano"@es
        </Class>

        <Class swv:CameraAngle>
            "Ángulo de la cámara"@es
        </Class>

        <Class swv:CameraLevel>
            "Nivel de la cámara"@es
        </Class>

        <Class swv:CameraType>
            "Tipo de cámara"@es
            unGroupable
        </Class>

        <Class swv:ImageShape>
            "Edición de imagen"@es
        </Class>

        <Property swv:hasFormalStructure>
            "Estructura Formal"@es
            range swv:FormalStructure
            adjPhraseRule es "cuya estructura formal es <refTerm/>" tailReferringTerm
            adjPhraseRule es "con una estructura formal" chaining F S
        </Property>

        <Property swv:hasOrientation>
            "Orientación"@es
            range swv:Orientation
            adjPhraseRule es "cuya orientación es <refTerm/>" tailReferringTerm
            adjPhraseRule es "con una orientación" chaining F S
        </Property>

        <Property swv:hasPlane>
            "Plano"@es
            range swv:Plane
            adjPhraseRule es "cuyo plano es <refTerm/>" tailReferringTerm
            adjPhraseRule es "con un plano" chaining M S            
        </Property>

        <Property swv:hasCameraAngle>
            "Ángulo de la cámara"@es
            range swv:CameraAngle
            adjPhraseRule es "cuyo ángulo de cámara es <refTerm/>" tailReferringTerm
            adjPhraseRule es "con un ángulo de cámara" chaining M S            
        </Property>
        
        <Property swv:hasCameraLevel>
            "Nivel de la cámara"@es
            range swv:CameraLevel
            adjPhraseRule es "cuyo nivel de cámara es <refTerm/>" tailReferringTerm
            adjPhraseRule es "con un nivel de cámara" chaining M S            
        </Property>

        <Property swv:hasCameraType>
            "Tipo de cámara"@es
            range swv:CameraType
            adjPhraseRule es "cuyo tipo de cámara es <refTerm/>" tailReferringTerm
            adjPhraseRule es "con un tipo de cámara" chaining M S            
        </Property>

        <Property swv:hasImageShape>
            "Edición de imagen"@es
            range swv:ImageShape
            adjPhraseRule es "cuya edición de imagen es <refTerm/>" tailReferringTerm
            adjPhraseRule es "con una edición de imagen" chaining F S            
        </Property>


     </Vocabulary>
        <RepositorySetup>
            <SOC formal_structures>
                "Tipos de estructuras formales"@es
                hasGroupDomain swv:FormalStructure
                bindToRuleSet thing
                secondaryLevel
            </SOC>

            <SOC orientations>
                "Tipos de orientaciones"@es
                hasGroupDomain swv:Orientation
                bindToRuleSet thing
                secondaryLevel
            </SOC>

            <SOC planes>
                "Tipos de planos"@es
                hasGroupDomain swv:Plane
                bindToRuleSet thing
                secondaryLevel
            </SOC>
            
            <SOC camera_angles>
                "Ángulos de la cámara"@es
                hasGroupDomain swv:CameraAngle
                bindToRuleSet thing
                secondaryLevel
            </SOC>

            <SOC camera_levels>
                "Niveles de la cámara"@es
                hasGroupDomain swv:CameraLevel
                bindToRuleSet thing
                secondaryLevel
            </SOC>

            <SOC types_of_camera>
                "Tipos de cámara"@es
                hasGroupDomain swv:CameraType
                bindToRuleSet thing
                secondaryLevel
            </SOC>
            
            <SOC image_shapes>
                "Ediciones de imagen"@es
                hasGroupDomain swv:ImageShape
                bindToRuleSet thing
                secondaryLevel
            </SOC>                        
        </RepositorySetup>
</DefinitionSet>