data type
Library: Markup utilities (OMMARKUPUTILITIES)
Import : ommarkuputilities.xmd |
An instance of the entity-resolver
type can be used to resolve references to external entities.
The default entity-resolver
type resolves external entities much the same way as OmniMark's default entity manager, relying on the built-in shelves #library
and #libpath
which can be set from the command line.
If entity resolution fails, the resolution-failure
exception will be thrown. This is different from
the default entity manager which throws a #program-error
instead.
The markup utilities library also provides the operator |
that can combine
two entity-resolver
values so that the right-hand resolver acts as a fallback in case the primary
left-hand resolver fails.
The following example uses the default entity-resolver
to resolve the DTD external text entity reference:
import "ommarkuputilities.xmd" unprefixed process do xml-parse document scan "<!DOCTYPE a SYSTEM 'doc.dtd'><a/>" using output as external-entity-resolver via new entity-resolver {} output #content done output "All entities have been resolved.%n" catch resolution-failure output "An entity could not be resolved.%n"
The output of this program depends on whether the file doc.dtd can be found in the current
directory or any directory specified using the -libpath
command-line option.
The base entity-resolver
record type can be extended and its behaviour modified. One such extension
that is part of the standard OmniMark libraries can be found is oasis.catalog-type
in the omoasiscatalogs library.
The next example demonstrates an extension that uses the OMVFS library to
potentially read the resolved entity content from the Web, if it is not available locally.
import "ommarkuputilities.xmd" unprefixed import "omvfs.xmd" prefixed by vfs. declare record web-resolver extends entity-resolver define overriding string function map-external-identifier via value web-resolver resolver public-identifier value string public-id optional system-identifier value string system-id optional as do when public-id is specified & #library has key public-id return #library{public-id} else when system-id is specified return system-id else local resolution-failure-report r set r:resolver to resolver set new r:properties{"message"} to "No SYSTEM identifier has been specified." throw resolution-failure report r done define overriding string source function read-entity via value web-resolver resolver from value string uri as output vfs.reader of vfs.open uri process do sgml-parse document scan '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"' || ' "http://www.w3.org/TR/html4/transitional.dtd">%n' || '<html><head><title>HTML test</title></head></html>%n' using output as external-entity-resolver via new web-resolver {} output #content done output "All entities have been resolved.%n" catch resolution-failure output "An entity could not be resolved.%n"