Provided by: librefdb-perlmod-perl_1.2-2_all bug

NAME

       RefDB::Makestyle - methods used by refdb-ms (RefDB style generator)

SUMMARY

       Makestyle.pm - a module used by refdb-ms (RefDB MakeStyle) -- a utility that generates RefDB bibliography
       styles.

       Provides "Element" and "Attribute" classes for use in generating RefDB styles.

DEPENDENCIES

       The following perl modules are required by this library:

       •   Scalar::Util

           Provides a method of querying an object to determine its base class.

       •   Term::Clui

           Provides user interface.

           For  input  it  provides  mechanisms  for selection from menus, direct input and for yes/no question-
           answer prompts.

           For output it provides for console output or display in the default editor.

           This module, by default, records user choices in a hidden database.  This behaviour is turned off.

           Term::Clui::edit uses a console editor for display.  It uses  the  editor  specified  by  the  EDITOR
           variable.  If this variable is not set it falls back to the 'vi' editor.

       •   Text::Wrap

           Provides word-wrap for console display.

       •   File::Temp

           Provides useful methods for filename generation.

           The  OO methods are not used because, at the time of writing, the version shipped with some *nix-like
           OSes does not yet include the OO interface.

UNIVERSAL METHODS

       These methods are supplied by a hidden base class.

       •   get_classname

           Returns classname of object.

       •   _is_valid_value

           Default method for determining validity of simple (scalar) user input.  Checks that value is  defined
           and not an empty string and not filled with whitespace.

           Is overridden by derived classes with more stringent input requirements.

       •   _input_choice

           User selects from a menu.

           Returns user's selection.

           Parameters: (0 = class), 1 = prompt, 2... = options.

           Common usage:

                   my $value = undef;
                   while ( 1 ) {
                           $value = $self->_input_choice( "Select value:" , <@list> );
                           if ( $value ) { last; }
                           print "Invalid choice.  Sorry, please try again.\n";
                   }

       •   _input_ask

           User enters a value.

           Returns user's input.

           Parameters: (0 = class), 1 = prompt, 2 = default.

           Common usage:

                   my $value = undef;
                   while ( 1 ) {
                           $value = $self->_input_ask( "Enter value:" , <$default> );
                           if ( $self->_is_valid_value( $value ) ) { last; }
                   }

       •   _input_confirm

           User is asked a question to which s/he answers y/n.

           Returns boolean.

           Parameters: (0 = class), 1 = question.

           Note:  If  multi-line  question,  then after answer only the first line is left on screen.  The first
           line should be a short question with subsequent lines holding further information.

           Common usage:

                   if (_input_confirm( "Short question?\n\nMore\nmulti-line\ntext." ) ) {
                           # do stuff
                   }

       •   _display

           Displays screen text with word wrapping.

           Parameters: (0 = class), 1 = display string.

           Common usage:

                   _display( <$scalar> );

       •   _view

           Displays large volume of text in default editor and then returns viewer to original screen.

           Parameters: (0 = class), 1 = title , 2 = help text.

           Common usage:

                   _view( <$title> , <$help_text> );

       •   _entitize

           Takes string and replaces '&', '<' and '>' with xml entity equivalents.

ATTRIBUTE CLASSES

       These classes model the XML attributes found in the Refdb "citestylex" DTD.

   Attributes: Public Interface
       Attributes: Data Members

               %self = (

                       name          =>  "ATTRIBUTE" ,

                       enumeration   =>  [ "value_0" , "value_1" , ... ] ,

                       default       =>  "value_x" ,

                       prompt        =>  "This is the purpose and/or use of the attribute." ,

                       value         =>  "User selected/entered value>" ,

                       summary       =>  0 | 1 ,

               )

       •   name

           Attribute name as per the Refdb "citestylex" DTD.  Always uppercase.

       •   enumeration

           List of possible values for attribute.   If  empty  then  attribute  takes  user-entered  value,  eg.
           DISPLAYAUTHOR, which takes a number.

       •   default

           The  default  value.  If "enumeration" is present, the default will always be one of the items in it.
           If no default then leave as "undef" -- this is the 'default' value after object construction.

       •   prompt

           The text string that is used by client methods to prompt users when entering data.

       •   summary

           Boolean determining whether attribute is included in summary form.

       •   value

           The attribute value as selected or input by the user.

       Attributes: Constructors

       In following method signatures replace ATTRIBUTE with the relevant attribute class name.

       Some attributes have a maximum number of instances that can exist within  a  given  PubType  (see  method
       select_value  below).   When  a  class is asked to create an object in excess of the designed maximum for
       that class the constructor returns a scalar holding an error message.  This enables a simple test  (using
       "ref" function) to determine whether the constructor returned an object/blessed variable or scalar.

               my $at = ATTRIBUTE->new();

       Attributes: Setters

               $at->set_name        ( "<name>"    );
               $at->set_default     ( "<default>" );
               $at->set_prompt      ( "<prompt>"  );
               $at->add_enumeration ( LIST        );
               $at->set_summary     ( 0 | 1       );

       Attributes: Getters

               $at->get_name();
               $at->get_default();
               $at->get_prompt();
               $at->get_enumeration();  # returns list with default value first
               $at->get_enum_string();  # returns single text string
               $at->get_summary();
               $at->get_value();

       Attributes: Other methods$at->select_value();

           If  enumeration  exists  then  user  selects from list. The default is always the first option in the
           list.

           If there is no enumeration the user enters the value directly. The default value is given and can  be
           selected by simply pressing "Enter".

           Some  attributes are set automatically depending on how many objects of this class have been created.
           In those classes this method has no effect.   This  applies  to  the  Role_AuthorList,  Role_PubDate,
           Role_Title, Role_UserDef, Role_Link and Role_Misc classes.

           The  "citestylex" DTD design envisages a maximum number of objects of these classes being constructed
           -- the number varying between 3 and 5 depending on the class.   See  "Attributes:  Constructors"  for
           what happens when the class is asked to create an object in excess of the designed maximum.

       •   $at->get_xml_fragment();

           Returns minimal xml fragment indicating the attribute name and value:

                   ATTRIBUTE="VALUE"

   Attributes: List of Classes
       To  see  a  list  of  attribute  classes  use  the "document-dtd-entities" utility that shipped with this
       program.  It extracts attribute and element properties from this script, assembles and formats them  into
       a single html document.

ELEMENT CLASSES

       These classes model the XML elements found in the Refdb "citestylex" DTD.

   Elements: Public Interface
       Elements: Data members

               %self = (

                       name          =>  "ELEMENT" ,

                       prompt        =>  "This is the purpose of this element." ,

                       help          =>  "This is help on how to use this element." ,

                       display       =>  undef | "name" | "content" ,

                       summary       =>  undef | "name" | "left" | "right" | "content" ,

                       attributes    =>  {

                               mandatory     =>  [ "Attribute_Class_0" , "Attribute_Class_1" , ... ] ,

                               optional      =>  [ "Attribute_Class_0" , "Attribute_Class_1" , ... ] ,

                               selected      =>  [ "Attribute_0" , "Attribute_1" , ... ] ,

                               man_complete  =>  undef | 1 ,

                               opt_complete  =>  undef | 1 ,

                       } ,

                       copyable      =>  1 | undef ,

                       content       =>  {

                               allowed       =>  undef | 1 ,

                               suggestion    =>  "Possible value" ,

                               value         =>  "User input" ,

                               complete      =>  undef | 1 ,

                       } ,

                       model_order   =>  [

                               [ Element_Class_0 , "? | + | 1" ] ,

                               [ Element_Class_1 , "? | + | 1" ] ,

                               ... ,

                       ] ,

                       model_noorder =>  {

                               element_list =>  [ Element_Class_0 , Element_Class_1 , ... ] ,

                               separator    =>  "Separator" ,

                       } ,

                       children      =>  {

                               elements     =>  [ Element_0 , Element_1 , ... ] ,

                               complete     =>  boolean ,

               )

       •   name

           Element name as given in the Refdb "citestylex" DTD.  Unique.

       •   prompt

           Brief statement of the element's purpose and/or function.

       •   help

           More detailed instructions on how to use this element.

       •   display

           Determines  whether,  and  how, to display the element in brief form (used for the "progress report".
           If defined, the element is displayed.  If set to "name" the element name is  displayed.   If  set  to
           "content" the element contents are displayed.

       •   summary

           Determines  whether,  and  how,  to  display the element in summary form.  If defined, the element is
           displayed.  If set to "name" the element name is displayed.  If set to "content" the element contents
           are displayed.

       •   attributes

           Attributes of this element.  First two lists are  of  'legal'  attributes:  mandatory  and  optional.
           Third  list is of added attribute objects -- initially empty.  Fourth and fifth hash values are flags
           indicating whether attributes have been added.

       •   content

           Some elements hold #PCDATA content.  The hash key "allowed" determines whether element accepts  input
           --  false/undef  means  it  does not, true means it does.  The hash key "suggested" holds a suggested
           value the user may use.  The hash key "value" holds the actual user input.  The hash  key  "complete"
           is a flag indicating whether content has been entered.

       •   copyable

           Some  elements  cannot  be  copied,  either because they have mandatory attributes which require user
           input or because they only occur once per citstyle.

       •   model_order

           With model_noorder this data member determines the content model for children elements.  All  of  the
           64  elements  fall  into  one  of  three  content  models regarding children elements: 1. No children
           elements, 2. An ordered list and 3. An unordered list.

           This data member is "undef" in cases (1) and (3).

           It holds the content model for the thirty elements which have content model (2) -- an ordered list:

                   ( e[?|+|1] , e[?|+|1] , ... )

           where 'e' is the element and the  symbols  indicate  0-1,  1  or  more,  and  exactly  1  occurrence,
           respectively.

           This data member holds an array of arrays.  Each secondary array has two items: the element class and
           the number of objects that can be children.

       •   model_noorder

           With  model_order this data member determines the content model for children elements.  All of the 64
           elements fall into one of three content models regarding children elements: 1. No children  elements,
           2. An ordered list and 3. An unordered list.

           This data member is "undef" in cases (1) and (2).

           It  holds the content model for the four elements (AUTHORONLY, INTEXTDEF, PUBTYPE and YEARONLY) which
           have content model (3) -- an unordered list:

                   ( ( e | e | ... ) , e? )+

           where 'e' is an element, '?' is 0 or 1 occurrence and '+' is 1 or more occurrances.

           This data member holds a hash where the first key points to an array holding  the  list  of  alterate
           elements  in  the  content model inner brackets.  The second key points to the element represented in
           the content model as 'e+' (in every case it is SEPARATOR).

       •   children

           This data member holds a hash.  The first hash key  ("elements")  points  to  an  array  holding  the
           children  elements  added  by  the  user.   The  second hash key ("complete") is a boolean indicating
           whether all children have been added.

       Elements: Constructors

       In following method signatures replace ELEMENT with the relevant element class name.

               my $el = ELEMENT->new();

       Elements: Setters

               $el->set_name( "<name>" );
               $el->set_prompt( "<prompt>" );
               $el->set_help( "<help>" );
               $el->set_display( undef | "name" | "content" );
               $el->set_summary( undef | "name" | "left" | "right" | "content" );
               $el->set_attributes( %hash );
               $el->set_mandatory_attributes_complete( "1" | undef );
               $el->set_optional_attributes_complete( "1" | undef );
               $el->set_content( %hash );
               $el->set_content_complete( "1" | undef );
               $el->set_order( @ArrayOfArrays );
               $el->set_noorder( %hash );
               $el->set_complete( "1" | "0" | undef );
               $el->_set_value( "<value>" );

       Elements: Getters

               $el->get_name();
               $el->get_prompt();
               $el->get_help();
               $el->get_display();
               $el->get_summary();
               $el->get_attr_mandatory();  # list:   $self->{attributes}->{mandatory}
               $el->get_attr_optional();   # list:   $self->{attributes}->{optional}
               $el->get_attr_selected();   # list:   $self->{attributes}->{selected}
               $el->get_suggestion();      # scalar: $self->{content}->{suggestion}
               $el->get_value();           # scalar: $self->{content}->{value}
               $el->get_order();           # AoA:    $self->{model_order}
               $el->get_noorder_list();    # list:   $self->{model_noorder}->{element_list}
               $el->get_noorder_separator; # scalar: $self->{model_noorder}->{separator}
               $el->get_children();        # list:   $self->{children}->{element}
               $el->get_last_child();      # object: $self->{children}->{element}[<last>]

       Elements: Other methods$el->content_is_complete();

           Returns boolean indicating whether element content has been entered.

           Indicated by a data member which is set after "enter_value()" method called.

       •   $el->enter_value();

           User enters element value if element can legally hold one.  User may be presented  with  a  suggested
           value.

           If the element cannot accept a value nothing happens -- no error message/value is generated.

       •   $el->is_content_allowed();

           Returns boolean indicating whether the element can hold content.

       •   $el->children_are_complete();

           Returns boolean indicating whether all children have been added.

           Simply   returns  $self->{children}->{complete}  and  relies  on  other  subroutines  having  set  it
           appropriately.

       •   $el->max_attribute_index();

           Returns maximum index value of selected attributes list: -1 if empty list.

       •   $el->max_child_index();

           Returns maximum index value of element children list: -1 if empty list.

       •   $el->is_last_element();

           Determines whether element index is the last element in the list of children  in  the  ordered  child
           model: $self->{model_order}.

           Parameters: [ 0 = class ] , 1 = array index.

       •   $el->is_last_child();

           Determines    whether    child   index   is   the   last   element   in   the   list   of   children:
           $self->{children}->{elements}.

           Parameters: [ 0 = class ] , 1 = array index.

       •   $el->is_creatable();

           Returns a boolean indicating whether this element class can legally create another object.

           Intended to be called as a class method.

       •   $el->list_selectable_attributes();

           Returns a list of all optional attributes available for selection.  List consists of  all  attributes
           listed in 'optional' list minus all attributes already selected.

       •   $el->_build_attribute_help();

           Helper  method  for  method  "add_attributes_optional".   Takes as parameter a list of attributes for
           which help screen is being built.  Includes "name" and "prompt" for each attribute.

       •   $el->has_mandatory_attributes();

           Returns boolean indicating whether element has mandatory attributes.

       •   $el->_is_closed_tag();

           Returns boolean indicating whether element can be represented by closed tag.   Requires  no  possible
           child elements and no current content.

       •   $el->get_xml_brief_tag();

           Returns opening xml tag for element.

           Shows only mandatory attributes.

       •   $el->get_xml_open_tag();

           Returns opening xml tag for element.

           Parameters: [ 0 = class ] , 1 = show attributes (bool) , 2 = show content (bool).

           Designed  to  be  used  in  conjunction with "get_xml_close_tag" method.  If element has no potential
           child elements and no content, then will return closed tag, eg. <ELEMENT/>.

       •   $el->get_xml_close_tag();

           Returns closing xml tag for element.

           Designed to be used in conjunction with "get_xml_open_tag" method.  If element has no potential child
           elements and no content, then will return no closing tag since "get_xml_open_tag" will have  returned
           a closed tag, eg. <ELEMENT/>.

       •   $el->generate_full_xml();

           Generates full xml for element.

           Displays  all  attributes  and element content.  If no possible child elements and no current element
           content, will display closed tag, eg. <ELEMENT/>.

           Method is recursive.

           Parameters (receives): [ 0 = class ] , 1 = element count , 2 = indent/tab count and 3 = output.

           Returns: 0 = element count and 1 = output.

       •   $el->get_a_child();

           Returns a single child element matching supplied array  index.   Returns  "undef"  if  index  out  of
           bounds.

           Parameter: [ 0 = class ] , 1 = index.

       •   $el->show_progress();

           Generates  abbreviated  xml  for element and element children.  Designed to show user's "progress" to
           date.

           Displays only opening tags.   Child  elements  are  displayed  only  where  element  is  not  set  to
           "complete".

           Only mandatory attributes are displayed.

           Method is recursive.

           Parameters (receives): [ 0 = class ] , 1 = output , 2 = stop flag.

           Returns: 0  = output.

           Algorithm (recursive):

                   if self is a stop element
                           set stop flag = true
                   endif
                   add self to output
                   if stop flag == true  and  children are complete
                           return 'output'
                   else
                           repeat for all children
                                   recurse (returns 'output')
                           endrepeat
                           return 'output'
                   endif

                   if matching element
                           set stop flag = true
                   endif
                   add to output
                   if stop flag true
                           if is complete
                                   if has children
                                           recurse
                                   else
                                           add fragment to output
                                   endif
                           else  # not complete

                   if has children
                           repeat for all children
                                   recurse (returns 'retval')
                                   set output = 'retval'
                           endrepeat
                   endif
                   return output

       •   $el->generate_brief_xml();

           Generates abbreviated xml for element.  Designed to show user's "progress" to date.

           Displays  only  opening  tags.   Child  elements  are  displayed  only  where  element  is not set to
           "complete".

           Only mandatory attributes are displayed.

           Method is recursive.

           Parameters (receives): [ 0 = class ] and 1 = output.

           Returns: 0  = output.

       •   $el->get_full_tag();

           Returns opening +/- closing xml tag for element.

           Displays all attributes and element content.  If no possible child elements and no  current  content,
           will display single closed tag, eg. <ELEMENT/>.

       •   $el->_test_attributes_mandatory();

           Intended as helper method for "is_creatable".  Tests that mandatory attributes can be created.

           Note: The attributes are not actually added to the element.

           Returns  boolean.   False  value  indicates  failure  adding  mandatory attributes and the associated
           element should be detroyed.

       •   $el->add_attributes_mandatory();

           Mandatory attributes are immediately added (note: mandatory attributes should have been added  during
           element construction).

           Returns  boolean.   False  value  indicates  failure  adding  mandatory attributes and the associated
           element should be detroyed.

           Can be run in 'silent' mode with no output from method.  There are no guarantees about the  'silence'
           of attributes' "select_value" method, but all such methods should not generate output.

           Parameters: [ 0 = class ] , [ 1 = <text> | 1 ]

       •   $el->add_attributes_optional();

           The  user  selects  optional attributes to add.  Help is available.  Element feedback is presented as
           the user proceeds.

       •   $el->mandatory_attributes_complete();

           Returns boolean indicating whether mandatory attributes have been added.

           Indicated by a data member which is set after "add_attributes()" method called.

       •   $el->optional_attributes_complete();

           Returns boolean indicating whether optional attributes have been added.

           Indicated by a data member which is set after "add_attributes()" method called.

       •   $el->add_attributes();

           First adds the mandatory attributes and then gives user chance to add optional attributes.

           Returns boolean indicating whether attributes added successfully.  Only mechanism of  failure  occurs
           when  element  requires mandatory attribute such as ROLE which cannot be added because maximum number
           of ROLE attributes already exist for this PUBTYPE.

       •   $el->add_child();

           Adds a child to the current element.

           Parameters: [ 0 = class ] , 1 = child element (object).

       •   $el->_select_next_child_order();

           Helper method for method "select_next_child".  Used when element has a modal content model.  Help  is
           provided where appropriate.

           Returns two element list: 0 = message indicating whether selection was forced by the content model or
           chosen by user , 1 = element class name.

           Note:  If  user  makes  no selection, and content model forces none, an "undef" element class name is
           returned along with an informative message.

           When content model is exhausted the content flag -- $self->{children}->{complete} -- is set to true.

           The algorithm for this subroutine is the nastiest in the program.  I include  it  here  in  full  for
           future occasions when I may have to debug.

                   if no current child elements
                           set OUT_OF_CHILDREN = true
                   else
                           set OUT_OF_CHILDREN = false
                   endif

                   begin loop
                           if OUT_OF_CHILDREN == true
                                   switch require
                                           case +
                                                   if PREV != element
                                                           EXIT: mandatory element
                                                   else  # ( PREV_CHILD == element )
                                                           ASK: repeat element
                                                           if yes
                                                                   EXIT: chosen element
                                                           else  # ( no )
                                                                   if last element
                                                                           set children_full flag = true
                                                                           EXIT: END
                                                                   else  # ( not last element )
                                                                           advance element
                                                                   endif
                                                           endif
                                                   endif
                                           endcase
                                           case 1
                                                   if last element
                                                           set children_full flag = true
                                                   endif
                                                   EXIT: mandatory element
                                           endcase
                                           case ?
                                                   ASK: add element
                                                   if yes
                                                           EXIT: chosen element
                                                   else  # ( no repeat )
                                                           if last element
                                                                   set children_full flag = true
                                                                   EXIT: END
                                                           else  # ( not last element )
                                                                   advance element
                                                           endif
                                                   endif
                                           endcase
                                   endswitch
                           else  # ( OUT_OF_CHILDREN == false )
                                   if child == element
                                           switch require
                                                   case ? | 1
                                                           if last child
                                                                   if last element
                                                                           set children_full flag = true
                                                                           EXIT: END
                                                                   else  # ( not last element )
                                                                           advance element
                                                                           set OUT_OF_CHILDREN = true
                                                                   endif
                                                           else  # ( not last child )
                                                                   if last element
                                                                           ERROR: exhausted content model but got $child
                                                                   else  # ( not last element )
                                                                           advance element
                                                                           set PREV_CHILD = null
                                                                           advance child
                                                                   endif
                                                           endif
                                                   endcase
                                                   case +
                                                           if last child
                                                                   ASK: repeat element
                                                                   if yes
                                                                           EXIT: optional element
                                                                   else  # ( no repeat )
                                                                           if last element
                                                                                   set children_full flag = true
                                                                                   EXIT: END
                                                                           else  # ( not last element )
                                                                                   advance element
                                                                                   set OUT_OF_CHILDREN = true
                                                                           endif
                                                                   endif
                                                           else  # ( not last child )
                                                                   set PREV_CHILD = child
                                                                   advance child
                                                           endif
                                                   endcase
                                           endswitch
                                   else  # ( child != element )
                                           switch require
                                                   case +
                                                           if last element
                                                                   ERROR: expecting $element, got $child
                                                           else  # ( not last element )
                                                                   if PREV_CHILD == element
                                                                           set PREV_CHILD = null
                                                                           advance element
                                                                   else  # ( PREV_CHILD != element )
                                                                           ERROR: expecting $element, got $child
                                                                   endif
                                                           endif
                                                   endcase
                                                   case ?
                                                           if last element
                                                                   ERROR: content model exhausted, no match for $child
                                                           else  # ( not last element )
                                                                   advance element
                                                           endif
                                                   endcase
                                                   case 1
                                                           ERROR: expecting $element, got $child
                                                   endcase
                                           endswitch
                                   endif
                           endif
                   end loop

           Warning: In a number of places in this subroutine the program can "die".  This occurs when a mismatch
           between  the  child  element  model and the actual child elements is detected.  If the mismatch truly
           exists it is a coding error since the algorithm should force child  elements  to  match  the  content
           model.   If  the mismatch is not real the code has erred in analysing the data.  Either way, it is an
           unrecoverable error and the algorithm/code must be corrected.

       •   $el->list_selectable_children_noorder();

           Used when selecting child elements when following the unordered model.

           Returns a list of all optional elements available for  selection.   List  consists  of  all  elements
           attributes listed in 'optional' list minus all attributes already selected.

       •   $el->_build_element_help();

           Helper  method  for  method  "_select_next_child_noorder".  Takes as parameter a list of elements for
           which help screen is being built.

       •   $el->_select_next_child_noorder();

           The user selects optional child element to add.

           Helper method for 'select_next_child'.

           Returns two element list: 0 = message indicating whether selection was forced by the content model or
           chosen by user , 1 = element class name.

           Note: If user chooses to finish child element selection, "undef" element class name is returned along
           with an informative message.

           When child element selection is finished the content flag -- $self->{children}->{complete} -- is  set
           to true.

           Help is available.

           No option to exit until at least one element has been selected.

           Cannot select two "Separator" elements consecutively.

       •   $el->select_next_child();

           The user selects a child element to add.  Help is available.

           Returns two element list: 0 = text indicating whether mandatory or user choice ,
                                     1 = element class name.

           Note:  If  user  makes  no selection, and content model forces none, an "undef" element class name is
           returned along with an informative message.

           The algorithm for this subroutine is the nastiest in the program.  I include  it  here  in  full  for
           future occasions when I may have to debug.

       •   $el->is_copyable();

           Returns boolean indicating whether element can be copied.

           Based on value of $self->{copyable}.

       •   $el->copy();

           Attempts to copy element.  Returns either a reference to a copied element or an error message.

           Can test for success using "ref" function.

           Does  not  copy  attributes.   Attributes requiring user input during creation are not copyable (this
           includes Type_PubType, Role_UserDef, Role_Misc and Role_Link).

           Does not copy child elements.  For that, use the "duplicate" method.

       •   $el->has_attributes();

           Returns boolean indicating whether element has attributes.

       •   $el->has_children();

           Returns boolean indicating whether element has children.

       •   $el->_push_attribute();

           Adds attribute to element.

           Parameters: [ 0 = class ] , 1 = attribute object.

       •   $el->duplicate();

           Returns either a reference to a duplicate element or an error message.

           Copies all attributes, child elements and element content.

       •   $el->duplicate();

           Returns either a reference to a duplicate element or an error message.

           Copies all attributes, child elements and element content.

       •   $el->is_ordered_child_model();

           Returns boolean indicating nature of child element content model.

       •   $el->is_unordered_child_model();

           Returns boolean indicating nature of child element content model.

       •   $el->is_childless_model();

           Returns boolean indicating nature of child element content model.

       •   $el->get_last_parent();

           Return reference to last parent element.

           Parameters: [ 0 = class ] , 1 = originator flag (true if not originating element)

           Recursive algorithm:

                   if child elements
                           recurse last child (returns 'retval')
                           if 'retval' is element
                                   return 'retval'
                           else
                                   return self
                           endif
                   else
                           if recursed element
                                   return undef
                           else
                                   return self
                           endif
                   endif

       •   $el->get_last_element();

           Return reference to last element.

           Recursive algorithm:

                   if child elements
                           recurse last child (returns 'retval')
                           return 'retval'
                   else
                           return self
                   endif

       •   $el->delete_last_child();

           Delete last child of this element.

           Returns element.

       •   $el->delete_last_element();

           Delete last element.

           Return deleted element.

       •   $el->has_incomplete_descendent();

           Returns boolean indicating whether any descendent of element is incomplete.

       •   $el->get_last_incomplete();

           Return reference to last element in tree that is incomplete.

           Returns "undef" if all elements complete.

           Recursive algorithm:

                   if child elements
                           recurse last child (returns 'retval')
                           if 'retval' is element
                                   return 'retval'
                           endif
                   else
                           if not complete
                                   return self
                           else
                                   return undef
                           endif
                   endif

       •   $el->is_named();

           Returns boolean indicating whether element has display data member set to "name".

       •   $el->get_last_named();

           Return reference to last element in tree with display data member set to 'name'.

       •   $el->get_style_name();

           Finds StyleName element and returns element content.

           If unsuccessful, return "undef".

       •   $el->get_most_recent();

           Return reference to last element in tree of supplied element class.

           If no element found, return "undef".

       •   $el->reset_all_counters();

           Resets all role level counters

           Called by PubType, AuthorOnly, YearOnly and InTextDef during element creation.

       •   $el->named_in_summary();

           Boolean indicating whether to include element in summary.

       •   $el->content_in_summary();

           Boolean indicating whether to include raw element content in  summary.   Currently  only  applies  to
           SEPARATOR.

       •   $el->has_bracketing_child();

           Boolean indicating whether element has any child elements whose content will "bracket" this element's
           content in output.  Currently only applies to PRECEEDING and FOLLOWING.

       •   $el->generate_summary();

           Generates substantial portion of style summary.  Called by UI method 'write_summary'.

           Parameters: [ 0 = class ] , 1 = previous output.

           Returns: 0 = current output.

           Since  this  method  is  only  called on a complete style, we can make assumptions based on the style
           following the DTD.

           Recursive algorithm.

                   switch <element class>
                           case 'StyleName'
                                   add to output: style name
                           endcase
                           case 'RefStyle'
                                   add to output: header = "Bibliography Style"
                           endcase
                           case 'PubStyle'
                                   add to output: header giving publication type
                           endcase
                           case 'CitStyle'
                                   add to output: header = "Citation Style"
                           endcase
                           case 'InTextDef'
                                   add to output: header = Author and Year
                           endcase
                           case 'AuthorOnly'
                                   add to output: header = Author
                           endcase
                           case 'YearOnly'
                                   add to output: header = Year
                           endcase
                   endswitch
                   if summary flag == name
                           if bracketing child element(s)
                                   set bracket flag = true
                           endif
                           if bracket flag == true
                                   add to output: opening brackets
                           endif
                           if bracket flag == true
                                   if left bracketing element present
                                           print left bracketing element contents
                                   endif
                           endif
                           add to output: left marker
                           add to output: element name
                           repeat for all attributes
                                   if attribute summary flag == true
                                           add to output: attribute value (italicised)
                                   endif
                           endrepeat
                           add to output: right marker
                   endif
                   if have children
                           repeat for all children
                                   ** recurse (send output, receive output as 'retval')
                           endrepeat
                   endif
                   return output

   Elements: List of Classes
       To see a list of attribute classes  use  the  "document-dtd-entities"  utility  that  shipped  with  this
       program.   It extracts attribute and element properties from this script, assembles and formats them into
       a single html document.

       All elements descend from one of three ancestor classes depending on their content model:

       •   _Model_Childless

           Elements descended from this class have a content model specifying no children elements.

       •   _Model_Order

           Elements descended from this class have a content model of the general form:

                   ( element_A[?|+] , element_B[?|+] , ... )

       •   _Model_Noorder

           Elements descended from this class have a content model of the general form:

                   ( element_A | element_B , ... ) , element_X? )+

USER-INTERFACE CLASS

       This class holds the user-built bibliography style.

   UI: Public Interface
       UI: Data members

               %self = (

                       help  =>  {

                               <help topic>       =>  <help text> ,

                               ...

                       } ,

                       cache  =>  {

                               "element_class_A"  =>  element_A ,

                               "element_class_B"  =>  element_B ,

                               ...

                       } ,

                       root  =>  "undef" | element ,

                       filename  =>  undef | <filename>,

               )

       •   help

           Introductory help system.

           Is a hash consisting of <"help topic" : "help text"> pairs.

       •   cache

           Cache for frequently used elements.

           First hash key ("cachable") points to list of cachable elements.

           Second has key points to subsidiary hash which holds key:value pairs of element class names  and  the
           corresponding element.

       •   root

           Location of style's root element.

       •   style_file

           Name of style file.  Set after successful output.

       •   summary_file

           Name of summary file.  Set after successful output.

       UI: Constructors

               my $ui = UI->new();

       UI: Setters

               $ui->set_root( <element> );
               $ui->set_style_file( "<filename>" );
               $ui->set_summary_file( "<filename>" );

       UI: Getters

               $ui->get_help_topics();          # list:   keys   ( $self->{help} )
               $ui->get_help( "<topic>" );      # scalar: value  ( $self->{help}->{<topic>} )
                                                #         takes parameter: help topic
               $ui->get_cachable();             # list:   $self->{cache}->{cachable}
               $ui->get_cached();               # list:   defined( $self->{cache}->{elements} )
               $ui->get_cached_element( "<class>" );
                                                # object: cached element
               $ui->get_root();                 # object: root element
               $ui->get_style_file();           # scalar: style file filename
               $ui->get_summary_file();         # scalar: summary file filename

       UI: Other methods$ui->help_system();

           Runs help system -- a menu allowing the selection of a series of

       •   $ui->get_last_parent();

           Returns reference to last parent element.

       •   $ui->can_copy_recent();

           Returns booelan indicating whether element can copy recent version of itself.

           Parameters: [ 0 = class ] , 1 = element class | object

       •   $el->delete_selected_element();

           Gives the user the option of deleting element(s).

           Depending  on  the  state of the element tree, the user can delete the last element or the last major
           ("named") element.  A "named" element has its 'display' data member set to 'name' -- in general  they
           are the elements corresponding to ris fields.

           A  "complete"  element  has had all children added and its 'children->complete' data member is set to
           true ("1").

           Algorithm is:

                   get last named element
                   if element is complete
                           repeat until last named element is deleted
                                   delete last element
                           endrepeat
                   else
                           delete last element only
                   endif

       •   $ui->create_element();

           Creates element.  If element of class already exists, user can duplicate most recent.

       •   $ui->startup_checks();

           Currently checks for: write access to current directory.

       •   $ui->get_output_filename();

           Returns filename for output file.  Uses File::Temp module.

           If filename does not exist in current directory, simply return default.

           If it does, then user must select new filename.  File::Temp is used to provide a suggestion based  on
           the default filename.

           Requires  the  following  parameters:  [  0  = class ] , 1 = default filename , 2 = filename template
           pattern , 3 = filename template suffix , 4 = prompt.

           Parameters 2 and 3 are in the format required by File::Temp.  Parameter 2 must end in at leat 4  'X's
           --  these  will be replaced with random digits.  The suffix is the part of the filename following the
           part specified by parameter 2.  It is not restricted to a DOS-style three letter extension.

           Example: Default filename  (parameter  1)  =  'experimental-style.xml'.   Filename  template  pattern
           (parameter  2) = 'experimental-XXXX'.  Filename template suffix (parameter 3) = '-style.xml'.  Prompt
           (parameter 4) = 'Enter name for style file:'.

       •   $ui->write_style();

           Writes style to file.  Checks filename doesn't already exist.  If so, proposes alternative.

       •   $ui->write_summary();

           Writes style summary to file.  Checks filename doesn't already exist.  If so, proposes alternative.

       •   $ui->get_command_base();

           Gets base for refdba commands.  Involves checking for access  to  refdba.   Also  determines  whether
           username and password required.

           If succeeds, returns base command of the form:

                   refdba [-u <username> -w <password>] -C

           If fails, returns "undef".

       •   $ui->upload_style();

           Uploads style to refdb.  If style of same name already exists, attempt to save it to disk.

AUTHOR

       David Nebauer, david <at> nebauer <dot> org

COPYRIGHT AND LICENSE

       Copyright (C) 2004 by David Nebauer

       This   library   is   distributed   under  the  same  license  and  conditions  as  the  "RefDB"  project
       <<http://refdb.sourceforge.net/>>.

perl v5.14.2                                       2012-12-13                                     Makestyle(3pm)