HTML-LinkList-0.1701000755001750001751 012641340604 12617 5ustar00katkat000000000000README100644001750001751 6155312641340604 13612 0ustar00katkat000000000000HTML-LinkList-0.1701NAME HTML::LinkList - Create a 'smart' list of HTML links. SYNOPSIS use HTML::LinkList qw(link_list); # default formatting my $html_links = link_list(current_url=>$url, urls=>\@links_in_order, labels=>\%labels, descriptions=>\%desc); # paragraph with ' :: ' separators my $html_links = link_list(current_url=>$url, urls=>\@links_in_order, labels=>\%labels, descriptions=>\%desc, links_head=>'

', links_foot=>'

', pre_item=>'', post_item=>'' pre_active_item=>'', post_active_item=>'', item_sep=>" :: "); # multi-level list my $html_links = link_tree( current_url=>$url, link_tree=>\@list_of_lists, labels=>\%labels, descriptions=>\%desc); DESCRIPTION This module contains a number of functions for taking sets of URLs and labels and creating suitably formatted HTML. These links are "smart" because, if given the url of the current page, if any of the links in the list equal it, that item in the list will be formatted as a special label, not as a link; this is a Good Thing, since the user would be confused by clicking on a link back to the current page. While many website systems have plugins for "smart" navbars, they are specialized for that system only, and can't be reused elsewhere, forcing people to reinvent the wheel. I hereby present one wheel, free to be reused by anybody; just the simple functions, a backend, which can be plugged into whatever system you want. The default format for the HTML is to make an unordered list, but there are many options, enabling one to have a flatter layout with any separators you desire, or a more complicated list with differing formats for different levels. The "link_list" function uses a simple list of links -- good for a simple navbar. The "link_tree" function takes a set of nested links and makes the HTML for them -- good for making a table of contents, or a more complicated navbar. The "full_tree" function takes a list of paths and makes a full tree of all the pages and index-pages in those paths -- good for making a site map. The "breadcrumb_trail" function takes a url and makes a "breadcrumb trail" from it. The "nav_tree" function creates a set of nested links to be used as a multi-level navbar; one can give it a list of paths (as for full_tree) and it will only show the links related to the current URL. FUNCTIONS To export a function, add it to the 'use' call. use HTML::LinkList qw(link_list); To export all functions do: use HTML::LinkList ':all'; link_list $links = link_list( current_url=>$url, urls=>\@links_in_order, labels=>\%labels, descriptions=>\%desc, pre_desc=>' ', post_desc=>'', links_head=>'', pre_item=>'
  • ', post_item=>'
  • ' pre_active_item=>'', post_active_item=>'', item_sep=>"\n"); Generates a simple list of links, from list of urls (and optional labels) taking into account of the "current" URL. This provides a large number of options to customize the appearance of the list. The default setup is for a simple UL list, but setting the options can enable you to make it something other than a list altogether, or add in CSS styles or classes to make it look just like you want. Required: urls The urls in the order you want them displayed. If this list is empty, then nothing will be generated. Options: current_url The link to the current page. If one of the links equals this, then that is deemed to be the "active" link and is just displayed as a label rather than a link. descriptions Optional hash of descriptions, to put next to the links. The keys of this hash are the urls. hide_ext If a site is hiding link extensions (such as using MultiViews with Apache) you may wish to hide the extensions (while using the full URLs to check various things). (default: 0 (false)) item_sep String to put between items. labels A hash whose keys are links and whose values are labels. These are the labels for the links; if no label is given, then the last part of the link is used for the label, with some formatting. links_head String to begin the list with. links_foot String to end the list with. pre_desc String to prepend to each description. post_desc String to append to each description. pre_item String to prepend to each item. post_item String to append to each item. pre_active_item An additional string to put in front of each "active" item, after pre_item. The "active" item is the link which matches 'current_url'. pre_item_active INSTEAD of the "pre_item" string, use this string for active items post_active_item An additional string to append to each active item, before post_item. prefix_url A prefix to prepend to all the links. (default: empty string) link_tree $links = link_tree( current_url=>$url, link_tree=>\@list_of_lists, labels=>\%labels, descriptions=>\%desc, pre_desc=>' ', post_desc=>'', links_head=>'', subtree_head=>'', pre_item=>'
  • ', post_item=>'
  • ' pre_active_item=>'', post_active_item=>'', item_sep=>"\n", tree_sep=>"\n", formats=>\%formats); Generates nested lists of links from a list of lists of links. This is useful for things such as table-of-contents or site maps. By default, this will return UL lists, but this is highly configurable. Required: link_tree A list of lists of urls, in the order you want them displayed. If a url is not in this list, it will not be displayed. Options: current_url The link to the current page. If one of the links equals this, then that is deemed to be the "active" link and is just displayed as a label rather than a link. descriptions Optional hash of descriptions, to put next to the links. The keys of this hash are the urls. exclude_root_parent If this is true, then the "current_parent" display options are not used for the "root" ("/") path, it isn't counted as a "parent" of the current_url. formats A reference to a hash containing advanced format settings. For example: my %formats = ( # level 1 and onwards '1' => { tree_head=>"
      ", tree_foot=>"
    \n", }, # level 2 and onwards '2' => { tree_head=>"\n", }, # level 3 and onwards '3' => { pre_item=>'(', post_item=>')', item_sep=>",\n", tree_sep=>' -> ', tree_head=>"
    \n", tree_foot=>"", } ); The formats hash enables you to control the formatting on a per-level basis. Each key of the hash corresponds to a level-number; the sub-hashes contain format arguments which will apply from that level onwards. If an argument isn't given in the sub-hash, then it will fall back to the previous level (or to the default, if there is no setting for that format-argument for a previous level). The only difference between the names of the arguments in the sub-hash and in the global format arguments is that instead of 'subtree_head' and subtree_foot' it uses 'tree_head' and 'tree_foot'. hide_ext If a site is hiding link extensions (such as using MultiViews with Apache) you may wish to hide the extensions (while using the full URLs to check various things). (default: 0 (false)) item_sep The string to separate each item. labels A hash whose keys are links and whose values are labels. These are the labels for the links; if no label is given, then the last part of the link is used for the label, with some formatting. links_head The string to prepend the top-level tree with. (default: ) pre_desc String to prepend to each description. post_desc String to append to each description. pre_item String to prepend to each item. (default:
  • ) post_item String to append to each item. (default:
  • ) pre_active_item An additional string to put in front of each "active" item, after pre_item. The "active" item is the link which matches 'current_url'. (default: ) pre_item_active INSTEAD of the "pre_item" string, use this string for active items post_active_item An additional string to append to each active item, before post_item. (default: ) pre_current_parent An additional string to put in front of a link which is a parent of the 'current_url' link, after pre_item. pre_item_current_parent INSTEAD of the "pre_item" string, use this for links which are parents of the 'current_url' link. post_current_parent An additional string to append to a link which is a parent of the 'current_url' link, before post_item. prefix_url A prefix to prepend to all the links. (default: empty string) subtree_head The string to prepend to lower-level trees. (default: ) tree_sep The string to separate each tree. full_tree $links = full_tree( paths=>\@list_of_paths, labels=>\%labels, descriptions=>\%desc, hide=>$hide_regex, nohide=>$nohide_regex, start_depth=>0, end_depth=>0, top_level=>0, preserve_order=>0, preserve_paths=>0, ... ); Given a set of paths this will generate a tree of links in the style of link_tree. This will figure out all the intermediate paths and construct the nested structure for you, clustering parents and children together. The formatting options are as for "link_tree". Required: paths A reference to a list of paths: that is, URLs relative to the top of the site. For example, if the full URL is http://www.example.com/foo.html then the path is /foo.html If the full URL is http://www.example.com/~frednurk/foo.html then the path is /foo.html This does not require that every possible path be given; all the intermediate paths will be figured out from the list. Options: append_list Array of paths to append to the top-level links. They are used as-is, and are not part of the processing done to the "paths" list of paths. (see "prepend_list") descriptions Optional hash of descriptions, to put next to the links. The keys of this hash are the paths. end_depth End your tree at this depth. If zero, then go all the way. (see "start_depth") exclude_root_parent If this is true, then the "current_parent" display options are not used for the "root" ("/") path, it isn't counted as a "parent" of the current_url. hide If the path matches this string, don't include it in the tree. hide_ext If a site is hiding link extensions (such as using MultiViews with Apache) you may wish to hide the extensions (while using the full URLs to check various things). (default: 0 (false)) labels Hash containing replacement labels for one or more paths. If no label is given for '/' (the root path) then 'Home' will be used. last_subtree_head The string to prepend to the last lower-level tree. Only used if end_depth is not zero. last_subtree_foot The string to append to the last lower-level tree. Only used if end_depth is not zero. nohide If the path matches this string, it will be included even if it matches the 'hide' string. prefix_url A prefix to prepend to all the links. (default: empty string) prepend_list Array of paths to prepend to the top-level links. They are used as-is, and are not part of the processing done to the "paths" list of paths. preserve_order Preserve the ordering of the paths in the input list of paths; otherwise the links will be sorted alphabetically. Note that if preserve_order is true, the structure is at the whims of the order of the original list of paths, and so could end up odd-looking. (default: false) preserve_paths Do not extract intermediate paths or reorder the input list of paths. This speeds things up, but assumes that the input paths are complete and in good order. (default: false) start_depth Start your tree at this depth. Zero is the root, level 1 is the files/sub-folders in the root, and so on. (default: 0) top_level Decide which level is the "top" level. Useful when you set the start_depth to something greater than 1. breadcrumb_trail $links = breadcrumb_trail( current_url=>$url, labels=>\%labels, descriptions=>\%desc, links_head=>'

    ', links_foot=>"\n

    ", subtree_head=>'', subtree_foot=>"\n", pre_item=>'', post_item=>'', pre_active_item=>'', post_active_item=>'', item_sep=>"\n", tree_sep=>' > ', ... ); Given the current url, make a breadcrumb trail from it. By default, this is laid out with '>' separators, but it can be set up to give a nested set of UL lists (as for "full_tree"). The formatting options are as for "link_tree". Required: current_url The current url to be made into a breadcrumb-trail. Options: descriptions Optional hash of descriptions, to put next to the links. The keys of this hash are the urls. exclude_root_parent If this is true, then the "current_parent" display options are not used for the "root" ("/") path, it isn't counted as a "parent" of the current_url. hide_ext If a site is hiding link extensions (such as using MultiViews with Apache) you may wish to hide the extensions (while using the full URLs to check various things). (default: 0 (false)) labels Hash containing replacement labels for one or more URLS. If no label is given for '/' (the root path) then 'Home' will be used. nav_tree $links = nav_tree( paths=>\@list_of_paths, labels=>\%labels, current_url=>$url, hide=>$hide_regex, nohide=>$nohide_regex, preserve_order=>1, descriptions=>\%desc, ... ); This takes a list of links, and the current URL, and makes a nested navigation tree, consisting of (a) the top-level links (b) the links leading to the current URL (c) the links on the same level as the current URL, (d) the related links just above this level, depending on whether this is an index-page or a content page. Optionally one can hide links which match match the 'hide' option. The formatting options are as for "link_tree", with some additions. Required: current_url The link to the current page. If one of the links equals this, then that is deemed to be the "active" link and is just displayed as a label rather than a link. This is also used to determine which links to show and which ones to filter out. paths A reference to a list of paths: that is, URLs relative to the top of the site. For example, if the full URL is http://www.example.com/foo.html then the path is /foo.html This does not require that every possible path be given; all the intermediate paths will be figured out from the list. Options: append_list Array of paths to append to the top-level links. They are used as-is, and are not part of the processing done to the "paths" list of paths. (see "prepend_list") descriptions Optional hash of descriptions, to put next to the links. The keys of this hash are the paths. end_depth End your tree at this depth. If zero, then go all the way. By default this is set to the depth of the current_url. exclude_root_parent If this is true, then the "current_parent" display options are not used for the "root" ("/") path, it isn't counted as a "parent" of the current_url. hide If a path matches this string, don't include it in the tree. hide_ext If a site is hiding link extensions (such as using MultiViews with Apache) you may wish to hide the extensions (while using the full URLs to check various things). (default: 0 (false)) labels Hash containing replacement labels for one or more paths. If no label is given for '/' (the root path) then 'Home' will be used. last_subtree_head The string to prepend to the last lower-level tree. last_subtree_foot The string to append to the last lower-level tree. nohide If the path matches this string, it will be included even if it matches the 'hide' string. prefix_url A prefix to prepend to all the links. (default: empty string) prepend_list Array of paths to prepend to the top-level links. They are used as-is, and are not part of the processing done to the "paths" list of paths. preserve_order Preserve the ordering of the paths in the input list of paths; otherwise the links will be sorted alphabetically. (default: true) preserve_paths Do not extract intermediate paths or reorder the input list of paths. This speeds things up, but assumes that the input paths are complete and in good order. (default: false) start_depth Start your tree at this depth. Zero is the root, level 1 is the files/sub-folders in the root, and so on. (default: 1) top_level Decide which level is the "top" level. Useful when you set the start_depth to something greater than 1. Private Functions These functions cannot be exported. make_item $item = make_item( this_label=>$label, this_link=>$link, hide_ext=>0, current_url=>$url, current_parents=>\%current_parents, descriptions=>\%desc, format=>\%format, ); %format = ( pre_desc=>' ', post_desc=>'', pre_item=>'
  • ', post_item=>'
  • ' pre_active_item=>'', post_active_item=>'', pre_current_parent=>'', post_current_parent=>'', item_sep=>"\n"); ); Format a link item. See "link_list" for the formatting options. this_label The label of the required link. If there is no label, this uses the base-name of the last part of the link, capitalizing it and replacing underscores and dashes with spaces. this_link The URL of the required link. current_url The link to the current page. If one of the links equals this, then that is deemed to be the "active" link and is just displayed as a label rather than a link. current_parents URLs of the parents of the current item. descriptions Optional hash of descriptions, to put next to the links. The keys of this hash are the links (not the labels). defer_post_item Don't add the 'post_item' string if this is true. (needed for nested lists) (default: false) no_link Don't make a link for this, just a label. make_canonical my $new_url = make_canonical($url); Make a URL canonical; remove the 'index.*' and add on a needed '/' -- this assumes that directory names never have a '.' in them. get_index_path my $new_url = get_index_path($url); Get the "index" part of this path. That is, if this path is not for an index-page, then get the parent index-page path for this path. (Removes the trailing slash). get_index_parent my $new_url = get_index_parent($url); Get the parent of the "index" part of this path. (Removes the trailing slash). path_depth my $depth = path_depth($url); Calculate the "depth" of the given path. link_is_active if (link_is_active(this_link=>$link, current_url=>$url)) ... Check if the given link is "active", that is, if it matches the 'current_url'. traverse_lol $links = traverse_lol(\@list_of_lists, labels=>\%labels, tree_depth=>$depth current_format=>\%format, ... ); Traverse the list of lists (of urls) to produce a nested collection of links. This consumes the list_of_lists! extract_all_paths my @all_paths = extract_all_paths(paths=>\@paths, preserve_order=>0); Extract all possible paths out of a list of paths. Thus, if one has /foo/bar/baz.html then that would make / /foo/ /foo/bar/ /foo/bar/baz.html If 'preserve_order' is true, this preserves the ordering of the paths in the input list; otherwise the output paths are sorted alphabetically. extract_current_parents my %current_parents = extract_current_parents(current_url=>$url, exclude_root_parent=>0); Extract the "parent" paths of the current url /foo/bar/baz.html then that would make / /foo/ /foo/bar/ If 'exclude_root_parent' is true, then the '/' is excluded from the list of parents. build_lol my @lol = build_lol( paths=>\@paths, current_url=>$url, navbar_type=>'', ); Build a list of lists of paths, given a simple list of paths. Assumes that this list has already been filtered. paths Reference to list of paths; this is consumed. filter_out_paths my @filtered_paths = filter_out_paths( paths=>\@paths, current_url=>$url, hide=>$hide, nohide=>$nohide, start_depth=>$start_depth, end_depth=>$end_depth, top_level=>$top_level, navbar_type=>'', ); Filter out the paths we don't want from our list of paths. Returns a list of the paths we want. make_default_format my %default_format = make_default_format(%args); Make the default format hash from the args. Returns a hash of format options. make_extra_formats my %formats = make_extra_formats(%args); Transforms the subtree_head and subtree_foot into the "formats" method of formatting. Returns a hash of hashes of format options. REQUIRES Test::More INSTALLATION To install this module, run the following commands: perl Build.PL ./Build ./Build test ./Build install Or, if you're on a platform (like DOS or Windows) that doesn't like the "./" notation, you can do this: perl Build.PL perl Build perl Build test perl Build install In order to install somewhere other than the default, such as in a directory under your home directory, like "/home/fred/perl" go perl Build.PL --install_base /home/fred/perl as the first step instead. This will install the files underneath /home/fred/perl. You will then need to make sure that you alter the PERL5LIB variable to find the modules. Therefore you will need to change the PERL5LIB variable to add /home/fred/perl/lib PERL5LIB=/home/fred/perl/lib:${PERL5LIB} SEE ALSO perl(1). BUGS Please report any bugs or feature requests to the author. AUTHOR Kathryn Andersen (RUBYKAT) perlkat AT katspace dot com http://www.katspace.com/tools/html_linklist/ COPYRIGHT AND LICENCE Copyright (c) 2006 by Kathryn Andersen This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. LICENSE100644001750001751 4367112641340604 13740 0ustar00katkat000000000000HTML-LinkList-0.1701This software is copyright (c) 2016 by Kathryn Andersen. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. Terms of the Perl programming language system itself a) the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version, or b) the "Artistic License" --- The GNU General Public License, Version 1, February 1989 --- This software is Copyright (c) 2016 by Kathryn Andersen. This is free software, licensed under: The GNU General Public License, Version 1, February 1989 GNU GENERAL PUBLIC LICENSE Version 1, February 1989 Copyright (C) 1989 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The license agreements of most software companies try to keep users at the mercy of those companies. By contrast, our General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. The General Public License applies to the Free Software Foundation's software and to any other program whose authors commit to using it. You can use it for your programs, too. When we speak of free software, we are referring to freedom, not price. Specifically, the General Public License is designed to make sure that you have the freedom to give away or sell copies of free software, that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of a such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must tell them their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any work containing the Program or a portion of it, either verbatim or with modifications. Each licensee is addressed as "you". 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this General Public License and to the absence of any warranty; and give any other recipients of the Program a copy of this General Public License along with the Program. You may charge a fee for the physical act of transferring a copy. 2. You may modify your copy or copies of the Program or any portion of it, and copy and distribute such modifications under the terms of Paragraph 1 above, provided that you also do the following: a) cause the modified files to carry prominent notices stating that you changed the files and the date of any change; and b) cause the whole of any work that you distribute or publish, that in whole or in part contains the Program or any part thereof, either with or without modifications, to be licensed at no charge to all third parties under the terms of this General Public License (except that you may choose to grant warranty protection to some or all third parties, at your option). c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the simplest and most usual way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this General Public License. d) You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. Mere aggregation of another independent work with the Program (or its derivative) on a volume of a storage or distribution medium does not bring the other work under the scope of these terms. 3. You may copy and distribute the Program (or a portion or derivative of it, under Paragraph 2) in object code or executable form under the terms of Paragraphs 1 and 2 above provided that you also do one of the following: a) accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Paragraphs 1 and 2 above; or, b) accompany it with a written offer, valid for at least three years, to give any third party free (except for a nominal charge for the cost of distribution) a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Paragraphs 1 and 2 above; or, c) accompany it with the information you received as to where the corresponding source code may be obtained. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form alone.) Source code for a work means the preferred form of the work for making modifications to it. For an executable file, complete source code means all the source code for all modules it contains; but, as a special exception, it need not include source code for modules which are standard libraries that accompany the operating system on which the executable file runs, or for standard header files or definitions files that accompany that operating system. 4. You may not copy, modify, sublicense, distribute or transfer the Program except as expressly provided under this General Public License. Any attempt otherwise to copy, modify, sublicense, distribute or transfer the Program is void, and will automatically terminate your rights to use the Program under this License. However, parties who have received copies, or rights to use copies, from you under this General Public License will not have their licenses terminated so long as such parties remain in full compliance. 5. By copying, distributing or modifying the Program (or any work based on the Program) you indicate your acceptance of this license to do so, and all its terms and conditions. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. 7. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of the license which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the license, you may choose any version ever published by the Free Software Foundation. 8. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to humanity, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19xx name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (a program to direct compilers to make passes at assemblers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice That's all there is to it! --- The Artistic License 1.0 --- This software is Copyright (c) 2016 by Kathryn Andersen. This is free software, licensed under: The Artistic License 1.0 The Artistic License Preamble The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. Definitions: - "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. - "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder. - "Copyright Holder" is whoever is named in the copyright or copyrights for the package. - "You" is you, if you're thinking about copying or distributing this Package. - "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) - "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. 1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. 3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as ftp.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. b) use the modified Package only within your corporation or organization. c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. d) make other distribution arrangements with the Copyright Holder. 4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. b) accompany the distribution with the machine-readable source of the Package with your modifications. c) accompany any non-standard executables with their corresponding Standard Version executables, giving the non-standard executables non-standard names, and clearly documenting the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. d) make other distribution arrangements with the Copyright Holder. 5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. 6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this Package. 7. C or perl subroutines supplied by you and linked into this Package shall not be considered part of this Package. 8. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. 9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. The End Changes100644001750001751 261412641340604 14176 0ustar00katkat000000000000HTML-LinkList-0.1701Revision History for HTML-LinkList ================================== v0.1701 2016-01-01 ------------------ * 2016-01-01 10:58:19 +1100 tweaking dist.ini * 2015-05-05 11:14:32 +1000 Dist::Zilla stuff. * 2015-05-05 11:11:09 +1000 version bump * 2015-05-05 11:08:35 +1000 Fixing some compatibility Dist::Zilla stuff. * 2013-09-14 11:49:20 +1000 added [ReportVersions::Tiny] * 2012-02-06 00:32:05 +1100 added a ConfirmRelease test * 2011-02-21 16:57:32 +1100 Disabled Progressive Critic tests. * 2011-02-21 16:37:27 +1100 Fixed Dist::Zilla version setting. * 2011-02-21 16:34:11 +1100 Tweaking Dist::Zilla config. * 2011-02-21 16:30:46 +1100 Changing build system over to Dist::Zilla. * 2011-02-21 13:09:53 +1100 fixed warnings * 2011-02-21 13:07:33 +1100 Links with Mixed Caps, don't decase the labels. * 2011-02-18 13:18:59 +1100 New formatting options: pre_item_active + pre_item_current_parent * 2010-07-02 19:48:46 +1000 updated MANIFEST.SKIP for git * 2010-02-26 16:52:36 +1100 removed nofilter_paths option * 2010-02-26 16:50:33 +1100 Improved algorithm for deeper nested navbars * 2010-01-04 12:54:58 +1100 not a released version * 2010-01-04 12:54:34 +1100 added nofilter_paths option * 2009-12-16 17:01:27 +1100 Slight speed improvements; also added .gitignore ==================================== End of changes in the last 1000 days ==================================== META.yml100644001750001751 132512641340604 14152 0ustar00katkat000000000000HTML-LinkList-0.1701--- abstract: "Create a 'smart' list of HTML links." author: - 'Kathryn Andersen' build_requires: ExtUtils::MakeMaker: '0' File::Spec: '0' IO::Handle: '0' IPC::Open3: '0' Module::Build: '0.28' Test::More: '0' perl: '5.006' configure_requires: Module::Build: '0.28' dynamic_config: 0 generated_by: 'Dist::Zilla version 5.036, CPAN::Meta::Converter version 2.143240' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: HTML-LinkList requires: Data::Dumper: '0' Exporter: '0' strict: '0' warnings: '0' resources: homepage: https://github.com/rubykat/HTML-LinkList repository: https://github.com/rubykat/HTML-LinkList.git version: '0.1701' Build.PL100644001750001751 246312641340604 14201 0ustar00katkat000000000000HTML-LinkList-0.1701 # This file was automatically generated by Dist::Zilla::Plugin::ModuleBuild v5.036. use strict; use warnings; use Module::Build 0.28; my %module_build_args = ( "build_requires" => { "Module::Build" => "0.28" }, "configure_requires" => { "Module::Build" => "0.28" }, "dist_abstract" => "Create a 'smart' list of HTML links.", "dist_author" => [ "Kathryn Andersen" ], "dist_name" => "HTML-LinkList", "dist_version" => "0.1701", "license" => "perl", "module_name" => "HTML::LinkList", "recommends" => {}, "recursive_test_files" => 1, "requires" => { "Data::Dumper" => 0, "Exporter" => 0, "strict" => 0, "warnings" => 0 }, "script_files" => [], "test_requires" => { "ExtUtils::MakeMaker" => 0, "File::Spec" => 0, "IO::Handle" => 0, "IPC::Open3" => 0, "Test::More" => 0, "perl" => "5.006" } ); my %fallback_build_requires = ( "ExtUtils::MakeMaker" => 0, "File::Spec" => 0, "IO::Handle" => 0, "IPC::Open3" => 0, "Module::Build" => "0.28", "Test::More" => 0, "perl" => "5.006" ); unless ( eval { Module::Build->VERSION(0.4004) } ) { delete $module_build_args{test_requires}; $module_build_args{build_requires} = \%fallback_build_requires; } my $build = Module::Build->new(%module_build_args); $build->create_build_script; MANIFEST100644001750001751 71112641340604 14010 0ustar00katkat000000000000HTML-LinkList-0.1701# This file was automatically generated by Dist::Zilla::Plugin::Manifest v5.036. Build.PL Changes LICENSE MANIFEST MANIFEST.SKIP META.yml OldChanges README README.mkdn lib/HTML/LinkList.pm t/00-compile.t t/00-report-prereqs.dd t/00-report-prereqs.t t/10_link_list.t t/20_link_tree.t t/30_full_tree.t t/40_breadcrumb_trail.t t/50_nav_tree.t t/release-distmeta.t t/release-has-version.t t/release-pod-coverage.t t/release-pod-syntax.t t/release-portability.t OldChanges100644001750001751 1423612641340604 14660 0ustar00katkat000000000000HTML-LinkList-0.1701Revision history for HTML-LinkList ================================== 0.1503 Sun 07 September 2008 ---------------------------- * (2008-09-07) A few tweaks with TODO and Changes. 0.1502 Sun 07 September 2008 ---------------------------- * (2008-09-07) Make the Build make a traditional Makefile.PL * (2008-09-07) Tweak to improve prettifying links. 0.1501 Sat 26 May 2007 ---------------------- * (26 May 2007) fix formats Fixed a bug in the advanced formats stuff. 0.15 Tue 22 May 2007 -------------------- * (22 May 2007) advanced formats Added "formats" option for advanced formatting. 0.14 Sat 19 May 2007 -------------------- * (19 May 2007) uneven lists Enable this to deal with lists of lists where the first item isn't a normal item, but a sub-list, but the next item is a normal item. 0.13 Mon 11 September 2006 -------------------------- * (11 Sep 2006) hide_ext Added the 'hide_ext' option, to hide extensions of files in links (useful for MultiViews sites). 0.12 Tue 23 May 2006 -------------------- * (23 May 2006) description improvements Added 'pre_desc' and 'post_desc' options to enable one to put a string before and after the descriptions. 0.11 Thu 20 April 2006 ---------------------- * (20 Apr 2006) preserve_paths option Added the 'preserve_paths' option; if this is true, then the input paths are not sorted, nor do they have intermediate paths extracted. This speeds things up slightly, and can be useful if you already have a full list of paths and don't need to do that processing on it again. 0.1002 Mon 17 April 2006 ------------------------ * (17 Apr 2006) navbar fix If there are paths that are too similar, such as one subdir in a directory being called "foo", and another called "foobar", then it would pick up the foobar stuff in foo when it shouldn't. 0.1001 Thu 13 April 2006 ------------------------ * (12 Apr 2006) fixed nohide bug The 'nohide' option was being ignored in some circumstances. 0.10 Sat 01 April 2006 ---------------------- * (1 Apr 2006) breadcrumb-navbar Added a hybrid breadcrumb-navbar: nav_tree(navbar_type=>'breadcrumb') which starts off like a breadcrumb-trail, showing the parent(s) of the current URL, but also showing the current level, not just the current URL. Useful in situations where you don't want a full-blown navigation tree. 0.09 Thu 16 March 2006 ---------------------- * (16 Mar 2006) documentation tweaking * (16 Mar 2006) exclude_root_parent Added the 'exclude_root_parent' option, which excludes the root "/" path from being counted as a "parent" to the current_url when using the 'pre_current_parent' and 'post_current_parent' options. This can be useful if you want to use those options but don't want the root/Home link to be displayed differently. * (16 Mar 2006) prepend_list and append_list Added new options (to 'full_tree', 'nav_tree') 'prepend_list' and 'append_list' which enable you to prepend or append a list of links to be added to your "top level" as-is. * (16 Mar 2006) removed nav_bar Removed the 'nav_bar' function because it was horrible and made yucky navbars. With use of CSS and choice of levels and separators, the 'nav_tree' should be sufficient, since while the UL list is the default, it can be set up to use paragraphs and so on. 0.08 Thu 16 February 2006 ------------------------- * (16 Feb 2006) top_level option Added a new 'top_level' option, useful for starting a navigation tree further down its hierarchy. 0.07 Thu 02 February 2006 ------------------------- * (2 Feb 2006) depth fixes - enabled start_depth and end_depth to be changed for nav_tree without wierdness happening. It used to be that end_depth was ignored, and if start_depth was anything other than 1, one would get too many links. * (25 Jan 2006) empty lists Added a check to see that the generated list wasn't empty; before this, it would *always* put on the list_head and list_foot stuff even if there was nothing there. Which meant that you could end up with something like
      which is Not Nice. * (25 Jan 2006) parent_item_sep Added the 'parent_item_sep' parameter to 'nav_bar'. 0.0601 Thu 19 January 2006 -------------------------- * (19 Jan 2006) corrected error in changelog 0.06 Thu 19 January 2006 ------------------------ * (19 Jan 2006) mostly nav_bar - added new function nav_bar, which does an across-the-top navbar - added new option 'nohide' to override 'hide' - renamed a number of options - restructured the way some things were done 0.0502 Tue 17 January 2006 -------------------------- * (17 Jan 2006) futher correction to navbar This time fer shure! 0.0501 Tue 17 January 2006 -------------------------- * (17 Jan 2006) corrected navbar error My feature enhancement... didn't do what I thought it did. Oops. 0.05 Tue 17 January 2006 ------------------------ * (17 Jan 2006) improved navbar Now the navbar shows the next level up when the current page is not an index page; the siblings of its parent. 0.04 Fri 13 January 2006 ------------------------ * (13 Jan 2006) improved nav_tree Revamped the logic and the options to make nav_tree more sensible and simpler to use. * (12 Jan 2006) nomenclature Stop referring to directories; they're index pages. Renamed 'dir_tree' to 'full_tree'. 0.03 Thu 12 January 2006 ------------------------ * (12 Jan 2006) renames,additions,nav_tree - renamed breadcrumb_tree to breadcrumb_trail - added the 'preserve_order' option to dir_tree - added new function 'nav_tree' to make a nested navbar - updated documentation - fixes and tweaks 0.02 Wed 11 January 2006 ------------------------ * (11 Jan 2006) breadcrumb_tree Added the 'breadcrumb_tree' function which makes a breadcrumb trail from the current_url. * (11 Jan 2006) minor fixes Made the checking of the 'current_url' better. 0.01 Mon 09 January 2006 ------------------------ * (9 Jan 2006) tweaking documentation * (9 Jan 2006) commit tweaking The ModDevAid stuff needed to not try to chmod non-existant scripts. * (9 Jan 2006) fixing tests Just some minor bugs with the tests. * (9 Jan 2006) initial checkin README.mkdn100644001750001751 5743112641340604 14542 0ustar00katkat000000000000HTML-LinkList-0.1701# NAME HTML::LinkList - Create a 'smart' list of HTML links. # VERSION version 0.1701 # SYNOPSIS use HTML::LinkList qw(link_list); # default formatting my $html_links = link_list(current_url=>$url, urls=>\@links_in_order, labels=>\%labels, descriptions=>\%desc); # paragraph with ' :: ' separators my $html_links = link_list(current_url=>$url, urls=>\@links_in_order, labels=>\%labels, descriptions=>\%desc, links_head=>'

      ', links_foot=>'

      ', pre_item=>'', post_item=>'' pre_active_item=>'', post_active_item=>'', item_sep=>" :: "); # multi-level list my $html_links = link_tree( current_url=>$url, link_tree=>\@list_of_lists, labels=>\%labels, descriptions=>\%desc); # DESCRIPTION This module contains a number of functions for taking sets of URLs and labels and creating suitably formatted HTML. These links are "smart" because, if given the url of the current page, if any of the links in the list equal it, that item in the list will be formatted as a special label, not as a link; this is a Good Thing, since the user would be confused by clicking on a link back to the current page. While many website systems have plugins for "smart" navbars, they are specialized for that system only, and can't be reused elsewhere, forcing people to reinvent the wheel. I hereby present one wheel, free to be reused by anybody; just the simple functions, a backend, which can be plugged into whatever system you want. The default format for the HTML is to make an unordered list, but there are many options, enabling one to have a flatter layout with any separators you desire, or a more complicated list with differing formats for different levels. The "link\_list" function uses a simple list of links -- good for a simple navbar. The "link\_tree" function takes a set of nested links and makes the HTML for them -- good for making a table of contents, or a more complicated navbar. The "full\_tree" function takes a list of paths and makes a full tree of all the pages and index-pages in those paths -- good for making a site map. The "breadcrumb\_trail" function takes a url and makes a "breadcrumb trail" from it. The "nav\_tree" function creates a set of nested links to be used as a multi-level navbar; one can give it a list of paths (as for full\_tree) and it will only show the links related to the current URL. # FUNCTIONS To export a function, add it to the 'use' call. use HTML::LinkList qw(link_list); To export all functions do: use HTML::LinkList ':all'; ## link\_list $links = link_list( current_url=>$url, urls=>\@links_in_order, labels=>\%labels, descriptions=>\%desc, pre_desc=>' ', post_desc=>'', links_head=>'
        ', links_foot=>'
      ', pre_item=>'
    • ', post_item=>'
    • ' pre_active_item=>'', post_active_item=>'', item_sep=>"\n"); Generates a simple list of links, from list of urls (and optional labels) taking into account of the "current" URL. This provides a large number of options to customize the appearance of the list. The default setup is for a simple UL list, but setting the options can enable you to make it something other than a list altogether, or add in CSS styles or classes to make it look just like you want. Required: - urls The urls in the order you want them displayed. If this list is empty, then nothing will be generated. Options: - current\_url The link to the current page. If one of the links equals this, then that is deemed to be the "active" link and is just displayed as a label rather than a link. - descriptions Optional hash of descriptions, to put next to the links. The keys of this hash are the urls. - hide\_ext If a site is hiding link extensions (such as using MultiViews with Apache) you may wish to hide the extensions (while using the full URLs to check various things). (default: 0 (false)) - item\_sep String to put between items. - labels A hash whose keys are links and whose values are labels. These are the labels for the links; if no label is given, then the last part of the link is used for the label, with some formatting. - links\_head String to begin the list with. - links\_foot String to end the list with. - pre\_desc String to prepend to each description. - post\_desc String to append to each description. - pre\_item String to prepend to each item. - post\_item String to append to each item. - pre\_active\_item An additional string to put in front of each "active" item, after pre\_item. The "active" item is the link which matches 'current\_url'. - pre\_item\_active INSTEAD of the "pre\_item" string, use this string for active items - post\_active\_item An additional string to append to each active item, before post\_item. - prefix\_url A prefix to prepend to all the links. (default: empty string) ## link\_tree $links = link_tree( current_url=>$url, link_tree=>\@list_of_lists, labels=>\%labels, descriptions=>\%desc, pre_desc=>' ', post_desc=>'', links_head=>'
        ', links_foot=>'
      ', subtree_head=>'
        ', subtree_foot=>'
      ', pre_item=>'
    • ', post_item=>'
    • ' pre_active_item=>'', post_active_item=>'', item_sep=>"\n", tree_sep=>"\n", formats=>\%formats); Generates nested lists of links from a list of lists of links. This is useful for things such as table-of-contents or site maps. By default, this will return UL lists, but this is highly configurable. Required: - link\_tree A list of lists of urls, in the order you want them displayed. If a url is not in this list, it will not be displayed. Options: - current\_url The link to the current page. If one of the links equals this, then that is deemed to be the "active" link and is just displayed as a label rather than a link. - descriptions Optional hash of descriptions, to put next to the links. The keys of this hash are the urls. - exclude\_root\_parent If this is true, then the "current\_parent" display options are not used for the "root" ("/") path, it isn't counted as a "parent" of the current\_url. - formats A reference to a hash containing advanced format settings. For example: my %formats = ( # level 1 and onwards '1' => { tree_head=>"
        ", tree_foot=>"
      \n", }, # level 2 and onwards '2' => { tree_head=>"
        ", tree_foot=>"
      \n", }, # level 3 and onwards '3' => { pre_item=>'(', post_item=>')', item_sep=>",\n", tree_sep=>' -> ', tree_head=>"
      \n", tree_foot=>"", } ); The formats hash enables you to control the formatting on a per-level basis. Each key of the hash corresponds to a level-number; the sub-hashes contain format arguments which will apply from that level onwards. If an argument isn't given in the sub-hash, then it will fall back to the previous level (or to the default, if there is no setting for that format-argument for a previous level). The only difference between the names of the arguments in the sub-hash and in the global format arguments is that instead of 'subtree\_head' and subtree\_foot' it uses 'tree\_head' and 'tree\_foot'. - hide\_ext If a site is hiding link extensions (such as using MultiViews with Apache) you may wish to hide the extensions (while using the full URLs to check various things). (default: 0 (false)) - item\_sep The string to separate each item. - labels A hash whose keys are links and whose values are labels. These are the labels for the links; if no label is given, then the last part of the link is used for the label, with some formatting. - links\_head The string to prepend the top-level tree with. (default:
        ) - links\_foot The string to append to the top-level tree. (default:
      ) - pre\_desc String to prepend to each description. - post\_desc String to append to each description. - pre\_item String to prepend to each item. (default:
    • ) - post\_item String to append to each item. (default:
    • ) - pre\_active\_item An additional string to put in front of each "active" item, after pre\_item. The "active" item is the link which matches 'current\_url'. (default: ) - pre\_item\_active INSTEAD of the "pre\_item" string, use this string for active items - post\_active\_item An additional string to append to each active item, before post\_item. (default: ) - pre\_current\_parent An additional string to put in front of a link which is a parent of the 'current\_url' link, after pre\_item. - pre\_item\_current\_parent INSTEAD of the "pre\_item" string, use this for links which are parents of the 'current\_url' link. - post\_current\_parent An additional string to append to a link which is a parent of the 'current\_url' link, before post\_item. - prefix\_url A prefix to prepend to all the links. (default: empty string) - subtree\_head The string to prepend to lower-level trees. (default:
        ) - subtree\_foot The string to append to lower-level trees. (default:
      ) - tree\_sep The string to separate each tree. ## full\_tree $links = full_tree( paths=>\@list_of_paths, labels=>\%labels, descriptions=>\%desc, hide=>$hide_regex, nohide=>$nohide_regex, start_depth=>0, end_depth=>0, top_level=>0, preserve_order=>0, preserve_paths=>0, ... ); Given a set of paths this will generate a tree of links in the style of _link\_tree_. This will figure out all the intermediate paths and construct the nested structure for you, clustering parents and children together. The formatting options are as for ["link\_tree"](#link_tree). Required: - paths A reference to a list of paths: that is, URLs relative to the top of the site. For example, if the full URL is http://www.example.com/foo.html then the path is /foo.html If the full URL is http://www.example.com/~frednurk/foo.html then the path is /foo.html This does not require that every possible path be given; all the intermediate paths will be figured out from the list. Options: - append\_list Array of paths to append to the top-level links. They are used as-is, and are not part of the processing done to the "paths" list of paths. (see ["prepend\_list"](#prepend_list)) - descriptions Optional hash of descriptions, to put next to the links. The keys of this hash are the paths. - end\_depth End your tree at this depth. If zero, then go all the way. (see ["start\_depth"](#start_depth)) - exclude\_root\_parent If this is true, then the "current\_parent" display options are not used for the "root" ("/") path, it isn't counted as a "parent" of the current\_url. - hide If the path matches this string, don't include it in the tree. - hide\_ext If a site is hiding link extensions (such as using MultiViews with Apache) you may wish to hide the extensions (while using the full URLs to check various things). (default: 0 (false)) - labels Hash containing replacement labels for one or more paths. If no label is given for '/' (the root path) then 'Home' will be used. - last\_subtree\_head The string to prepend to the last lower-level tree. Only used if end\_depth is not zero. - last\_subtree\_foot The string to append to the last lower-level tree. Only used if end\_depth is not zero. - nohide If the path matches this string, it will be included even if it matches the 'hide' string. - prefix\_url A prefix to prepend to all the links. (default: empty string) - prepend\_list Array of paths to prepend to the top-level links. They are used as-is, and are not part of the processing done to the "paths" list of paths. - preserve\_order Preserve the ordering of the paths in the input list of paths; otherwise the links will be sorted alphabetically. Note that if preserve\_order is true, the structure is at the whims of the order of the original list of paths, and so could end up odd-looking. (default: false) - preserve\_paths Do not extract intermediate paths or reorder the input list of paths. This speeds things up, but assumes that the input paths are complete and in good order. (default: false) - start\_depth Start your tree at this depth. Zero is the root, level 1 is the files/sub-folders in the root, and so on. (default: 0) - top\_level Decide which level is the "top" level. Useful when you set the start\_depth to something greater than 1. ## breadcrumb\_trail $links = breadcrumb_trail( current_url=>$url, labels=>\%labels, descriptions=>\%desc, links_head=>'

      ', links_foot=>"\n

      ", subtree_head=>'', subtree_foot=>"\n", pre_item=>'', post_item=>'', pre_active_item=>'', post_active_item=>'', item_sep=>"\n", tree_sep=>' > ', ... ); Given the current url, make a breadcrumb trail from it. By default, this is laid out with '>' separators, but it can be set up to give a nested set of UL lists (as for ["full\_tree"](#full_tree)). The formatting options are as for ["link\_tree"](#link_tree). Required: - current\_url The current url to be made into a breadcrumb-trail. Options: - descriptions Optional hash of descriptions, to put next to the links. The keys of this hash are the urls. - exclude\_root\_parent If this is true, then the "current\_parent" display options are not used for the "root" ("/") path, it isn't counted as a "parent" of the current\_url. - hide\_ext If a site is hiding link extensions (such as using MultiViews with Apache) you may wish to hide the extensions (while using the full URLs to check various things). (default: 0 (false)) - labels Hash containing replacement labels for one or more URLS. If no label is given for '/' (the root path) then 'Home' will be used. ## nav\_tree $links = nav_tree( paths=>\@list_of_paths, labels=>\%labels, current_url=>$url, hide=>$hide_regex, nohide=>$nohide_regex, preserve_order=>1, descriptions=>\%desc, ... ); This takes a list of links, and the current URL, and makes a nested navigation tree, consisting of (a) the top-level links (b) the links leading to the current URL (c) the links on the same level as the current URL, (d) the related links just above this level, depending on whether this is an index-page or a content page. Optionally one can hide links which match match the 'hide' option. The formatting options are as for ["link\_tree"](#link_tree), with some additions. Required: - current\_url The link to the current page. If one of the links equals this, then that is deemed to be the "active" link and is just displayed as a label rather than a link. This is also used to determine which links to show and which ones to filter out. - paths A reference to a list of paths: that is, URLs relative to the top of the site. For example, if the full URL is http://www.example.com/foo.html then the path is /foo.html This does not require that every possible path be given; all the intermediate paths will be figured out from the list. Options: - append\_list Array of paths to append to the top-level links. They are used as-is, and are not part of the processing done to the "paths" list of paths. (see ["prepend\_list"](#prepend_list)) - descriptions Optional hash of descriptions, to put next to the links. The keys of this hash are the paths. - end\_depth End your tree at this depth. If zero, then go all the way. By default this is set to the depth of the current\_url. - exclude\_root\_parent If this is true, then the "current\_parent" display options are not used for the "root" ("/") path, it isn't counted as a "parent" of the current\_url. - hide If a path matches this string, don't include it in the tree. - hide\_ext If a site is hiding link extensions (such as using MultiViews with Apache) you may wish to hide the extensions (while using the full URLs to check various things). (default: 0 (false)) - labels Hash containing replacement labels for one or more paths. If no label is given for '/' (the root path) then 'Home' will be used. - last\_subtree\_head The string to prepend to the last lower-level tree. - last\_subtree\_foot The string to append to the last lower-level tree. - nohide If the path matches this string, it will be included even if it matches the 'hide' string. - prefix\_url A prefix to prepend to all the links. (default: empty string) - prepend\_list Array of paths to prepend to the top-level links. They are used as-is, and are not part of the processing done to the "paths" list of paths. - preserve\_order Preserve the ordering of the paths in the input list of paths; otherwise the links will be sorted alphabetically. (default: true) - preserve\_paths Do not extract intermediate paths or reorder the input list of paths. This speeds things up, but assumes that the input paths are complete and in good order. (default: false) - start\_depth Start your tree at this depth. Zero is the root, level 1 is the files/sub-folders in the root, and so on. (default: 1) - top\_level Decide which level is the "top" level. Useful when you set the start\_depth to something greater than 1. # Private Functions These functions cannot be exported. ## make\_item $item = make\_item( this\_label=>$label, this\_link=>$link, hide\_ext=>0, current\_url=>$url, current\_parents=>\\%current\_parents, descriptions=>\\%desc, format=>\\%format, ); %format = ( pre\_desc=>' ', post\_desc=>'', pre\_item=>'
    • ', post\_item=>'
    • ' pre\_active\_item=>'', post\_active\_item=>'', pre\_current\_parent=>'', post\_current\_parent=>'', item\_sep=>"\\n"); ); Format a link item. See ["link\_list"](#link_list) for the formatting options. - this\_label The label of the required link. If there is no label, this uses the base-name of the last part of the link, capitalizing it and replacing underscores and dashes with spaces. - this\_link The URL of the required link. - current\_url The link to the current page. If one of the links equals this, then that is deemed to be the "active" link and is just displayed as a label rather than a link. - current\_parents URLs of the parents of the current item. - descriptions Optional hash of descriptions, to put next to the links. The keys of this hash are the links (not the labels). - defer\_post\_item Don't add the 'post\_item' string if this is true. (needed for nested lists) (default: false) - no\_link Don't make a link for this, just a label. ## make\_canonical my $new\_url = make\_canonical($url); Make a URL canonical; remove the 'index.\*' and add on a needed '/' -- this assumes that directory names never have a '.' in them. ## get\_index\_path my $new\_url = get\_index\_path($url); Get the "index" part of this path. That is, if this path is not for an index-page, then get the parent index-page path for this path. (Removes the trailing slash). ## get\_index\_parent my $new\_url = get\_index\_parent($url); Get the parent of the "index" part of this path. (Removes the trailing slash). ## path\_depth my $depth = path\_depth($url); Calculate the "depth" of the given path. ## link\_is\_active if (link_is_active(this_link=>$link, current_url=>$url)) ... Check if the given link is "active", that is, if it matches the 'current\_url'. ## traverse\_lol $links = traverse\_lol(\\@list\_of\_lists, labels=>\\%labels, tree\_depth=>$depth current\_format=>\\%format, ... ); Traverse the list of lists (of urls) to produce a nested collection of links. This consumes the list\_of\_lists! ## extract\_all\_paths my @all\_paths = extract\_all\_paths(paths=>\\@paths, preserve\_order=>0); Extract all possible paths out of a list of paths. Thus, if one has /foo/bar/baz.html then that would make / /foo/ /foo/bar/ /foo/bar/baz.html If 'preserve\_order' is true, this preserves the ordering of the paths in the input list; otherwise the output paths are sorted alphabetically. ## extract\_current\_parents my %current_parents = extract_current_parents(current_url=>$url, exclude_root_parent=>0); Extract the "parent" paths of the current url /foo/bar/baz.html then that would make / /foo/ /foo/bar/ If 'exclude\_root\_parent' is true, then the '/' is excluded from the list of parents. ## build\_lol my @lol = build_lol( paths=>\@paths, current_url=>$url, navbar_type=>'', ); Build a list of lists of paths, given a simple list of paths. Assumes that this list has already been filtered. - paths Reference to list of paths; this is consumed. ## filter\_out\_paths my @filtered_paths = filter_out_paths( paths=>\@paths, current_url=>$url, hide=>$hide, nohide=>$nohide, start_depth=>$start_depth, end_depth=>$end_depth, top_level=>$top_level, navbar_type=>'', ); Filter out the paths we don't want from our list of paths. Returns a list of the paths we want. ## make\_default\_format my %default_format = make_default_format(%args); Make the default format hash from the args. Returns a hash of format options. ## make\_extra\_formats my %formats = make_extra_formats(%args); Transforms the subtree\_head and subtree\_foot into the "formats" method of formatting. Returns a hash of hashes of format options. # REQUIRES Test::More # INSTALLATION To install this module, run the following commands: perl Build.PL ./Build ./Build test ./Build install Or, if you're on a platform (like DOS or Windows) that doesn't like the "./" notation, you can do this: perl Build.PL perl Build perl Build test perl Build install In order to install somewhere other than the default, such as in a directory under your home directory, like "/home/fred/perl" go perl Build.PL --install_base /home/fred/perl as the first step instead. This will install the files underneath /home/fred/perl. You will then need to make sure that you alter the PERL5LIB variable to find the modules. Therefore you will need to change the PERL5LIB variable to add /home/fred/perl/lib PERL5LIB=/home/fred/perl/lib:${PERL5LIB} # SEE ALSO perl(1). # BUGS Please report any bugs or feature requests to the author. # AUTHOR Kathryn Andersen (RUBYKAT) perlkat AT katspace dot com http://www.katspace.com/tools/html_linklist/ # COPYRIGHT AND LICENCE Copyright (c) 2006 by Kathryn Andersen This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. MANIFEST.SKIP100644001750001751 54212641340604 14557 0ustar00katkat000000000000HTML-LinkList-0.1701# Version control files and dirs. \bRCS\b \bCVS\b ,v$ ^_darcs/ ^\.git/ ^\.gitignore$ # Dev ^\.todo$ ^dist.ini$ # distro files ^HTML-LinkList-* # ExtUtils::MakeMaker generated files and dirs. ^Makefile$ ^blib/ ^blibdirs$ ^pm_to_blib$ ^MakeMaker-\d # Module::Build ^Build$ ^_build/ # Temp, old, vi and emacs files. ~$ \.old$ ^#.*#$ ^\.# \.swp$ \.bak$ t000755001750001751 012641340604 13003 5ustar00katkat000000000000HTML-LinkList-0.170100-compile.t100644001750001751 212112641340604 15171 0ustar00katkat000000000000HTML-LinkList-0.1701/tuse 5.006; use strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::Compile 2.052 use Test::More; plan tests => 1 + ($ENV{AUTHOR_TESTING} ? 1 : 0); my @module_files = ( 'HTML/LinkList.pm' ); # no fake home requested my $inc_switch = -d 'blib' ? '-Mblib' : '-Ilib'; use File::Spec; use IPC::Open3; use IO::Handle; open my $stdin, '<', File::Spec->devnull or die "can't open devnull: $!"; my @warnings; for my $lib (@module_files) { # see L my $stderr = IO::Handle->new; my $pid = open3($stdin, '>&STDERR', $stderr, $^X, $inc_switch, '-e', "require q[$lib]"); binmode $stderr, ':crlf' if $^O eq 'MSWin32'; my @_warnings = <$stderr>; waitpid($pid, 0); is($?, 0, "$lib loaded ok"); if (@_warnings) { warn @_warnings; push @warnings, @_warnings; } } is(scalar(@warnings), 0, 'no warnings found') or diag 'got warnings: ', ( Test::More->can('explain') ? Test::More::explain(\@warnings) : join("\n", '', @warnings) ) if $ENV{AUTHOR_TESTING}; 50_nav_tree.t100644001750001751 3173512641340604 15470 0ustar00katkat000000000000HTML-LinkList-0.1701/t# testing nav_tree use strict; use Test::More tests => 26; use HTML::LinkList qw(nav_tree); #===================================================================== sub make_test_html { my %args = ( test_name=>'nav_tree', test_count=>0, link_html=>'', ok_str=>'', @_ ); if ($args{link_html} ne $args{ok_str}) { my $test_file = "${args{test_name}}${args{test_count}}.html"; open(HTML, ">", $test_file) or die "could not open $test_file for writing"; print HTML< $args{test_name}

      $args{test_name}

      Got: $args{link_html}

      Wanted: $args{ok_str} EOT close(HTML); } } #===================================================================== my @links = qw( /foo/bar/baz.html /foo/bar/biz.html /foo/wibble.html /foo/boo/thren.html /fooish.html /bringle/ /bringle/brangle.html /tray/nav.html /tray/tea_tray.html ); my %labels = ( '/tray/nav.html' => 'Navigation', '/foo/bar/baz.html' => 'Bazzy', ); my $test_count = 0; my $link_html = ''; $test_count++; # default $link_html = nav_tree(labels=>\%labels, paths=>\@links, current_url=>'/foo/wibble.html'); ok($link_html, "($test_count) default; links HTML"); my $ok_str = ''; $ok_str = '

      '; is($link_html, $ok_str, "($test_count) default; values match"); # make an example html file of the difference if ($link_html ne $ok_str) { make_test_html(link_html=>$link_html, ok_str=>$ok_str, test_count=>$test_count); } # current is dir $test_count++; $link_html = nav_tree(labels=>\%labels, paths=>\@links, current_url=>'/foo/'); ok($link_html, "($test_count) current-is-dir; links HTML"); $ok_str = ''; is($link_html, $ok_str, "($test_count) current-is_dir; values match"); # make an example html file of the difference if ($link_html ne $ok_str) { make_test_html(link_html=>$link_html, ok_str=>$ok_str, test_count=>$test_count); } # current is dir with 'breadcrumb' style $test_count++; $link_html = nav_tree(labels=>\%labels, navbar_type=>'breadcrumb', paths=>\@links, current_url=>'/foo/'); ok($link_html, "($test_count) dir breadcrumb-navbar; links HTML"); $ok_str = ''; is($link_html, $ok_str, "($test_count) dir breadcrumb-navbar; values match"); # make an example html file of the difference if ($link_html ne $ok_str) { make_test_html(link_html=>$link_html, ok_str=>$ok_str, test_count=>$test_count); } # current is not dir with 'breadcrumb' style $test_count++; $link_html = nav_tree(labels=>\%labels, navbar_type=>'breadcrumb', paths=>\@links, current_url=>'/foo/wibble.html'); ok($link_html, "($test_count) non-dir breadcrumb-navbar; links HTML"); $ok_str = ''; is($link_html, $ok_str, "($test_count) non-dir breadcrumb-navbar; values match"); # make an example html file of the difference if ($link_html ne $ok_str) { make_test_html(link_html=>$link_html, ok_str=>$ok_str, test_count=>$test_count); } # lower level $test_count++; $link_html = nav_tree(labels=>\%labels, paths=>\@links, current_url=>'/foo/bar/baz.html'); ok($link_html, "($test_count) lower level; links HTML"); $ok_str = ''; is($link_html, $ok_str, "($test_count) lower level; values match"); # make an example html file of the difference if ($link_html ne $ok_str) { make_test_html(link_html=>$link_html, ok_str=>$ok_str, test_count=>$test_count); } # mid-level index $test_count++; $link_html = nav_tree(labels=>\%labels, paths=>\@links, current_url=>'/foo/bar/'); ok($link_html, "($test_count) mid level; links HTML"); $ok_str = ''; is($link_html, $ok_str, "($test_count) mid level; values match"); # make an example html file of the difference if ($link_html ne $ok_str) { make_test_html(link_html=>$link_html, ok_str=>$ok_str, test_count=>$test_count); } # # more complicated links # @links = qw( / /about/about_cti.html /about/contact_us.html /about/people_technology.html /products/ /products/operations_control/ /products/operations_control/Airpac.html /products/operations_control/Airpac_Overview.pdf /products/crewing/ /products/crewing/Crew_Rostering.pdf /products/maintenance/ /solutions/ /services/ /news/press_release.html ); %labels = ( '/' => 'Home', '/index.html' => 'Home', '/about/about_cti.html' => 'About CTI', '/about/people_technology.html' => 'People and Technology', ); $test_count++; $link_html = nav_tree(labels=>\%labels, paths=>\@links, current_url=>'/products/'); ok($link_html, "($test_count) more links; links HTML"); $ok_str = ''; is($link_html, $ok_str, "($test_count) more links; values match"); # make an example html file of the difference if ($link_html ne $ok_str) { make_test_html(link_html=>$link_html, ok_str=>$ok_str, test_count=>$test_count); } # starting at level 2 $test_count++; $link_html = nav_tree(labels=>\%labels, paths=>\@links, start_depth=>2, current_url=>'/products/'); ok($link_html, "($test_count) start_depth=2; links HTML"); $ok_str = ''; is($link_html, $ok_str, "($test_count) start_depth=2; values match"); # make an example html file of the difference if ($link_html ne $ok_str) { make_test_html(link_html=>$link_html, ok_str=>$ok_str, test_count=>$test_count); } # Including the Home in the top navbar # $test_count++; $link_html = nav_tree(labels=>\%labels, paths=>\@links, prepend_list=>[qw(/)], current_url=>'/products/'); ok($link_html, "($test_count) more links; include Home; links HTML"); $ok_str = ''; is($link_html, $ok_str, "($test_count) more links; include Home; values match"); # make an example html file of the difference if ($link_html ne $ok_str) { make_test_html(link_html=>$link_html, ok_str=>$ok_str, test_count=>$test_count); } # current_parent stuff $test_count++; $link_html = nav_tree(labels=>\%labels, paths=>\@links, prepend_list=>[qw(/)], exclude_root_parent=>1, pre_current_parent=>'', post_current_parent=>'', current_url=>'/products/crewing/'); ok($link_html, "($test_count) more links; include Home; links HTML"); $ok_str = ''; is($link_html, $ok_str, "($test_count) more links; include Home; values match"); # make an example html file of the difference if ($link_html ne $ok_str) { make_test_html(link_html=>$link_html, ok_str=>$ok_str, test_count=>$test_count); } # more current_parent stuff $test_count++; $link_html = nav_tree(labels=>\%labels, paths=>\@links, prepend_list=>[qw(/)], exclude_root_parent=>1, pre_item_current_parent=>'
    • ', current_url=>'/products/crewing/'); ok($link_html, "($test_count) more links; pre_item_current_parent; links HTML"); $ok_str = ''; is($link_html, $ok_str, "($test_count) more links; pre_item_current_parent; values match"); # make an example html file of the difference if ($link_html ne $ok_str) { make_test_html(link_html=>$link_html, ok_str=>$ok_str, test_count=>$test_count); } # # even more complicated links # @links = qw( / /dunes/about/about_cti.html /dunes/about/contact_us.html /dunes/about/people_technology.html /dunes/products/ /dunes/products/operations_control/ /dunes/products/operations_control/Airpac.html /dunes/products/operations_control/Airpac_Overview.pdf /dunes/products/crewing/ /dunes/products/crewing/Crew_Rostering.pdf /dunes/products/maintenance/ /dunes/solutions/ /dunes/services/ /dunes/news/press_release.html ); %labels = ( '/' => 'Home', '/index.html' => 'Home', '/dunes/' => 'Style Dunes', '/dunes/about/about_cti.html' => 'About CTI', '/dunes/about/people_technology.html' => 'People and Technology', ); # starting at level 2 and discarding level 1 $test_count++; $link_html = nav_tree(labels=>\%labels, paths=>\@links, start_depth=>2, top_level=>2, current_url=>'/dunes/products/'); ok($link_html, "($test_count) start_depth=2, top_level=2; links HTML"); $ok_str = ''; is($link_html, $ok_str, "($test_count) start_depth=2, top_level=2; values match"); # make an example html file of the difference if ($link_html ne $ok_str) { make_test_html(link_html=>$link_html, ok_str=>$ok_str, test_count=>$test_count); } # lower level $test_count++; $link_html = nav_tree(labels=>\%labels, paths=>\@links, start_depth=>2, top_level=>2, current_url=>'/dunes/products/operations_control/Airpac.html'); ok($link_html, "($test_count) start_depth=2, top_level=2; lower level links HTML"); $ok_str = ''; is($link_html, $ok_str, "($test_count) start_depth=2, top_level=2; values match"); # make an example html file of the difference if ($link_html ne $ok_str) { make_test_html(link_html=>$link_html, ok_str=>$ok_str, test_count=>$test_count); } 30_full_tree.t100644001750001751 1145412641340604 15640 0ustar00katkat000000000000HTML-LinkList-0.1701/t# testing full_tree use strict; use Test::More tests => 12; use HTML::LinkList qw(full_tree); my @links = qw( /foo/bar/baz.html /fooish.html /bringle/ /tray/nav.html /tray/tea_tray.html ); my %labels = ( '/tray/nav.html' => 'Navigation', '/foo/bar/baz.html' => 'Bazzy', ); my $test_count = 0; my $link_html = ''; # default, no current $test_count++; $link_html = full_tree(labels=>\%labels, paths=>\@links); ok($link_html, "($test_count) default; links HTML"); my $ok_str = ''; $ok_str = ''; is($link_html, $ok_str, "($test_count) default; values match"); # start_depth $test_count++; $link_html = full_tree(labels=>\%labels, paths=>\@links, start_depth=>1); ok($link_html, "($test_count) start_depth=1; links HTML"); $ok_str = ''; is($link_html, $ok_str, "($test_count) start_depth=1; values match"); # start_depth and end_depth $test_count++; $link_html = full_tree(labels=>\%labels, paths=>\@links, start_depth=>1, end_depth=>2); ok($link_html, "($test_count) start_depth=1, end_depth=2; links HTML"); $ok_str = ''; is($link_html, $ok_str, "($test_count) start_depth=1, end_depth=2; values match"); # preserve_order, no current $test_count++; $link_html = full_tree(labels=>\%labels, paths=>\@links, preserve_order=>1); ok($link_html, "($test_count) preserve_order; links HTML"); $ok_str = ''; $ok_str = ''; is($link_html, $ok_str, "($test_count) preserve_order; values match"); # differing formats, no current $test_count++; my %formats = ( '1' => { tree_head=>"
        ", tree_foot=>"
      \n", }, '2' => { pre_item=>'(', post_item=>')', item_sep=>",\n", tree_sep=>' -> ', tree_head=>"
      \n", tree_foot=>"", }, '3' => { pre_item=>' {{ ', post_item=>' }} ', item_sep=>" ::\n", }, ); $link_html = full_tree(labels=>\%labels, paths=>\@links, formats=>\%formats, preserve_order=>1); ok($link_html, "($test_count) formats; links HTML"); $ok_str = ''; is($link_html, $ok_str, "($test_count) formats; values match"); # Mixed caps in links $test_count++; @links = qw( /foo/bar/baz.html /fooish.html /bringle/ /tray/nav.html /tray/tea_tray.html /industry/TLA_foo.html /industry/TLA_Bar.html ); %labels = ( '/tray/nav.html' => 'Navigation', ); $link_html = full_tree(labels=>\%labels, paths=>\@links); ok($link_html, "($test_count) Mixed caps; links HTML"); $ok_str = ''; is($link_html, $ok_str, "($test_count) Mixed caps; values match"); 10_link_list.t100644001750001751 331112641340604 15616 0ustar00katkat000000000000HTML-LinkList-0.1701/t# testing link_list use strict; use Test::More tests => 6; use HTML::LinkList qw(link_list); my @links = qw( /foo/bar/baz.html /fooish.html /bringle/ /tray/nav.html /tray/tea_tray.html ); my %labels = ( '/tray/nav.html' => 'Navigation', '/foo/bar/baz.html' => 'Bazzy', ); my $link_html = ''; # default, no current $link_html = link_list(labels=>\%labels, urls=>\@links); ok($link_html, "(1) default; links HTML"); my $ok_str = ''; $ok_str = ''; is($link_html, $ok_str, "(1) default; values match"); # default format with current $link_html = link_list(labels=>\%labels, urls=>\@links, current_url=>'/fooish.html'); ok($link_html, "(2) default with current; links HTML"); $ok_str = ''; is($link_html, $ok_str, "(2) default with current; values match"); # para, no current $link_html = link_list(labels=>\%labels, urls=>\@links, links_head=>'

      ', links_foot=>'

      ', pre_item=>'', post_item=>'', item_sep=>' :: '); ok($link_html, "(3) para; links HTML"); $ok_str = '

      Bazzy :: Fooish :: Bringle :: Navigation :: Tea Tray

      '; is($link_html, $ok_str, "(3) para; values match"); 20_link_tree.t100644001750001751 546412641340604 15616 0ustar00katkat000000000000HTML-LinkList-0.1701/t# testing link_tree use strict; use Test::More tests => 6; use HTML::LinkList qw(link_tree); my @links = ( '/foo/bar/baz.html', '/fooish.html', '/bringle/', ['/tray/nav.html', '/tray/tea_tray.html'], ); my %labels = ( '/tray/nav.html' => 'Navigation', '/foo/bar/baz.html' => 'Bazzy', ); my $link_html = ''; # default, no current $link_html = link_tree(labels=>\%labels, link_tree=>\@links); ok($link_html, "(1) default; links HTML"); my $ok_str = ''; $ok_str = ''; is($link_html, $ok_str, "(1) default; values match"); # not-welformed list @links = ( ['#Askew'], '#Big', ['#Lower'], ); %labels = ( '#Askew' => 'Askew Header', '#Big' => 'Big Header', '#Lower' => 'Lower Section', ); $link_html = link_tree(labels=>\%labels, link_tree=>\@links); ok($link_html, "(2) not-wellformed; links HTML"); $ok_str = ''; is($link_html, $ok_str, "(2) not-wellformed; values match"); # # (3) more complicated (example from HTML::GenToc tests) # @links = ( [ 'tfiles/test5.php#Title-Archaeology701', 'tfiles/test5.php#Title-Platinum', 'tfiles/test5.php#Title-RoutineTrafficStop' ], 'tfiles/test5.php#Series-FauxPawsProductions', [ 'tfiles/test5.php#Title-WindShiftFPP-506' ] ); %labels = ( 'tfiles/test5.php#Title-Archaeology701' => 'Archaeology 701 (Sentinel)', 'tfiles/test5.php#Title-Platinum' => 'Platinum (Sentinel)', 'tfiles/test5.php#Title-RoutineTrafficStop' => 'Routine Traffic Stop (Sentinel/ER)', 'tfiles/test5.php#Title-WindShiftFPP-506' => '(520) Wind Shift (FPP-506) (Sentinel)', 'tfiles/test5.php#Series-FauxPawsProductions' => 'Faux Paws Productions' ); my %formats = ( '0' => { 'tree_head' => '
        ', 'tree_foot' => "\n
      ", }, '1' => { 'tree_head' => '
        ', 'tree_foot' => "\n
      " }, ); $link_html = link_tree(labels=>\%labels, link_tree=>\@links, formats=>\%formats); ok($link_html, "(3) not-wellformed; links HTML"); $ok_str = '
      1. Faux Paws Productions
      '; is($link_html, $ok_str, "(3) not-wellformed; values match"); HTML000755001750001751 012641340604 14052 5ustar00katkat000000000000HTML-LinkList-0.1701/libLinkList.pm100644001750001751 12766312641340604 16360 0ustar00katkat000000000000HTML-LinkList-0.1701/lib/HTMLpackage HTML::LinkList; $HTML::LinkList::VERSION = '0.1701'; use strict; use warnings; =head1 NAME HTML::LinkList - Create a 'smart' list of HTML links. =head1 VERSION version 0.1701 =head1 SYNOPSIS use HTML::LinkList qw(link_list); # default formatting my $html_links = link_list(current_url=>$url, urls=>\@links_in_order, labels=>\%labels, descriptions=>\%desc); # paragraph with ' :: ' separators my $html_links = link_list(current_url=>$url, urls=>\@links_in_order, labels=>\%labels, descriptions=>\%desc, links_head=>'

      ', links_foot=>'

      ', pre_item=>'', post_item=>'' pre_active_item=>'', post_active_item=>'', item_sep=>" :: "); # multi-level list my $html_links = link_tree( current_url=>$url, link_tree=>\@list_of_lists, labels=>\%labels, descriptions=>\%desc); =head1 DESCRIPTION This module contains a number of functions for taking sets of URLs and labels and creating suitably formatted HTML. These links are "smart" because, if given the url of the current page, if any of the links in the list equal it, that item in the list will be formatted as a special label, not as a link; this is a Good Thing, since the user would be confused by clicking on a link back to the current page. While many website systems have plugins for "smart" navbars, they are specialized for that system only, and can't be reused elsewhere, forcing people to reinvent the wheel. I hereby present one wheel, free to be reused by anybody; just the simple functions, a backend, which can be plugged into whatever system you want. The default format for the HTML is to make an unordered list, but there are many options, enabling one to have a flatter layout with any separators you desire, or a more complicated list with differing formats for different levels. The "link_list" function uses a simple list of links -- good for a simple navbar. The "link_tree" function takes a set of nested links and makes the HTML for them -- good for making a table of contents, or a more complicated navbar. The "full_tree" function takes a list of paths and makes a full tree of all the pages and index-pages in those paths -- good for making a site map. The "breadcrumb_trail" function takes a url and makes a "breadcrumb trail" from it. The "nav_tree" function creates a set of nested links to be used as a multi-level navbar; one can give it a list of paths (as for full_tree) and it will only show the links related to the current URL. =cut =head1 FUNCTIONS To export a function, add it to the 'use' call. use HTML::LinkList qw(link_list); To export all functions do: use HTML::LinkList ':all'; =cut use Data::Dumper; require Exporter; our @ISA = qw(Exporter); # Items which are exportable. # # This allows declaration use HTML::LinkList ':all'; # If you do not need this, moving things directly into @EXPORT or @EXPORT_OK # will save memory. our %EXPORT_TAGS = ( 'all' => [ qw( link_list link_tree full_tree breadcrumb_trail nav_tree ) ] ); our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); # Items to export into callers namespace by default. Note: do not export # names by default without a very good reason. Use EXPORT_OK instead. # Do not simply export all your public functions/methods/constants. our @EXPORT = qw( ); =head2 link_list $links = link_list( current_url=>$url, urls=>\@links_in_order, labels=>\%labels, descriptions=>\%desc, pre_desc=>' ', post_desc=>'', links_head=>'
        ', links_foot=>'
      ', pre_item=>'
    • ', post_item=>'
    • ' pre_active_item=>'', post_active_item=>'', item_sep=>"\n"); Generates a simple list of links, from list of urls (and optional labels) taking into account of the "current" URL. This provides a large number of options to customize the appearance of the list. The default setup is for a simple UL list, but setting the options can enable you to make it something other than a list altogether, or add in CSS styles or classes to make it look just like you want. Required: =over =item urls The urls in the order you want them displayed. If this list is empty, then nothing will be generated. =back Options: =over =item current_url The link to the current page. If one of the links equals this, then that is deemed to be the "active" link and is just displayed as a label rather than a link. =item descriptions Optional hash of descriptions, to put next to the links. The keys of this hash are the urls. =item hide_ext If a site is hiding link extensions (such as using MultiViews with Apache) you may wish to hide the extensions (while using the full URLs to check various things). (default: 0 (false)) =item item_sep String to put between items. =item labels A hash whose keys are links and whose values are labels. These are the labels for the links; if no label is given, then the last part of the link is used for the label, with some formatting. =item links_head String to begin the list with. =item links_foot String to end the list with. =item pre_desc String to prepend to each description. =item post_desc String to append to each description. =item pre_item String to prepend to each item. =item post_item String to append to each item. =item pre_active_item An additional string to put in front of each "active" item, after pre_item. The "active" item is the link which matches 'current_url'. =item pre_item_active INSTEAD of the "pre_item" string, use this string for active items =item post_active_item An additional string to append to each active item, before post_item. =item prefix_url A prefix to prepend to all the links. (default: empty string) =back =cut sub link_list { my %args = ( current_url=>'', prefix_url=>'', labels=>undef, urls=>undef, links_head=>'
        ', links_foot=>"\n
      ", pre_item=>'
    • ', post_item=>'
    • ', pre_active_item=>'', post_active_item=>'', pre_current_parent=>'', post_current_parent=>'', item_sep=>"\n", hide_ext=>0, @_ ); my @link_order = @{$args{urls}}; if (!defined $args{urls} or !@{$args{urls}}) { return ''; } my %format = (exists $args{format} ? %{$args{format}} : make_default_format(%args)); # correct the current_url $args{current_url} = make_canonical($args{current_url}); my %current_parents = extract_current_parents(%args); my @items = (); foreach my $link (@link_order) { my $label = (exists $args{labels}->{$link} ? $args{labels}->{$link} : ''); my $item = make_item(%args, format=>\%format, current_parents=>\%current_parents, this_link=>$link, this_label=>$label); push @items, $item; } my $list = join($format{item_sep}, @items); return ($list ? join('', $args{links_head}, $list, $args{links_foot}) : ''); } # link_list =head2 link_tree $links = link_tree( current_url=>$url, link_tree=>\@list_of_lists, labels=>\%labels, descriptions=>\%desc, pre_desc=>' ', post_desc=>'', links_head=>'
        ', links_foot=>'
      ', subtree_head=>'
        ', subtree_foot=>'
      ', pre_item=>'
    • ', post_item=>'
    • ' pre_active_item=>'', post_active_item=>'', item_sep=>"\n", tree_sep=>"\n", formats=>\%formats); Generates nested lists of links from a list of lists of links. This is useful for things such as table-of-contents or site maps. By default, this will return UL lists, but this is highly configurable. Required: =over =item link_tree A list of lists of urls, in the order you want them displayed. If a url is not in this list, it will not be displayed. =back Options: =over =item current_url The link to the current page. If one of the links equals this, then that is deemed to be the "active" link and is just displayed as a label rather than a link. =item descriptions Optional hash of descriptions, to put next to the links. The keys of this hash are the urls. =item exclude_root_parent If this is true, then the "current_parent" display options are not used for the "root" ("/") path, it isn't counted as a "parent" of the current_url. =item formats A reference to a hash containing advanced format settings. For example: my %formats = ( # level 1 and onwards '1' => { tree_head=>"
        ", tree_foot=>"
      \n", }, # level 2 and onwards '2' => { tree_head=>"
        ", tree_foot=>"
      \n", }, # level 3 and onwards '3' => { pre_item=>'(', post_item=>')', item_sep=>",\n", tree_sep=>' -> ', tree_head=>"
      \n", tree_foot=>"", } ); The formats hash enables you to control the formatting on a per-level basis. Each key of the hash corresponds to a level-number; the sub-hashes contain format arguments which will apply from that level onwards. If an argument isn't given in the sub-hash, then it will fall back to the previous level (or to the default, if there is no setting for that format-argument for a previous level). The only difference between the names of the arguments in the sub-hash and in the global format arguments is that instead of 'subtree_head' and subtree_foot' it uses 'tree_head' and 'tree_foot'. =item hide_ext If a site is hiding link extensions (such as using MultiViews with Apache) you may wish to hide the extensions (while using the full URLs to check various things). (default: 0 (false)) =item item_sep The string to separate each item. =item labels A hash whose keys are links and whose values are labels. These are the labels for the links; if no label is given, then the last part of the link is used for the label, with some formatting. =item links_head The string to prepend the top-level tree with. (default:
        ) =item links_foot The string to append to the top-level tree. (default:
      ) =item pre_desc String to prepend to each description. =item post_desc String to append to each description. =item pre_item String to prepend to each item. (default:
    • ) =item post_item String to append to each item. (default:
    • ) =item pre_active_item An additional string to put in front of each "active" item, after pre_item. The "active" item is the link which matches 'current_url'. (default: ) =item pre_item_active INSTEAD of the "pre_item" string, use this string for active items =item post_active_item An additional string to append to each active item, before post_item. (default: ) =item pre_current_parent An additional string to put in front of a link which is a parent of the 'current_url' link, after pre_item. =item pre_item_current_parent INSTEAD of the "pre_item" string, use this for links which are parents of the 'current_url' link. =item post_current_parent An additional string to append to a link which is a parent of the 'current_url' link, before post_item. =item prefix_url A prefix to prepend to all the links. (default: empty string) =item subtree_head The string to prepend to lower-level trees. (default:
        ) =item subtree_foot The string to append to lower-level trees. (default:
      ) =item tree_sep The string to separate each tree. =back =cut sub link_tree { my %args = ( current_url=>'', prefix_url=>'', link_tree=>undef, links_head=>'
        ', links_foot=>"\n
      ", subtree_head=>'
        ', subtree_foot=>"\n
      ", last_subtree_head=>'
        ', last_subtree_foot=>"\n
      ", pre_item=>'
    • ', post_item=>'
    • ', pre_active_item=>'', post_active_item=>'', pre_current_parent=>'', post_current_parent=>'', item_sep=>"\n", tree_sep=>"\n", @_ ); # correct the current_url $args{current_url} = make_canonical($args{current_url}); my %current_parents = extract_current_parents(%args); $args{tree_depth} = 0; $args{end_depth} = 0; if (defined $args{link_tree} and @{$args{link_tree}}) { my %default_format = make_default_format(%args); my %formats = make_extra_formats(%args); my @link_tree = @{$args{link_tree}}; my $list = traverse_lol(\@link_tree, %args, formats=>\%formats, current_format=>\%default_format, current_parents=>\%current_parents); return $list if $list; } return ''; } # link_tree =head2 full_tree $links = full_tree( paths=>\@list_of_paths, labels=>\%labels, descriptions=>\%desc, hide=>$hide_regex, nohide=>$nohide_regex, start_depth=>0, end_depth=>0, top_level=>0, preserve_order=>0, preserve_paths=>0, ... ); Given a set of paths this will generate a tree of links in the style of I. This will figure out all the intermediate paths and construct the nested structure for you, clustering parents and children together. The formatting options are as for L. Required: =over =item paths A reference to a list of paths: that is, URLs relative to the top of the site. For example, if the full URL is http://www.example.com/foo.html then the path is /foo.html If the full URL is http://www.example.com/~frednurk/foo.html then the path is /foo.html This does not require that every possible path be given; all the intermediate paths will be figured out from the list. =back Options: =over =item append_list Array of paths to append to the top-level links. They are used as-is, and are not part of the processing done to the "paths" list of paths. (see L) =item descriptions Optional hash of descriptions, to put next to the links. The keys of this hash are the paths. =item end_depth End your tree at this depth. If zero, then go all the way. (see L) =item exclude_root_parent If this is true, then the "current_parent" display options are not used for the "root" ("/") path, it isn't counted as a "parent" of the current_url. =item hide If the path matches this string, don't include it in the tree. =item hide_ext If a site is hiding link extensions (such as using MultiViews with Apache) you may wish to hide the extensions (while using the full URLs to check various things). (default: 0 (false)) =item labels Hash containing replacement labels for one or more paths. If no label is given for '/' (the root path) then 'Home' will be used. =item last_subtree_head The string to prepend to the last lower-level tree. Only used if end_depth is not zero. =item last_subtree_foot The string to append to the last lower-level tree. Only used if end_depth is not zero. =item nohide If the path matches this string, it will be included even if it matches the 'hide' string. =item prefix_url A prefix to prepend to all the links. (default: empty string) =item prepend_list Array of paths to prepend to the top-level links. They are used as-is, and are not part of the processing done to the "paths" list of paths. =item preserve_order Preserve the ordering of the paths in the input list of paths; otherwise the links will be sorted alphabetically. Note that if preserve_order is true, the structure is at the whims of the order of the original list of paths, and so could end up odd-looking. (default: false) =item preserve_paths Do not extract intermediate paths or reorder the input list of paths. This speeds things up, but assumes that the input paths are complete and in good order. (default: false) =item start_depth Start your tree at this depth. Zero is the root, level 1 is the files/sub-folders in the root, and so on. (default: 0) =item top_level Decide which level is the "top" level. Useful when you set the start_depth to something greater than 1. =back =cut sub full_tree { my %args = ( paths=>undef, current_url=>'', links_head=>'
        ', links_foot=>"\n
      ", subtree_head=>'
        ', subtree_foot=>"\n
      ", last_subtree_head=>'
        ', last_subtree_foot=>"\n
      ", pre_item=>'
    • ', post_item=>'
    • ', pre_active_item=>'', post_active_item=>'', pre_current_parent=>'', post_current_parent=>'', item_sep=>"\n", tree_sep=>"\n", hide=>'', nohide=>'', preserve_order=>0, preserve_paths=>0, labels=>{}, start_depth=>0, end_depth=>0, top_level=>0, @_ ); # correct the current_url $args{current_url} = make_canonical($args{current_url}); my %current_parents = extract_current_parents(%args); # set the root label if (!$args{labels}->{'/'}) { $args{labels}->{'/'} = 'Home'; } my @path_list = (); if ($args{preserve_paths}) { @path_list = filter_out_paths(%args, paths=>$args{paths}); } else { @path_list = extract_all_paths(paths=>$args{paths}, preserve_order=>$args{preserve_order}); @path_list = filter_out_paths(%args, paths=>\@path_list); } my @list_of_lists = build_lol(%args, paths=>\@path_list, depth=>0); $args{tree_depth} = 0; $args{end_depth} = 0; my %default_format = make_default_format(%args); my %formats = make_extra_formats(%args); my $list = traverse_lol(\@list_of_lists, %args, formats=>\%formats, current_format=>\%default_format, current_parents=>\%current_parents); return $list if $list; return ''; } # full_tree =head2 breadcrumb_trail $links = breadcrumb_trail( current_url=>$url, labels=>\%labels, descriptions=>\%desc, links_head=>'

      ', links_foot=>"\n

      ", subtree_head=>'', subtree_foot=>"\n", pre_item=>'', post_item=>'', pre_active_item=>'', post_active_item=>'', item_sep=>"\n", tree_sep=>' > ', ... ); Given the current url, make a breadcrumb trail from it. By default, this is laid out with '>' separators, but it can be set up to give a nested set of UL lists (as for L). The formatting options are as for L. Required: =over =item current_url The current url to be made into a breadcrumb-trail. =back Options: =over =item descriptions Optional hash of descriptions, to put next to the links. The keys of this hash are the urls. =item exclude_root_parent If this is true, then the "current_parent" display options are not used for the "root" ("/") path, it isn't counted as a "parent" of the current_url. =item hide_ext If a site is hiding link extensions (such as using MultiViews with Apache) you may wish to hide the extensions (while using the full URLs to check various things). (default: 0 (false)) =item labels Hash containing replacement labels for one or more URLS. If no label is given for '/' (the root path) then 'Home' will be used. =back =cut sub breadcrumb_trail { my %args = ( current_url=>'', links_head=>'

      ', links_foot=>"\n

      ", subtree_head=>'', subtree_foot=>'', last_subtree_head=>'{', last_subtree_foot=>'}', pre_item=>'', post_item=>'', pre_active_item=>'', post_active_item=>'', pre_current_parent=>'', post_current_parent=>'', item_sep=>"\n", tree_sep=>' > ', hide=>'', nohide=>'', labels=>{}, paths=>[], start_depth=>0, end_depth=>undef, top_level=>0, @_ ); # correct the current_url $args{current_url} = make_canonical($args{current_url}); # set the root label if (!$args{labels}->{'/'}) { $args{labels}->{'/'} = 'Home'; } # make a list of paths consisting only of the current_url my @paths = ($args{current_url}); my @path_list = extract_all_paths(paths=>\@paths); @path_list = filter_out_paths(%args, paths=>\@path_list); my @list_of_lists = build_lol(%args, paths=>\@path_list, depth=>0); $args{tree_depth} = 0; $args{end_depth} = 0; my %default_format = make_default_format(%args); my %formats = make_extra_formats(%args); my $list = traverse_lol(\@list_of_lists, %args, formats=>\%formats, current_format=>\%default_format, ); return $list if $list; return ''; } # breadcrumb_trail =head2 nav_tree $links = nav_tree( paths=>\@list_of_paths, labels=>\%labels, current_url=>$url, hide=>$hide_regex, nohide=>$nohide_regex, preserve_order=>1, descriptions=>\%desc, ... ); This takes a list of links, and the current URL, and makes a nested navigation tree, consisting of (a) the top-level links (b) the links leading to the current URL (c) the links on the same level as the current URL, (d) the related links just above this level, depending on whether this is an index-page or a content page. Optionally one can hide links which match match the 'hide' option. The formatting options are as for L, with some additions. Required: =over =item current_url The link to the current page. If one of the links equals this, then that is deemed to be the "active" link and is just displayed as a label rather than a link. This is also used to determine which links to show and which ones to filter out. =item paths A reference to a list of paths: that is, URLs relative to the top of the site. For example, if the full URL is http://www.example.com/foo.html then the path is /foo.html This does not require that every possible path be given; all the intermediate paths will be figured out from the list. =back Options: =over =item append_list Array of paths to append to the top-level links. They are used as-is, and are not part of the processing done to the "paths" list of paths. (see L) =item descriptions Optional hash of descriptions, to put next to the links. The keys of this hash are the paths. =item end_depth End your tree at this depth. If zero, then go all the way. By default this is set to the depth of the current_url. =item exclude_root_parent If this is true, then the "current_parent" display options are not used for the "root" ("/") path, it isn't counted as a "parent" of the current_url. =item hide If a path matches this string, don't include it in the tree. =item hide_ext If a site is hiding link extensions (such as using MultiViews with Apache) you may wish to hide the extensions (while using the full URLs to check various things). (default: 0 (false)) =item labels Hash containing replacement labels for one or more paths. If no label is given for '/' (the root path) then 'Home' will be used. =item last_subtree_head The string to prepend to the last lower-level tree. =item last_subtree_foot The string to append to the last lower-level tree. =item nohide If the path matches this string, it will be included even if it matches the 'hide' string. =item prefix_url A prefix to prepend to all the links. (default: empty string) =item prepend_list Array of paths to prepend to the top-level links. They are used as-is, and are not part of the processing done to the "paths" list of paths. =item preserve_order Preserve the ordering of the paths in the input list of paths; otherwise the links will be sorted alphabetically. (default: true) =item preserve_paths Do not extract intermediate paths or reorder the input list of paths. This speeds things up, but assumes that the input paths are complete and in good order. (default: false) =item start_depth Start your tree at this depth. Zero is the root, level 1 is the files/sub-folders in the root, and so on. (default: 1) =item top_level Decide which level is the "top" level. Useful when you set the start_depth to something greater than 1. =back =cut sub nav_tree { my %args = ( paths=>undef, current_url=>'', links_head=>'
        ', links_foot=>"\n
      ", subtree_head=>'
        ', subtree_foot=>"\n
      ", last_subtree_head=>'
        ', last_subtree_foot=>"\n
      ", pre_item=>'
    • ', post_item=>'
    • ', pre_active_item=>'', post_active_item=>'', pre_current_parent=>'', post_current_parent=>'', item_sep=>"\n", tree_sep=>"\n", hide=>'', nohide=>'', preserve_order=>1, preserve_paths=>0, include_home=>0, labels=>{}, start_depth=>1, end_depth=>undef, top_level=>1, navbar_type=>'normal', @_ ); # correct the current_url $args{current_url} = make_canonical($args{current_url}); my $current_is_index = ($args{current_url} =~ m!/$!o); my %current_parents = extract_current_parents(%args); # set the end depth if is not already set # if this is an index-page, then make the depth its depth + 1 # if this is a content-page, make the depth its depth my $current_url_depth = path_depth($args{current_url}); $args{end_depth} = ($current_is_index ? $current_url_depth + 1 : $current_url_depth) if (!defined $args{end_depth}); # set the root label if (!$args{labels}->{'/'}) { $args{labels}->{'/'} = 'Home'; } my @path_list = (); if ($args{preserve_paths}) { @path_list = filter_out_paths(%args, paths=>$args{paths}); } else { @path_list = extract_all_paths(paths=>$args{paths}, preserve_order=>$args{preserve_order}); @path_list = filter_out_paths(%args, paths=>\@path_list); } my @list_of_lists = build_lol(%args, paths=>\@path_list, depth=>0); $args{tree_depth} = 0; my %default_format = make_default_format(%args); my %formats = make_extra_formats(%args); my $list = traverse_lol(\@list_of_lists, %args, formats=>\%formats, current_format=>\%default_format, current_parents=>\%current_parents); return $list if $list; return ''; } # nav_tree =head1 Private Functions These functions cannot be exported. =head2 make_item $item = make_item( this_label=>$label, this_link=>$link, hide_ext=>0, current_url=>$url, current_parents=>\%current_parents, descriptions=>\%desc, format=>\%format, ); %format = ( pre_desc=>' ', post_desc=>'', pre_item=>'
    • ', post_item=>'
    • ' pre_active_item=>'', post_active_item=>'', pre_current_parent=>'', post_current_parent=>'', item_sep=>"\n"); ); Format a link item. See L for the formatting options. =over =item this_label The label of the required link. If there is no label, this uses the base-name of the last part of the link, capitalizing it and replacing underscores and dashes with spaces. =item this_link The URL of the required link. =item current_url The link to the current page. If one of the links equals this, then that is deemed to be the "active" link and is just displayed as a label rather than a link. =item current_parents URLs of the parents of the current item. =item descriptions Optional hash of descriptions, to put next to the links. The keys of this hash are the links (not the labels). =item defer_post_item Don't add the 'post_item' string if this is true. (needed for nested lists) (default: false) =item no_link Don't make a link for this, just a label. =back =cut sub make_item { my %args = ( this_link=>'', this_label=>'', hide_ext=>0, current_url=>'', current_parents=>{}, prefix_url=>'', defer_post_item=>0, no_link=>0, @_ ); my $link = $args{this_link}; my $prefix_url = $args{prefix_url}; my $label = $args{this_label}; my %format = %{$args{format}}; if (!$label) { $label = $link if !$label; if ($link =~ /([-\w]+)\.\w+$/o) # file { $label = $1; } elsif ($link =~ /([-\w]+)\/?$/o) # dir { $label = $1; } else # give up { $label = $link; $label =~ s#/# :: #go; } # prettify $label =~ s#_# #go; $label =~ s#-# #go; $label =~ s/(\b[a-z][-\w]+)/\u\L$1/go; } # if we are hiding the extensions of files # we need to display an extensionless link # while doing checks with the original link my $display_link = $link; if ($args{hide_ext}) { if ($link =~ /(.*)\.[-\w]+$/o) # file { $display_link = $1; } } my $item = ''; my $desc = ''; if (exists $args{descriptions}->{$link} and defined $args{descriptions}->{$link} and $args{descriptions}->{$link}) { $desc = join('', $format{pre_desc}, $args{descriptions}->{$link}, $format{post_desc}); } if (link_is_active(this_link=>$link, current_url=>$args{current_url})) { $item = join('', $format{pre_item_active}, $format{pre_active_item}, $label, $format{post_active_item}, $desc, ); } elsif ($args{no_link}) { $item = join('', $format{pre_item}, $label, $desc); } elsif ($args{current_url} and exists $args{current_parents}->{$link} and $args{current_parents}->{$link}) { $item = join('', $format{pre_item_current_parent}, $format{pre_current_parent}, '', $label, '', $format{post_current_parent}, $desc); } else { $item = join('', $format{pre_item}, '', $label, '', $desc); } if (!$args{defer_post_item}) { $item = join('', $item, $format{post_item}); } return $item; } # make_item =head2 make_canonical my $new_url = make_canonical($url); Make a URL canonical; remove the 'index.*' and add on a needed '/' -- this assumes that directory names never have a '.' in them. =cut sub make_canonical { my $url = shift; return $url if (!$url); if ($url =~ m{^/index\.\w+$}o) { $url = '/'; } elsif ($url =~ m{^(.*/)index\.\w+$}o) { $url = $1; } elsif ($url =~ m{/[-\w]+$}o) # no dots; a directory { $url = join('', $url, '/'); # add the slash } return $url; } # make_canonical =head2 get_index_path my $new_url = get_index_path($url); Get the "index" part of this path. That is, if this path is not for an index-page, then get the parent index-page path for this path. (Removes the trailing slash). =cut sub get_index_path { my $url = shift; return $url if (!$url); $url = make_canonical($url); if ($url =~ m{^(.*)/[-\w]+\.\w+$}o) { $url = $1; } elsif ($url ne '/' and $url =~ m{/$}o) { chop $url; } return $url; } # get_index_path =head2 get_index_parent my $new_url = get_index_parent($url); Get the parent of the "index" part of this path. (Removes the trailing slash). =cut sub get_index_parent { my $url = shift; return $url if (!$url); $url = get_index_path($url); if ($url =~ m#^(.*)/[-\w]+$#o) { $url = $1; } return $url; } # get_index_parent =head2 path_depth my $depth = path_depth($url); Calculate the "depth" of the given path. =cut sub path_depth { my $url = shift; return 0 if ($url eq '/'); # root is zero if ($url =~ m!/$!o) # remove trailing / { chop $url; } return scalar ($url =~ tr!/!/!); } # path_depth =head2 link_is_active if (link_is_active(this_link=>$link, current_url=>$url)) ... Check if the given link is "active", that is, if it matches the 'current_url'. =cut sub link_is_active { my %args = ( this_link=>'', current_url=>'', @_ ); # if there is no current link, is not active. return 0 if (!$args{current_url}); my $link = make_canonical($args{this_link}); return 1 if ($link eq $args{current_url}); return 0; } # link_is_active =head2 traverse_lol $links = traverse_lol(\@list_of_lists, labels=>\%labels, tree_depth=>$depth current_format=>\%format, ... ); Traverse the list of lists (of urls) to produce a nested collection of links. This consumes the list_of_lists! =cut sub traverse_lol { my $lol_ref = shift; my %args = ( current_url=>'', labels=>undef, prefix_url=>'', hide_ext=>0, @_ ); my $tree_depth = $args{tree_depth}; my %format = ( %{$args{current_format}}, (exists $args{formats}->{$tree_depth} ? %{$args{formats}->{$tree_depth}} : ()) ); my @items = (); while (@{$lol_ref}) { my $ll = shift @{$lol_ref}; if (!ref $ll) # an item { my $link = $ll; my $label = (exists $args{labels}->{$link} ? $args{labels}->{$link} : ''); my $item = make_item(this_link=>$link, this_label=>$label, defer_post_item=>1, %args, format=>\%format); if (ref $lol_ref->[0]) # next one is a list { $ll = shift @{$lol_ref}; my $sublist = traverse_lol($ll, %args, tree_depth=>$tree_depth + 1, current_format=>\%format); $item = join($format{tree_sep}, $item, $sublist); } $item = join('', $item, $format{post_item}); push @items, $item; } else # a reference to a list { if (defined $args{start_depth} && $args{tree_depth} < $args{start_depth}) { return traverse_lol($ll, %args, current_format=>\%format); } else { my $sublist = traverse_lol($ll, %args, tree_depth=>$tree_depth + 1, current_format=>\%format); my $item = join($format{tree_sep}, $format{pre_item}, $sublist); $item = join('', $item, $format{post_item}); push @items, $item; } } } my $list = join($format{item_sep}, @items); return join('', (($args{end_depth} && $tree_depth == $args{end_depth} ) ? $args{last_subtree_head} : $format{tree_head}), $list, (($args{end_depth} && $tree_depth == $args{end_depth} ) ? $args{last_subtree_foot} : $format{tree_foot}) ); } # traverse_lol =head2 extract_all_paths my @all_paths = extract_all_paths(paths=>\@paths, preserve_order=>0); Extract all possible paths out of a list of paths. Thus, if one has /foo/bar/baz.html then that would make / /foo/ /foo/bar/ /foo/bar/baz.html If 'preserve_order' is true, this preserves the ordering of the paths in the input list; otherwise the output paths are sorted alphabetically. =cut sub extract_all_paths { my %args = ( paths=>undef, preserve_order=>0, @_ ); my %paths = (); # keep track of the order of the paths in the list of paths my $order = 1; foreach my $path (@{$args{paths}}) { my @path_split = split('/', $path); # first path as-is $paths{$path} = $order; pop @path_split; while (@path_split) { # these paths are index-pages. should end in '/' my $newpath = join('/', @path_split, ''); # give this path the same order-num as the full path # but only if it hasn't already been added $paths{$newpath} = $order if (!exists $paths{$newpath}); pop @path_split; } $order++ if ($args{preserve_order}); } return sort { return $a cmp $b if ($paths{$a} == $paths{$b}); return $paths{$a} <=> $paths{$b}; } keys %paths; } # extract_all_paths =head2 extract_current_parents my %current_parents = extract_current_parents(current_url=>$url, exclude_root_parent=>0); Extract the "parent" paths of the current url /foo/bar/baz.html then that would make / /foo/ /foo/bar/ If 'exclude_root_parent' is true, then the '/' is excluded from the list of parents. =cut sub extract_current_parents { my %args = ( current_url=>undef, exclude_root_parent=>0, @_ ); my %paths = (); if ($args{current_url}) { my $current_url = $args{current_url}; my @path_split = split('/', $current_url); pop @path_split; # remove the current url while (@path_split) { # these paths are index-pages. should end in '/' my $newpath = join('/', @path_split, ''); $paths{$newpath} = 1; pop @path_split; } if ($args{exclude_root_parent}) { delete $paths{"/"}; } } return %paths; } # extract_current_parents =head2 build_lol my @lol = build_lol( paths=>\@paths, current_url=>$url, navbar_type=>'', ); Build a list of lists of paths, given a simple list of paths. Assumes that this list has already been filtered. =over =item paths Reference to list of paths; this is consumed. =back =cut sub build_lol { my %args = ( paths=>undef, depth=>0, start_depth=>0, end_depth=>0, current_url=>'', navbar_type=>'', prepend_list=>undef, append_list=>undef, @_ ); my $paths_ref = $args{paths}; my $depth = $args{depth}; my @list_of_lists = (); while (@{$paths_ref}) { my $path = $paths_ref->[0]; my $can_path = make_canonical($path); my $path_depth = path_depth($can_path); my $path_is_index = ($can_path =~ m#/$#o); if ($path_depth == $depth) { shift @{$paths_ref}; # use this path push @list_of_lists, $path; } elsif ($path_depth > $depth) { push @list_of_lists, [build_lol( %args, prepend_list=>undef, append_list=>undef, paths=>$paths_ref, depth=>$path_depth, navbar_type=>$args{navbar_type}, current_url=>$args{current_url}, )]; } elsif ($path_depth < $depth) { return @list_of_lists; } } # prepend the given list to the top level if (defined $args{prepend_list} and @{$args{prepend_list}}) { # if the list of lists is a single item which is a list # then add the extra list to that item if ($#list_of_lists == 0 and ref($list_of_lists[0]) eq "ARRAY") { unshift @{$list_of_lists[0]}, @{$args{prepend_list}}; } else { unshift @list_of_lists, @{$args{prepend_list}}; } } # append the given list to the top level if (defined $args{append_list} and @{$args{append_list}}) { # if the list of lists is a single item which is a list # then add the extra list to that item if ($#list_of_lists == 0 and ref($list_of_lists[0]) eq "ARRAY") { push @{$list_of_lists[0]}, @{$args{append_list}}; } else { push @list_of_lists, @{$args{append_list}}; } } return @list_of_lists; } # build_lol =head2 filter_out_paths my @filtered_paths = filter_out_paths( paths=>\@paths, current_url=>$url, hide=>$hide, nohide=>$nohide, start_depth=>$start_depth, end_depth=>$end_depth, top_level=>$top_level, navbar_type=>'', ); Filter out the paths we don't want from our list of paths. Returns a list of the paths we want. =cut sub filter_out_paths { my %args = ( paths=>undef, start_depth=>0, end_depth=>0, top_level=>0, current_url=>'', navbar_type=>'', hide=>'', nohide=>'', @_ ); my $paths_ref = $args{paths}; my $hide = $args{hide}; my $nohide = $args{nohide}; my %canon_paths = (); my @wantedpaths1 = (); my %path_depth = (); # filter out common things # remember canonical paths and path depths foreach my $path (@{$paths_ref}) { my $can_path = make_canonical($path); my $path_depth = path_depth($can_path); if ($hide and $nohide and not($path =~ /$nohide/) and $path =~ /$hide/) { # skip this one } elsif ($hide and !$nohide and $path =~ /$hide/) { # skip this one } elsif ($path_depth < $args{start_depth}) { # skip this one } elsif ($args{end_depth} and $path_depth > $args{end_depth}) { # skip this one } else { $path_depth{$path} = $path_depth; $canon_paths{$path} = $can_path; push @wantedpaths1, $path; } } my @wantedpaths = (); if ($args{current_url}) { my $current_url = $args{current_url}; my $current_url_depth = path_depth($args{current_url}); my $current_url_is_index = ($args{current_url} =~ m{/$}o); my $parent = make_canonical($current_url_is_index ? get_index_parent($args{current_url}) : get_index_path($args{current_url}) ); my $parent_depth = path_depth($parent); my $grandparent = ($parent_depth == 1 ? '/' : make_canonical(get_index_parent($parent))); my $greatgrandparent = ($parent_depth <= 1 ? '' : ($parent_depth == 2 ? '/' : make_canonical(get_index_parent($grandparent)) ) ); my $current_index_path = get_index_path($args{current_url}); my $current_index_parent = get_index_parent($args{current_url}); if ($args{navbar_type} eq 'breadcrumb') { foreach my $path (@wantedpaths1) { my $pd = $path_depth{$path}; # a breadcrumb-navbar shows the parent, self, # and the children the parent if ($pd <= $current_url_depth and $args{current_url} =~ /^$path/) { push @wantedpaths, $path; } elsif ($path eq $args{current_url}) { push @wantedpaths, $path; } elsif ($pd >= $current_url_depth and $path =~ m{^${current_url}}) { push @wantedpaths, $path; } elsif ($parent and $pd >= $current_url_depth and $path =~ m{^$parent}) { push @wantedpaths, $path; } } } elsif ($args{navbar_type} or $args{do_navbar}) { # Rules for navbars: # * if I am a leaf node, see my (great)uncles and siblings # * if have children, use the same data as my parent, # plus my immediate children foreach my $path (@wantedpaths1) { my $pd = $path_depth{$path}; if ($pd > $current_url_depth + 1) { next; } if ($pd == $current_url_depth + 1 and $path =~ m{^${current_url}}) { push @wantedpaths, $path; } elsif ($pd == $current_url_depth and $path =~ m{^${parent}}) { push @wantedpaths, $path; } elsif ($grandparent and $pd == $parent_depth and $path =~ m{^$grandparent}) { push @wantedpaths, $path; } elsif ($greatgrandparent and $pd == $parent_depth - 1 and $path =~ m{^$greatgrandparent}) { push @wantedpaths, $path; } } } else { push @wantedpaths, @wantedpaths1; } } else { push @wantedpaths, @wantedpaths1; } return @wantedpaths; } # filter_out_paths =head2 make_default_format my %default_format = make_default_format(%args); Make the default format hash from the args. Returns a hash of format options. =cut sub make_default_format { my %args = ( links_head=>'
        ', links_foot=>"\n
      ", subtree_head=>'
        ', subtree_foot=>"\n
      ", last_subtree_head=>'
        ', last_subtree_foot=>"\n
      ", pre_item=>'
    • ', post_item=>'
    • ', pre_active_item=>'', post_active_item=>'', pre_current_parent=>'', post_current_parent=>'', item_sep=>"\n", tree_sep=>"\n", @_ ); my %default_format = ( pre_item=>$args{pre_item}, post_item=>$args{post_item}, pre_active_item=>$args{pre_active_item}, post_active_item=>$args{post_active_item}, pre_current_parent=>$args{pre_current_parent}, post_current_parent=>$args{post_current_parent}, pre_desc=>$args{pre_desc}, post_desc=>$args{post_desc}, item_sep=>$args{item_sep}, tree_sep=>$args{tree_sep}, tree_head=>$args{links_head}, tree_foot=>$args{links_foot}, pre_item_active=>($args{pre_item_active} ? $args{pre_item_active} : $args{pre_item}), pre_item_current_parent=> ($args{pre_item_current_parent} ? $args{pre_item_current_parent} : $args{pre_item}), ); return %default_format; } # make_default_format =head2 make_extra_formats my %formats = make_extra_formats(%args); Transforms the subtree_head and subtree_foot into the "formats" method of formatting. Returns a hash of hashes of format options. =cut sub make_extra_formats { my %args = ( formats=>undef, links_head=>'
        ', links_foot=>"\n
      ", subtree_head=>'
        ', subtree_foot=>"\n
      ", last_subtree_head=>'
        ', last_subtree_foot=>"\n
      ", pre_item=>'
    • ', post_item=>'
    • ', pre_item_active=>'
    • ', pre_item_current_parent=>'
    • ', pre_active_item=>'', post_active_item=>'', pre_current_parent=>'', post_current_parent=>'', item_sep=>"\n", tree_sep=>"\n", @_ ); my %formats = (); if (defined $args{formats}) { %formats = %{$args{formats}}; } if ($args{links_head} ne $args{subtree_head} || $args{links_foot} ne $args{subtree_foot}) { if (!exists $formats{1}) { $formats{1} = {}; } $formats{1}->{tree_head} = $args{subtree_head}; $formats{1}->{tree_foot} = $args{subtree_foot}; } return %formats; } # make_extra_formats =head1 REQUIRES Test::More =head1 INSTALLATION To install this module, run the following commands: perl Build.PL ./Build ./Build test ./Build install Or, if you're on a platform (like DOS or Windows) that doesn't like the "./" notation, you can do this: perl Build.PL perl Build perl Build test perl Build install In order to install somewhere other than the default, such as in a directory under your home directory, like "/home/fred/perl" go perl Build.PL --install_base /home/fred/perl as the first step instead. This will install the files underneath /home/fred/perl. You will then need to make sure that you alter the PERL5LIB variable to find the modules. Therefore you will need to change the PERL5LIB variable to add /home/fred/perl/lib PERL5LIB=/home/fred/perl/lib:${PERL5LIB} =head1 SEE ALSO perl(1). =head1 BUGS Please report any bugs or feature requests to the author. =head1 AUTHOR Kathryn Andersen (RUBYKAT) perlkat AT katspace dot com http://www.katspace.com/tools/html_linklist/ =head1 COPYRIGHT AND LICENCE Copyright (c) 2006 by Kathryn Andersen This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut 1; # End of HTML::LinkList __END__ release-distmeta.t100644001750001751 43012641340604 16535 0ustar00katkat000000000000HTML-LinkList-0.1701/t#!perl BEGIN { unless ($ENV{RELEASE_TESTING}) { require Test::More; Test::More::plan(skip_all => 'these tests are for release candidate testing'); } } # This file was automatically generated by Dist::Zilla::Plugin::MetaTests. use Test::CPAN::Meta; meta_yaml_ok(); 00-report-prereqs.t100644001750001751 1273112641340604 16563 0ustar00katkat000000000000HTML-LinkList-0.1701/t#!perl use strict; use warnings; # This test was generated by Dist::Zilla::Plugin::Test::ReportPrereqs 0.021 use Test::More tests => 1; use ExtUtils::MakeMaker; use File::Spec; # from $version::LAX my $lax_version_re = qr/(?: undef | (?: (?:[0-9]+) (?: \. | (?:\.[0-9]+) (?:_[0-9]+)? )? | (?:\.[0-9]+) (?:_[0-9]+)? ) | (?: v (?:[0-9]+) (?: (?:\.[0-9]+)+ (?:_[0-9]+)? )? | (?:[0-9]+)? (?:\.[0-9]+){2,} (?:_[0-9]+)? ) )/x; # hide optional CPAN::Meta modules from prereq scanner # and check if they are available my $cpan_meta = "CPAN::Meta"; my $cpan_meta_pre = "CPAN::Meta::Prereqs"; my $HAS_CPAN_META = eval "require $cpan_meta; $cpan_meta->VERSION('2.120900')" && eval "require $cpan_meta_pre"; ## no critic # Verify requirements? my $DO_VERIFY_PREREQS = 1; sub _max { my $max = shift; $max = ( $_ > $max ) ? $_ : $max for @_; return $max; } sub _merge_prereqs { my ($collector, $prereqs) = @_; # CPAN::Meta::Prereqs object if (ref $collector eq $cpan_meta_pre) { return $collector->with_merged_prereqs( CPAN::Meta::Prereqs->new( $prereqs ) ); } # Raw hashrefs for my $phase ( keys %$prereqs ) { for my $type ( keys %{ $prereqs->{$phase} } ) { for my $module ( keys %{ $prereqs->{$phase}{$type} } ) { $collector->{$phase}{$type}{$module} = $prereqs->{$phase}{$type}{$module}; } } } return $collector; } my @include = qw( ); my @exclude = qw( ); # Add static prereqs to the included modules list my $static_prereqs = do 't/00-report-prereqs.dd'; # Merge all prereqs (either with ::Prereqs or a hashref) my $full_prereqs = _merge_prereqs( ( $HAS_CPAN_META ? $cpan_meta_pre->new : {} ), $static_prereqs ); # Add dynamic prereqs to the included modules list (if we can) my ($source) = grep { -f } 'MYMETA.json', 'MYMETA.yml'; if ( $source && $HAS_CPAN_META ) { if ( my $meta = eval { CPAN::Meta->load_file($source) } ) { $full_prereqs = _merge_prereqs($full_prereqs, $meta->prereqs); } } else { $source = 'static metadata'; } my @full_reports; my @dep_errors; my $req_hash = $HAS_CPAN_META ? $full_prereqs->as_string_hash : $full_prereqs; # Add static includes into a fake section for my $mod (@include) { $req_hash->{other}{modules}{$mod} = 0; } for my $phase ( qw(configure build test runtime develop other) ) { next unless $req_hash->{$phase}; next if ($phase eq 'develop' and not $ENV{AUTHOR_TESTING}); for my $type ( qw(requires recommends suggests conflicts modules) ) { next unless $req_hash->{$phase}{$type}; my $title = ucfirst($phase).' '.ucfirst($type); my @reports = [qw/Module Want Have/]; for my $mod ( sort keys %{ $req_hash->{$phase}{$type} } ) { next if $mod eq 'perl'; next if grep { $_ eq $mod } @exclude; my $file = $mod; $file =~ s{::}{/}g; $file .= ".pm"; my ($prefix) = grep { -e File::Spec->catfile($_, $file) } @INC; my $want = $req_hash->{$phase}{$type}{$mod}; $want = "undef" unless defined $want; $want = "any" if !$want && $want == 0; my $req_string = $want eq 'any' ? 'any version required' : "version '$want' required"; if ($prefix) { my $have = MM->parse_version( File::Spec->catfile($prefix, $file) ); $have = "undef" unless defined $have; push @reports, [$mod, $want, $have]; if ( $DO_VERIFY_PREREQS && $HAS_CPAN_META && $type eq 'requires' ) { if ( $have !~ /\A$lax_version_re\z/ ) { push @dep_errors, "$mod version '$have' cannot be parsed ($req_string)"; } elsif ( ! $full_prereqs->requirements_for( $phase, $type )->accepts_module( $mod => $have ) ) { push @dep_errors, "$mod version '$have' is not in required range '$want'"; } } } else { push @reports, [$mod, $want, "missing"]; if ( $DO_VERIFY_PREREQS && $type eq 'requires' ) { push @dep_errors, "$mod is not installed ($req_string)"; } } } if ( @reports ) { push @full_reports, "=== $title ===\n\n"; my $ml = _max( map { length $_->[0] } @reports ); my $wl = _max( map { length $_->[1] } @reports ); my $hl = _max( map { length $_->[2] } @reports ); if ($type eq 'modules') { splice @reports, 1, 0, ["-" x $ml, "", "-" x $hl]; push @full_reports, map { sprintf(" %*s %*s\n", -$ml, $_->[0], $hl, $_->[2]) } @reports; } else { splice @reports, 1, 0, ["-" x $ml, "-" x $wl, "-" x $hl]; push @full_reports, map { sprintf(" %*s %*s %*s\n", -$ml, $_->[0], $wl, $_->[1], $hl, $_->[2]) } @reports; } push @full_reports, "\n"; } } } if ( @full_reports ) { diag "\nVersions for all modules listed in $source (including optional ones):\n\n", @full_reports; } if ( @dep_errors ) { diag join("\n", "\n*** WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING ***\n", "The following REQUIRED prerequisites were not satisfied:\n", @dep_errors, "\n" ); } pass; # vim: ts=4 sts=4 sw=4 et: 00-report-prereqs.dd100644001750001751 330112641340604 16660 0ustar00katkat000000000000HTML-LinkList-0.1701/tdo { my $x = { 'build' => { 'requires' => { 'Module::Build' => '0.28' } }, 'configure' => { 'requires' => { 'Module::Build' => '0.28' } }, 'develop' => { 'requires' => { 'Pod::Coverage::TrustPod' => '0', 'Test::CPAN::Meta' => '0', 'Test::Pod' => '1.41', 'Test::Pod::Coverage' => '1.08' } }, 'runtime' => { 'requires' => { 'Data::Dumper' => '0', 'Exporter' => '0', 'strict' => '0', 'warnings' => '0' } }, 'test' => { 'recommends' => { 'CPAN::Meta' => '2.120900' }, 'requires' => { 'ExtUtils::MakeMaker' => '0', 'File::Spec' => '0', 'IO::Handle' => '0', 'IPC::Open3' => '0', 'Test::More' => '0', 'perl' => '5.006' } } }; $x; }release-pod-syntax.t100644001750001751 45612641340604 17041 0ustar00katkat000000000000HTML-LinkList-0.1701/t#!perl BEGIN { unless ($ENV{RELEASE_TESTING}) { require Test::More; Test::More::plan(skip_all => 'these tests are for release candidate testing'); } } # This file was automatically generated by Dist::Zilla::Plugin::PodSyntaxTests. use Test::More; use Test::Pod 1.41; all_pod_files_ok(); 40_breadcrumb_trail.t100644001750001751 157612641340604 17145 0ustar00katkat000000000000HTML-LinkList-0.1701/t# testing dir_tree use strict; use Test::More tests => 4; use HTML::LinkList qw(breadcrumb_trail); my @links = qw( /foo/bar/baz.html /foo/bar/thing.html /foo/wibble.html /fooish.html /bringle/ /tray/nav.html /tray/tea_tray.html ); my %labels = ( '/tray/nav.html' => 'Navigation', '/foo/bar/baz.html' => 'Bazzy', ); my $link_html = ''; # default $link_html = breadcrumb_trail(labels=>\%labels, current_url=>'/foo/bar/baz.html'); ok($link_html, "(1) default; links HTML"); my $ok_str = ''; $ok_str = '

      Home > Foo > Bar > Bazzy

      '; is($link_html, $ok_str, "(1) default; values match"); # root $link_html = breadcrumb_trail(labels=>\%labels, current_url=>'/index.html'); ok($link_html, "(2) root; links HTML"); $ok_str = '

      Home

      '; is($link_html, $ok_str, "(2) root; values match"); release-has-version.t100644001750001751 47312641340604 17170 0ustar00katkat000000000000HTML-LinkList-0.1701/t#!perl BEGIN { unless ($ENV{RELEASE_TESTING}) { require Test::More; Test::More::plan(skip_all => 'these tests are for release candidate testing'); } } use Test::More; eval "use Test::HasVersion"; plan skip_all => "Test::HasVersion required for testing version numbers" if $@; all_pm_version_ok(); release-portability.t100644001750001751 53512641340604 17273 0ustar00katkat000000000000HTML-LinkList-0.1701/t#!perl BEGIN { unless ($ENV{RELEASE_TESTING}) { require Test::More; Test::More::plan(skip_all => 'these tests are for release candidate testing'); } } use strict; use warnings; use Test::More; eval 'use Test::Portability::Files'; plan skip_all => 'Test::Portability::Files required for testing portability' if $@; run_tests(); release-pod-coverage.t100644001750001751 57212641340604 17305 0ustar00katkat000000000000HTML-LinkList-0.1701/t#!perl BEGIN { unless ($ENV{RELEASE_TESTING}) { require Test::More; Test::More::plan(skip_all => 'these tests are for release candidate testing'); } } # This file was automatically generated by Dist::Zilla::Plugin::PodCoverageTests. use Test::Pod::Coverage 1.08; use Pod::Coverage::TrustPod; all_pod_coverage_ok({ coverage_class => 'Pod::Coverage::TrustPod' });