A class representing part of an indexed symbol.
NaturalDocs:: | A class representing part of an indexed symbol. |
How IndexElements Work | This is a little tricky, so make sure you understand this. |
Implementation | |
Members | The class is implemented as a blessed arrayref. |
Modification Functions | |
New | Returns a new object. |
Merge | Adds another definition of the same symbol. |
Sort | Sorts the package and file lists of the symbol. |
MakeSortableSymbol | Generates SortableSymbol() and IgnoredPrefix(). |
Symbol | Returns the SymbolString without the package portion. |
Package | If HasMultiplePackages() is true, returns an arrayref of NaturalDocs::SymbolTable::IndexElement objects. |
File | If HasMultipleFiles() is true, returns an arrayref of NaturalDocs::SymbolTable::IndexElement objects. |
Type | Returns the TopicType of the package/symbol/file, if applicable. |
Prototype | Returns the prototype of the package/symbol/file, if applicable. |
Summary | Returns the summary of the package/symbol/file, if applicable. |
CombinedType | Returns the combined TopicType of the element. |
PackageSeparator | Returns the combined package separator symbol of the element. |
SortableSymbol | Returns the sortable symbol as a text string. |
IgnoredPrefix | Returns the part of the symbol that was stripped off to make the SortableSymbol(), or undef if none. |
HasMultiplePackages | Returns whether Packages() is broken out into more elements. |
HasMultipleFiles | Returns whether File() is broken out into more elements. |
Support Functions | |
MergeFile | Adds another definition of the same package/symbol. |
This is a little tricky, so make sure you understand this. Indexes are sorted by symbol, then packages, then file. If there is only one package for a symbol, or one file definition for a package/symbol, they are added inline to the entry. However, if there are multiple packages or files, the function for it returns an arrayref of IndexElements instead. Which members are defined and undefined should follow common sense. For example, if a symbol is defined in multiple packages, the symbol’s IndexElement will not define File(), Type(), or Prototype(); those will be defined in child elements. Similarly, the child elements will not define Symbol() since it’s redundant.
Diagrams may be clearer. If a member isn’t listed for an element, it isn’t defined.
[Element] - Symbol - Package - File - Type - Prototype - Summary
[Element] - Symbol - Package [Element] - Package - File - Type - Prototype - Summary [Element] - ...
A symbol that is defined by one package, but has multiple files
[Element] - Symbol - Package - File [Element] - File - Type - Protype - Summary [Element] - ...
[Element] - Symbol - Package [Element] - Package - File [Element] - File - Type - Prototype - Summary [Element] - ... [Element] - ...
Because it makes it easier to generate nice indexes since all the splitting and combining is done for you. If a symbol has only one package, you just want to link to it, you don’t want to break out a subindex for just one package. However, if it has multiple package, you do want the subindex and to link to each one individually. Use HasMultiplePackages() and HasMultipleFiles() to determine whether you need to add a subindex for it.
All IndexElements also have combining properties set.
CombinedType | The general TopicType of the entry. Conflicts combine into TOPIC_GENERAL. |
PackageSeparator | The package separator symbol of the entry. Conflicts combine into a dot. |
So if an IndexElement only has one definition, CombinedType() is the same as the TopicType and PackageSeparator() is that of the definition’s language. If other definitions are added and they have the same properties, the combined properties will remain the same. However, if they’re different, they switch values as noted above.
SortableSymbol() is a pseudo-combining property. There were a few options for dealing with multiple languages defining the same symbol but stripping different prefixes off it, but ultimately I decided to go with whatever the language does that has the most definitions. There’s not likely to be many conflicts here in the real world; probably the only thing would be defining it in a text file and forgetting to specify the prefixes to strip there too. So this works.
Ties are broken pretty much randomly, except that text files always lose if its one of the options.
It’s a pseudo-combining property because it’s done after the IndexElements are all filled in and only stored in the top-level ones.
The class is implemented as a blessed arrayref. The following constants are its members.
SYMBOL | The SymbolString without the package portion. |
PACKAGE | The package SymbolString. Will be a package SymbolString, undef for global, or an arrayref of NaturalDocs::SymbolTable::IndexElement objects if multiple packages define the symbol. |
FILE | The FileName the package/symbol is defined in. Will be the file name or an arrayref of NaturalDocs::SymbolTable::IndexElements if multiple files define the package/symbol. |
TYPE | The package/symbol/file TopicType. |
PROTOTYPE | The package/symbol/file prototype, or undef if not applicable. |
SUMMARY | The package/symbol/file summary, or undef if not applicable. |
COMBINED_TYPE | The combined TopicType of the element. |
PACKAGE_SEPARATOR | The combined package separator symbol of the element. |
SORTABLE_SYMBOL | The sortable symbol as a text string. |
IGNORED_PREFIX | The part of the symbol that was stripped off to make the sortable symbol. |
sub New #( symbol, package, file, type, prototype, summary, combinedType, packageSeparator )
Returns a new object.
This should only be used for creating an entirely new symbol. You should not pass arrayrefs as package or file parameters if you are calling this externally. Use Merge() instead.
symbol | The SymbolString without the package portion. |
package | The package SymbolString, or undef for global. |
file | The symbol’s definition file. |
type | The symbol’s TopicType. |
prototype | The symbol’s prototype, if applicable. |
summary | The symbol’s summary, if applicable. |
These parameters don’t need to be specified. You should ignore them when calling this externally.
combinedType | The symbol’s combined TopicType. |
packageSeparator | The symbol’s combined package separator symbol. |
sub Merge #( package, file, type, prototype, summary )
Adds another definition of the same symbol. Perhaps it has a different package or defining file.
package | The package SymbolString, or undef for global. |
file | The symbol’s definition file. |
type | The symbol’s TopicType. |
prototype | The symbol’s protoype if applicable. |
summary | The symbol’s summary if applicable. |
sub MakeSortableSymbol
Generates SortableSymbol() and IgnoredPrefix(). Should only be called after everything is merged.
Returns the SymbolString without the package portion.
sub HasMultiplePackages
If HasMultiplePackages() is true, returns an arrayref of NaturalDocs::SymbolTable::IndexElement objects. Otherwise returns the package SymbolString, or undef if global.
sub HasMultipleFiles
If HasMultipleFiles() is true, returns an arrayref of NaturalDocs::SymbolTable::IndexElement objects. Otherwise returns the name of the definition file.
Returns the TopicType of the package/symbol/file, if applicable.
Returns the combined TopicType of the element.
Returns the sortable symbol as a text string. Only available after calling MakeSortableSymbol().
Returns the part of the symbol that was stripped off to make the SortableSymbol(), or undef if none. Only available after calling MakeSortableSymbol().
Returns whether Packages() is broken out into more elements.
Returns whether File() is broken out into more elements.
sub MergeFile #( file, type, prototype, summary )
Adds another definition of the same package/symbol. Perhaps the file is different.
file | The package/symbol’s definition file. |
type | The package/symbol’s TopicType. |
prototype | The package/symbol’s protoype if applicable. |
summary | The package/symbol’s summary if applicable. |
Returns a new object.
sub New #( symbol, package, file, type, prototype, summary, combinedType, packageSeparator )
Adds another definition of the same symbol.
sub Merge #( package, file, type, prototype, summary )
Sorts the package and file lists of the symbol.
sub Sort
Generates SortableSymbol() and IgnoredPrefix().
sub MakeSortableSymbol
If HasMultiplePackages() is true, returns an arrayref of NaturalDocs::SymbolTable::IndexElement objects.
sub HasMultiplePackages
If HasMultipleFiles() is true, returns an arrayref of NaturalDocs::SymbolTable::IndexElement objects.
sub HasMultipleFiles
Adds another definition of the same package/symbol.
sub MergeFile #( file, type, prototype, summary )