File:  [LON-CAPA] / doc / homework / xml.html
Revision 1.5: download - view: text, annotated - select for diffs
Thu Jun 6 07:14:18 2002 UTC (22 years, 5 months ago) by albertel
Branches: MAIN
CVS tags: version_0_5_1, version_0_5, version_0_4, stable_2002_july, STABLE, HEAD
-updated global lists, and the helper function lists

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>XML / Style Files</title>
  </head>

  <body>
    <h1>XML / Style Files</h1>

    <h2>XML Files</h2>
    <p>
      All HTML / XML files are run through the lonxml handler before
      being served to a user. This allows us to rewrite many portion
      of a document and to support serverside tags. There are 2 ways
      to add new tags to the xml parsing engine, either through
      LON-CAPA style files or by writing Perl tag handlers for the
      desired tags.
    </p>
    
    <h3>Global Variables</h3>
    <ul>
      <li>
	<i>$Apache::lonxml::debug</i> - debugging control
      </li>
      <li>
	<i>@Apache::lonxml::pwd</i> - path to the directory containing
	the file currently being processed
      </li>
      <li>
	<i>@Apache::lonxml::outputstack</i> <br />
	<i>$Apache::lonxml::redirection</i> - these two are used for
	capturing a subset of the output for later processing, don't
	touch them directly use &startredirection and &endredirection
      </li>
      <li>
	<i>$Apache::lonxml::import</i> - controls whether the
	&lt;import&gt; tag actually does anything
      </li>
      <li>
	<i>@Apache::lonxml::extlinks</i> - a list of URLs that the
	user is allowed to look at because of the current resource
	(images, and links)
      </li>
      <li>
	<i>$Apache::lonxml::metamode</i> - some output is turned off,
	the meta target wants a specific subset, use &lt;output&gt; to
	guarentee that the catianed data will be in the parsing output
      </li>
      <li>
	<i>$Apache::lonxml::evaluate</i> - controls whether
	run::evaluate actually derefences variable references
      </li>
      <li>
	<i>%Apache::lonxml::insertlist</i> - data structure for edit
	mode, determines what tags can go into what other tags
      </li>
      <li>
	<i>@Apache::lonxml::namespace</i> - stores the list of tag
	namespaces used in the insertlist.tab file that are currently
	active, used only in edit mode.
      </li>
      <li>
	<i>$Apache::lonxml::registered</i> - set to 1 once the remote
	has been updated to know what resource we are looking at.
      </li>
      <li>
	<i>$Apache::lonxml::request</i> - current Apache request
	object, or undef
      </li>
      <li>
	<i>$Apache::lonxml::curdepth</i> - current depth of the
	overall parse depth. Will be a string like: 2_3_1 (first tag
	in the third second level tag in the second toplevel tag). It
	gets set by callsub, and can be used in Perl tag
	implementations. It relies upon the internal globals:
	<i>@Apache::lonxml::depthcounter</i>,
	<i>$Apache::lonxml::depth</i>,
	<i>$Apache::lonxml::olddepth</i>
      </li>
      <li>
	<i>$Apache::lonxml::prevent_entity_encode</i> - By default the
	xmlparser will try to rencode any 8-bit characters into HTML
	Entity Codes, If this is set to a true value it will be
	prevented.
    </ul>

    <p>
      In common usage, <i>$Apache::lonxml::prevent_entity_encode</i>,
      <i>$Apache::lonxml::evaluate</i>,
      <i>$Apache::lonxml::metamode</i>,
      <i>$Apache::lonxml::import</i>, should never be set to a value
      directly, but rather incremented when you want the effect on,
      and decremented when you want the effect off.
    </p>
    
    <h3>Notable Perl subroutines</h3>
    <p>
      If not specified these functions are in Apache::lonxml
    </p>
    <ul>
      <li>
	<i>xmlparse</i> - see the XMLPARSE figure - also not callable
	from inside a tag, if one needs to restart parsing, either
	create add a new LCParser to the parser stack parser using the
	newparser function, or call inner_xmlparser, see the xmlparse
	function in scripttag.pm
      </li>
      <li>
	<i>recurse</i> - acts just like <i>xmlparse</i>, except it
	doesn't do the style definition check it always calls
	<i>callsub</i>
      </li>
      <li>
	<i>callsub</i> - callsub looks if a perl subroutine is defined
	for the current tag and calls. Otherwise it just returns the
	tag as it was read in. It also will throw on a default editing
	interface unless the tag has a defined subroutine that either
	returns something or requests that call sub not add the
	editing interface.
      </li>
      <li>
	<i>afterburn</i> - called on the output of xmlparse, it can
	add highlights, anchors, and links to regular expersion
	matches to the output.
      </li>
      <li>
	<i>register_insert</i> - builds the
	%Apache::lonxml::insertlist structure of what tags can have
	what other tags inside.
      </li>
      <li>
	<i>whichuser</i> - returns a list of $symb, $courseid,
	$domain, $name that is correct for calls to lonnet functions
	for this setup. Uses form.grade_ parameters, if the user is
	allowed to mgr in the course
      </li>
      <li>
	<i>setup_globals</i> - initializes all lonxml globals when
	xmlparse is called. If you intend to create a new target you
	will likely need to tweak how the globals are setup upon start
	up.
      </li>
      <li>
	<i>init_safespace</i> - creates Holes to external functions,
	creates some global variables, and set the permitted operators
	of the global Safespace intepreter.
      </li>
    </ul>
    <h3>Functions Tag Handlers can use</h3>
    <p>
      If not specified these functions are in Apache::lonxml
    </p>
    <ul>
      <li>
	<i>debug</i> - a function to call to printout debugging
	messages. Will only print when Apache::lonxml::debug is set to
	1
      </li>
      <li>
	<i>warning</i> - a function to use for warning messages. The message
	will appear at the top of a resource when it is viewed in
	construction space only.
      </li>
      <li>
	<i>error</i> - a function to use for error messages. The
	message will appear at the top of a resource when it is viewed
	in construction space, and will message the resource author
	and course instructor, while informing the student that an
	error has occured otherwise.
      </li>
      <li>
	<i>get_all_text</i> - 2 args, tag to look for (need to use
	/tag to look for an end tag) and a HTML::TokeParser reference,
	it will repedelyt get text from the TokeParser until the
	requested tag is found. It will return all of the document it
	pulled form the TokeParser. (See
	Apache::scripttag::start_script for an example of usage.)
      </li>
      <li>
	<i>get_param</i> - 4 arguments, first is a scaler sting of
	the argument needed, second is a reference to the parser
	arguments stack, third is a reference to the Safe space, and
	fourth is an optional "context" value. This subroutine allows
	a tag to get a tag argument, after being interpolated inside
	the Safe space. This should be used if the tag might use a
	safe space variable reference for the tag argument. (See
	Apache::scripttag::start_script for an example.)
	
	This version only handles scalar variables.
      </li>
      <li>
	<i>get_param_var</i> - 4 arguments, first is a scaler sting of
	the argument needed, second is a reference to the parser
	arguments stack, third is a reference to the Safe space, and
	fourth is an optional "context" value. This subroutine allows
	a tag to get a tag argument, after being interpolated inside
	the Safe space. This should be used if the tag might use a
	safe space variable reference for the tag argument. (See
	Apache::scripttag::start_script for an example.)
	
	This version can handle list or hash variables properly.
      </li>
      <li>
	<i>description</i> - 1 argument, the token object. This will
	return the textual decription of the current tag from the
	insertlist.tab file.
      </li>
      <li>
	<i>whichuser</i> - 0 arguments. This will take a look at the
	current environment setting and return the current $symb,
	$courseid, $udom, $uname. You should always use this function
	if you want to determine who the current user is. (Since a
	instructor might be trying to view a students version of a
	resource.)
      </li>
      <li>
	<i>inner_xmlparse</i> - 6 arguments, the target, an array
	pointer to the current stack of tags, and array pointer to the
	current stack of tag arguments, an array pointer to the
	current stack of LCParser's, a pointer to the current Safe
	space, a pointer to the hash of current style definitions
      </li>
      <li>
	<i>newparser</i> - 3 args, first is a reference to the parser
	stack, second should be a reference to a string scaler
	containg the text the newparser should run over, third should
	be a scaler of the directory path the file the parser is
	parsing was in. (See Apache::scripttag::start_import for an
	example.)
      </li>
      <li>
	<i>register</i> - should be called in a file's BEGIN block. 2
	arguments, a scaler string, and a list of strings. This allows
	a file to register what tags it handles, and what the
	namespace of those tags are. Example:
<pre>
sub BEGIN {
  &Apache::lonxml::register('Apache::scripttag',('script','display'));
}
</pre>
	Would tell xmlparse that in Apache::scripttag it can find
	handlers for &lt;script&gt; and &lt;display&gt;, if one
	regsiters a tag that was already registered the previous one
	is remembered and will be restored on a deregister.
      </li>
      <li>
	<i>deregister</i> - used to remove a previously registered tag
	implementation. It will restore the previous registration if
	there was one.
      </li>
      <li>
	<i>startredirection</i> - used when a tag wants to save a
	portion of the document for its end tag to use, but wants the
	intervening document to be normally processed. (See
	Apache::scripttag::start_window for an example.)
      </li>
      <li>
	<i>endredirection</i> - used to stop preventing xmlparse from
	hiding output. The return value is everthing that xmlparse has
	processed since the corresponding startredirection. (See
	Apache::scripttag::end_window for an example.)
      </li>
      <li>
	<i>Apache::run::evaluate</i> - 3 args, first a string, second
	a reference to the Safe space, 3 a string to be evaluated
	before the first arg. This subroutine will do variable
	interpolation and simple function interpolations on the first
	argument. (See Apache::lonxml::inner_xmlparse for an example.)
      </li>
      <li>
	<i>Apache::run::run</i> - 2 args, first a string, second a
	reference to the Safe space. This handles passing the passed
	string into the Safe space for evaluation and then returns the
	result. (See Apache::scripttag::start_script for an example.)
      </li>
    </ul>

    <h2>Style Files</h2>
    <h3>Style File specific tags</h3>
    <ul>
      <li>
	<b>&lt;definetag&gt;</b> - 2 arguments, <i>name</i> name of
	new tag being defined, if proceeded with a / defining an end
	tag, required; <i>parms</i> parameters of the new tag, the
	value of these parameters can be accesed by $parametername.
      </li>
      <li>
	<b>&lt;render&gt;</b> - define what the new tag does for a non meta target
      </li>
      <li>
	<b>&lt;meta&gt;</b> - define what the new tag does for a meta target
      </li>
      <li>
	<b>&lt;tex&gt; / &lt;web&gt; / &lt;latexsource&gt;</b> -
	define what a new tag does for a specific no meta target, all
	data inside a &lt;render&gt; is render to all targets except
	when surrounded by a specific target tags.
      </li>
    </ul>
    <hr>
    <address><a href="mailto:albertel@marvin.lite.msu.edu">Guy Albertelli</a></address>
<!-- Created: Sun May 20 15:47:08 EDT 2001 -->
<!-- hhmts start -->
Last modified: Thu Jun  6 01:16:44 EDT 2002
<!-- hhmts end -->
  </body>
</html>

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>