1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-05-06 14:52:34 +02:00
2010-01-24 09:19:39 +00:00

220 lines
8.1 KiB
C

/**
* Copyright 2008 Digital Bazaar, Inc.
*
* This file is part of librdfa.
*
* librdfa is Free Software, and can be licensed under any of the
* following three licenses:
*
* 1. GNU Lesser General Public License (LGPL) V2.1 or any
* newer version
* 2. GNU General Public License (GPL) V2 or any newer version
* 3. Apache License, V2.0 or any newer version
*
* You may not use this file except in compliance with at least one of
* the above three licenses.
*
* See LICENSE-* at the top of this software distribution for more
* information regarding the details of each license.
*
* This file is used to process RDFa subjects.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "rdfa_utils.h"
#include "rdfa.h"
/**
* Creates a new bnode given an RDFa context.
*
* @param context the RDFa context.
*
* @return a newly allocated string containing the bnode name. This
* string MUST be memory collected.
*/
char* rdfa_create_bnode(rdfacontext* context)
{
char* rval = NULL;
char buffer[64];
// print and increment the bnode count
sprintf(buffer, "_:bnode%i", (int)context->bnode_count++);
rval = rdfa_replace_string(rval, buffer);
return rval;
}
/**
* Establishes a new subject for the given context given the
* attributes on the current element. The given context's new_subject
* value is updated if a new subject is found.
*
* @param context the RDFa context.
* @param name the name of the current element that is being processed.
* @param about the full IRI for about, or NULL if there isn't one.
* @param src the full IRI for src, or NULL if there isn't one.
* @param resource the full IRI for resource, or NULL if there isn't one.
* @param href the full IRI for href, or NULL if there isn't one.
* @param type_of The list of IRIs for type_of, or NULL if there was
* no type_of specified.
*/
void rdfa_establish_new_subject(
rdfacontext* context, const char* name, const char* about, const char* src,
const char* resource, const char* href, const rdfalist* type_of)
{
// 4. If the [current element] contains no valid @rel or @rev
// URI, obtained according to the section on CURIE and URI
// Processing, then the next step is to establish a value for
// [new subject]. Any of the attributes that can carry a
// resource can set [new subject];
if(about != NULL)
{
// * by using the URI from @about, if present, obtained according
// to the section on CURIE and URI Processing;
context->new_subject =
rdfa_replace_string(context->new_subject, about);
}
else if(src != NULL)
{
// * otherwise, by using the URI from @src, if present, obtained
// according to the section on CURIE and URI Processing.
context->new_subject =
rdfa_replace_string(context->new_subject, src);
}
else if(resource != NULL)
{
// * otherwise, by using the URI from @resource, if present,
// obtained according to the section on CURIE and URI
// Processing;
context->new_subject =
rdfa_replace_string(context->new_subject, resource);
}
else if(href != NULL)
{
// * otherwise, by using the URI from @href, if present, obtained
// according to the section on CURIE and URI Processing.
context->new_subject =
rdfa_replace_string(context->new_subject, href);
}
// * If no URI is provided by a resource attribute, then the first
// match from the following rules will apply:
else if((strcmp(name, "head") == 0) || (strcmp(name, "body") == 0))
{
// * if the element is the head or body element then act as if
// there is an empty @about present, and process it according to
// the rule for @about, above;
context->new_subject =
rdfa_replace_string(context->new_subject, context->base);
}
else if((type_of != NULL) && (type_of->num_items > 0))
{
// * if @type_of is present, obtained according to the
// section on CURIE and URI Processing, then [new subject] is
// set to be a newly created [bnode];
context->new_subject = rdfa_create_bnode(context);
}
else if(context->parent_object != NULL)
{
// * otherwise, if [parent object] is present, [new subject] is
// set to that and the [skip element] flag is set to 'true';
context->new_subject =
rdfa_replace_string(context->new_subject, context->parent_object);
// TODO: The skip element flag will be set even if there is a
// @property value, which is a bug, isn't it?
//context->skip_element = 1;
}
}
/**
* Establishes a new subject for the given context when @rel or @rev
* is present. The given context's new_subject and
* current_object_resource values are updated if a new subject is found.
*
* @param context the RDFa context.
* @param about the full IRI for about, or NULL if there isn't one.
* @param src the full IRI for src, or NULL if there isn't one.
* @param resource the full IRI for resource, or NULL if there isn't one.
* @param href the full IRI for href, or NULL if there isn't one.
* @param type_of the list of IRIs for type_of, or NULL if type_of
* wasn't specified on the current element.
*/
void rdfa_establish_new_subject_with_relrev(
rdfacontext* context, const char* name, const char* about, const char* src,
const char* resource, const char* href, const rdfalist* type_of)
{
// 5. If the [current element] does contain a valid @rel or @rev
// URI, obtained according to the section on CURIE and URI
// Processing, then the next step is to establish both a value
// for [new subject] and a value for [current object resource]:
//
// [new subject] is set to the URI obtained from the first match
// from the following rules:
if(about != NULL)
{
// * by using the URI from @about, if present, obtained
// according to the section on CURIE and URI Processing;
context->new_subject =
rdfa_replace_string(context->new_subject, about);
}
else if(src != NULL)
{
// * otherwise, by using the URI from @src, if present, obtained
// according to the section on CURIE and URI Processing.
context->new_subject =
rdfa_replace_string(context->new_subject, src);
}
// * If no URI is provided then the first match from the following
// rules will apply:
else if((strcmp(name, "head") == 0) || (strcmp(name, "body") == 0))
{
// * if the element is the head or body element then act as if
// there is an empty @about present, and process it according to
// the rule for @about, above;
context->new_subject =
rdfa_replace_string(context->new_subject, context->base);
}
else if((type_of != NULL) && (type_of->num_items > 0))
{
// * if @type_of is present, obtained according to the
// section on CURIE and URI Processing, then [new subject] is
// set to be a newly created [bnode];
context->new_subject = rdfa_create_bnode(context);
}
else if(context->parent_object != NULL)
{
// * otherwise, if [parent object] is present, [new subject] is
// set to that;
context->new_subject =
rdfa_replace_string(context->new_subject, context->parent_object);
}
// Then the [current object resource] is set to the URI obtained
// from the first match from the following rules:
if(resource != NULL)
{
// * by using the URI from @resource, if present, obtained
// according to the section on CURIE and URI Processing;
context->current_object_resource =
rdfa_replace_string(context->current_object_resource, resource);
}
else if(href != NULL)
{
// * otherwise, by using the URI from @href, if present,
// obtained according to the section on CURIE and URI Processing.
context->current_object_resource =
rdfa_replace_string(context->current_object_resource, href);
}
else
{
// * otherwise, null.
context->current_object_resource = NULL;
}
// Note that final value of the [current object resource] will
// either be null, or a full URI.
}