Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

Re^6: RFC: Proofread the POD for my HTML elements module

by Don Coyote (Monk)
on Apr 23, 2013 at 11:53 UTC ( #1030115=note: print w/ replies, xml ) Need Help??


in reply to Re^5: RFC: Proofread the POD for my HTML elements module
in thread RFC: Proofread the POD for my HTML elements module

Pod. I put pod =head2 headings above each of the exportable routines in the code. I am not sure this is any easier to read, but you can see which pod relates to which part of code. I then cut and paste your pod over into the relevant spaces, and where there were conflicts just pasted your pod as is. This may help to show where the function descriptions and general module implementation descriptions and examples need to be refined.

changed use base 'Exporter'; to use Exporter qw(import); not extending import so no need to become an Exporter.

Tabs. extending the import routine may have been overkill. using deparse to get at teh child elements may not be overkill, rather it may be necessary, but in reality highlights ineffective code.

I quite like the idea of extending the import and using a pragma to set a module variable. But for simplicity, I have converted this into a settable variable.

The idea is that whenever you would call $tab in the module code to open a tag you now call the tab ascenscion routine, $ref to (CODE) to return the increased level, and the the same for descenscion, but a different $ref to (CODE)

Now the user only has to set the $HTML::LadyAleenaStyle::inlvl variable to a suitable number. Because in the Module you replace the $tab variables throughought the element subs with calls to &$ina for ascending tab depth, and &$ind for descending tab depth. And remove $tab assignement from special array.

This still does not work perfectly, as it now only indents the parent element itself rather than the child elements. This is probably far simpler than trying to deparse code during sub calls to see what the user may have in store for us, which we probably should not be doing anyway. And, I'm just getting my head round inheritance and callbacks right now. I have also thus far refrained from viewing CGI.pm source, lest the old copy and paste button inexplicably resembles free beer.

again code untested, figurative...

package HTML::LadyAleenaStyle; use strict; use warnings; use Exporter qw(import); our @EXPORT_OK = qw(title script heading anchor paragraph sparagraph l +ist definition_list table form fieldset legend label selection input textarea div pre); use HTML::Entities qw(encode_entities); use Base::Data qw(data_file get_hash); use Base::Nifty qw(sline line); =head1 NAME B<HTML::Element> generates HTML tags for most of the HTML elements. =head1 SYNOPSIS To use B<Element> to print HTML tags, use the following. use Base::HTML::Element qw( title heading script anchor paragraph sparagraph list definition_l +ist table form fieldset selection input textarea div pre ); ## Module Vars =head3 C<indentation> To print readable html, set the indentation to the level. Can be 0 - 9 +. Each level constitutes a tab space multiplier applied to child elements (according to dominterpretation?). Default i +s no indentation in output or 0 level. $HTML::LadyAleenaStyle::inlvl = 7; Each child element will be indented seven tab stops from the relevant +parent element =cut $HTML::LadyAleenaStyle::inlvl = 0 unless $HTML::LadyAleenaStyle::inlvl +; # default indentation none; ### set module variables if required in calling script. sub in_depth { state $level = 0; # requires Perl version 5.10 return ( sub { $level += $HTML::LadyAleenaStyle::inlvl }, sub { $level -= $HTML::LadyAleenaStyle::inlvl }, ); } my ($ina,$ind) = in_depth; # now replace the $tab variables throughought the element subs with ca +lls to # &$ina for ascending tab depth, # &$ind for descending tab depth, # and remove $tab assignement from secial array. # for example in sub div: # # sub div{ # # my ($code,$opt) = @_; # no $tab # my $tag = 'div'; # my $open = open_tag($tag,$opt,[@ics,@java]); # # line(&$ina,qq(<$open>)); # indent depth increase # &$code; # line(&$ind,qq(</$tag>)); # indent depth decrease # } #

all the code here

package HTML::LadyAleenaStyle; use strict; use warnings; use Exporter qw(import); our @EXPORT_OK = qw(title script heading anchor paragraph sparagraph l +ist definition_list table form fieldset legend label selection input textarea div pre); use HTML::Entities qw(encode_entities); use Base::Data qw(data_file get_hash); use Base::Nifty qw(sline line); =head1 NAME B<HTML::Element> generates HTML tags for most of the HTML elements. =head1 SYNOPSIS To use B<Element> to print HTML tags, use the following. use Base::HTML::Element qw( title heading script anchor paragraph sparagraph list definition_l +ist table form fieldset selection input textarea div pre ); ## Module Vars =head3 C<indentation> To print readable html, set the indentation to the level. Can be 0 - 9 +. Each level constitutes a tab space multiplier applied to child elements (according to dominterpretation?). Default i +s no indentation in output or 0 level. $HTML::LadyAleenaStyle::inlvl = 7; Each child element will be indented seven tab stops from the relevant +parent element =cut $HTML::LadyAleenaStyle::inlvl = 0 unless $HTML::LadyAleenaStyle::inlvl +; # default indentation none; ### set module variables if required in calling script. sub in_depth { state $level = 0; # requires Perl version 5.10 return ( sub { $level += $HTML::LadyAleenaStyle::inlvl }, sub { $level -= $HTML::LadyAleenaStyle::inlvl }, ); } my ($ina,$ind) = in_depth; # now replace the $tab variables throughought the element subs with ca +lls to # &$ina for ascending tab depth, # &$ind for descending tab depth, # and remove $tab assignement from secial array. # for example in sub div: # # sub div{ # # my ($code,$opt) = @_; # no $tab # my $tag = 'div'; # my $open = open_tag($tag,$opt,[@ics,@java]); # # line(&$ina,qq(<$open>)); # indent depth increase # &$code; # line(&$ind,qq(</$tag>)); # indent depth decrease # } # ## Module Subs } sub get_attributes { my ($options, $valid) = @_; my @attributes; for (@{$valid}) { my $value = $options->{$_}; push @attributes, qq($_="$value") if defined($options->{$_}); } return join(' ',('',@attributes)); } sub open_tag { my ($tag,$opt,$attributes) = @_; my $tag_attributes = get_attributes($opt,$attributes); return $tag.$tag_attributes; } sub plain_element { my ($tag,$attributes,$tab,$value,$opt) = @_; my $open = open_tag($tag,$opt,$attributes); return sline($tab,"<$open>$value</$tag>"); } ## lexical vars #? maybe should be package variables? unless restricti +ng access, then should be constants? my @ics = ('id','class','style'); my @java = qw(onclick ondblclick onkeypress onkeydown onkeyup onmouseo +ver onmousedown onmouseup onmousemove onmouseout); =head1 FUNCTIONS All of the functions C<print> the elements with the exception of C<anc +hor> which returns the anchor and C<sparagraph> which returns a paragraph for use in other functions. As with the Perl community, the HTML community expects some indentatio +n so tabs, the first parameter of every function, are included with each element except where noted. The last parameter of every element is a hash with named options excep +t where noted. Most elements have the C<id>, C<class>, C<style>, and scripting options (such as C<onclick>). Only t +he options specific to the element will be noted. =cut # Start elements =head2 C<anchor> B<C<anchor>> has a value and the optional parameters C<href>, C<target +>, and C<title>. C<anchor> does not not get a C<tab>. anchor('Anchor text', { href => 'link location', target => 'where the link opens', title => 'alternate text', id => 'anchor_id', class => 'anchor_classes', style => 'anchor_styles' }); =cut sub anchor { my ($value,$opt) = @_; my $tag = 'a'; my $open = open_tag($tag,$opt,['href','target','title',@ics,@java]); return "<$open>$value</$tag>"; } =head2 C<title> B<C<title>> has a value but no options. title($tab, 'My page title'); =cut sub title { my ($tab,$value,$opt) = @_; my $tag = 'title'; my $open = $tag; line($tab,"<$open>$value</$tag>"); } =head2 C<script> B<C<script>> has optional parameters which are C<type> and C<src>. script($tab,{ type => 'text/javascript', # or other type src => 'script.ext' }); =cut sub script { my ($tab,$opt) = @_; my $tag = 'script'; my $open = open_tag($tag,$opt,['type','src']); line($tab,"<$open></$tag>"); } =head2 C<heading> B<C<heading>> has the heading level, value, and optional parameters. heading($tab, 2, 'My second level heading', { id => 'heading_id', class => 'heading_classes', style => 'heading_styles' }); =cut sub heading { my ($tab,$level,$value,$opt) = @_; my $tag = 'h'.$level; print plain_element($tag,[@ics,@java],$tab,$value,$opt); } ###### Begin paragraphs =head2 paragraphs B<C<paragraph>> and B<C<sparagraph>> have a value and the optional par +ameter C<separator>. B<C<paragraph>> prints the paragraph(s), and B<C<sparagraph>> returns +the paragraph(s). The C<separator> option allows you to input more than one paragraph per use of this function. =head2 C<sparagraph> pod to do =cut sub sparagraph { my ($tab,$value,$opt) = @_; my $tag = 'p'; my $open = open_tag($tag,$opt,[@ics,@java]); my $sep = $opt->{separator} ? $opt->{separator} : "\n"; my $line; for (grep(length,split(/$sep/,$value))) { $line .= sline($tab,qq(<$open>)); $line .= sline($tab + 1,$_); $line .= sline($tab,qq(</$tag>)); } return $line; } =head2 C<paragraph> paragraph($tab, 'My paragraph(s)', { id => 'paragraph_id', class => 'paragraph_classes', style => 'paragraph_styles' separator => 'paragraph_separator' }); =cut sub paragraph { print sparagraph(@_); } #### End paragraphs #### Begin elements for ordered and unordered lists. =head3 Setting up the list items If you do not want your list items formatted, you can pass your array +as is. If you want your list items formatted, the formatted items are also array references with the optional parameter +C<inlist>. 'unformatted value', ['formatted value', { id => 'item_id', class => 'item_class', style => 'item_style', inlist => ['u', \@inner_list, { list options }] }], 'another unformatted value' =cut =head2 C<item> pod to do =cut sub item { my ($tab,$value,$opt) = @_; my $tag = 'li'; my $open = open_tag($tag,$opt,[@ics,@java]); line($tab,qq(<$open>)); line($tab + 1,$value); if ($opt->{inlist}) { list($tab + 1, @{$opt->{inlist}}); } line($tab,qq(</$tag>)); } =head2 C<list> B<C<list>> has type, list, and the optional parameters. C<type> is C<u> for an unordered list or C<o> for an ordered list. The + C<list> parameter is an array reference. list($tab, 'u', \@list, { id => 'list_id', class => 'list_class' style => 'list_style, }); =cut sub list { my ($tab,$type,$list,$opt) = @_; my $tag = $type.'l'; my $open = open_tag($tag,$opt,[@ics,@java]); line($tab,qq(<$open>)); for my $item (@$list) { if (ref($item) eq 'ARRAY') { item($tab + 1,$item->[0],$item->[1]); } else { item($tab + 1,$item); } } line($tab,qq(</$tag>)); } sub definition_list{ placeholder } #? is there a definition_list sub +? #### End elements for ordered and unordered lists. #### Begin elements for definition lists. =head2 C<term> pod to do =cut sub term { print plain_element('dt',[@ics,@java],@_); } =head2 C<definition> pod to do =cut sub definition { my ($tab,$value,$opt) = @_; my $tag = 'dd'; my $open = open_tag($tag,$opt,[@ics,@java]); line($tab,qq(<$open>)); line($tab + 1,$value); line($tab,qq(</$tag>)); } # I will be rewriting definition_list to get rid of the data gathering + within it. =head2 C<definition_list> I<I have to tear out some code to make it work like the others.> pod to do =cut sub definition_list { my ($tab,$opt) = @_; my $tag = 'dl'; my $open = open_tag($tag,$opt,[@ics,@java]); my %definition_list = get_hash( file => $opt->{file} ? $opt->{file} : data_file, headings => [@{$opt->{headings}}], sorted => 'yes', ); line($tab,qq(<$open>)); my $term = shift @{$opt->{headings}}; for my $term (sort {$definition_list{$a}{sort_number} <=> $definitio +n_list{$b}{sort_number}} keys %definition_list) { term($tab + 1,$term); if (@{$opt->{headings}} == 1) { definition($tab + 2,$definition_list{$term}{$opt->{headings}->[0 +]}); } else { for my $heading (@{$opt->{headings}}) { my $upheading = ucfirst $heading; definition($tab + 2,qq(<b>$upheading:</b> ).encode_entities($d +efinition_list{$term}{$heading})); } } } line($tab,qq(</$tag>)); } # End elements for definition lists. # Begin elemeents for tables. =head3 Setting up the caption C<caption> is a value, as seen above, or an array refernce. The C<capt +ion> has the optional parameter C<align>. ['table caption', { id => 'caption_id', class => 'caption_class', style => 'caption_style', align => 'caption_align' }], =cut =head2 C<caption> pod to do =cut sub caption { print plain_element('caption',['align',@ics,@java],@_); } =head4 Setting up the cells If you do not want your cells formatted, you can pass your array as is +. If you want your cells formatted, the formatted cells are also array references with optional parameters C<list> and C +<type_override>. The C<list> option is the same as the C<inlist> option for L<list items|/Setting up the list items>. +If you need to override the row type, use C<type_override>. 'unformatted value', ['formatted value', { id => 'cell_id', class => 'cell_class', style => 'cell_style', }], ['list', { id => 'cell_with_list_id', class => 'cell_class', style => 'cell_style', list => ['u', \@list_in_cell, { list options }] }], ['formatted value', { id => 'cell_id', class => 'cell_class', style => 'cell_style', type_override => 'h', }], 'another unformatted value' =cut =head2 C<cell> pod to do =cut sub cell { my ($tab,$type,$value,$opt) = @_; $type = $opt->{type_override} ? $opt->{type_override} : $type; my $tag = 't'.$type; my $open = open_tag($tag,$opt,['colspan','rowspan',@ics,@java]); line($tab,qq(<$open>)); if ($value eq 'list') { list($tab + 1,@{$opt->{list}}); } else { line($tab + 1,$value); } line($tab,qq(</$tag>)); } =head3 Setting up the rows Each C<row> is an array reference with C<type>, C<cells>, and optional + parameters. You need to know type of cells are in the row. =over =item * C<header> is a row with only headings. There is only one row allowed i +n C<header>. =item * C<data> is a group of rows with only data. =item * C<whead> is a group of rows with a heading then data. =back rows => [ ['header',\@headings, { id => 'header_row_id', class => 'header_row_class', style => 'header_row_style }], ['data',\@data { id => 'data_row_id', class => 'data_row_class', style => 'data_row_style }], ['whead',\@data_with_heading], ], =cut =head2 C<row> pod to do =cut sub row { my ($tab,$type,$cells,$opt) = @_; my $tag = 'tr'; my $open = open_tag($tag,$opt,[@ics,@java]); my %types = ( header => 'h', data => 'd', whead => 'd' ); line($tab,qq(<$open>)); if ($type eq 'whead') { my $cell = shift @{$cells}; if (ref($cell) eq 'ARRAY') { cell($tab + 1,'h',ucfirst $cell->[0], { class => 'row_header', $ +cell->[1] }); } else { cell($tab + 1,'h',ucfirst $cell, { class => 'row_header' }); } } my $cell_type = $types{$type}; for my $cell (@{$cells}) { if (ref($cell) eq 'ARRAY') { cell($tab + 1,$cell_type,$cell->[0],$cell->[1]); } else { cell($tab + 1,$cell_type,$cell); } } line($tab,qq(</$tag>)); } =head3 Setting up the columns Each C<column> is an array reference of hash references and each has t +he optional parameter C<span>. { id => 'col_id', class => 'col_class', style => 'col_style' span => 2, }, =cut =head2 C<col> pod to do =cut sub col { my ($tab,$opt) = @_; my $tag = 'col'; my $open = open_tag($tag,$opt,['span',@ics,@java]); line($tab,qq(<$open>)); } =head2 C<cols> pod to do =cut sub cols { my ($tab,$cols) = @_; col($tab,$_) for @{$cols}; } =head2 C<table> Before you go any further, if you plan on using a table for layout, B< +I<STOP!>> Tables are for tabular data, use L<div|/div> elements to lay out your webpage. B<C<table>> has the optional parameters of C<caption>, C<cols>, and C< +rows>. C<cols> and C<rows> are array references. table($tab, { id => 'table_id', class => 'table_class', style => 'table_style', caption => 'table caption', cols => \@cols, rows => \@rows, }); =cut sub table { my ($tab,$opt) = @_; my $tag = 'table'; my $open = open_tag($tag,$opt,[@ics,@java]); line($tab,qq(<$open>)); if ($opt->{caption}) { if (ref($opt->{caption}) eq 'ARRAY') { caption($tab + 1, $opt->{caption}->[0],$opt->{caption}->[1]); } else { caption($tab + 1, $opt->{caption}); } } if ($opt->{cols}) { col($tab + 1, $_) for @{$opt->{cols}}; } for my $rowgroup (@{$opt->{rows}}) { my $type = $rowgroup->[0]; my @rows = $rowgroup->[1]; my $attributes = $rowgroup->[2]; if ($type eq 'header') { row($tab + 1, $type , @rows, $attributes); } else { for my $row (@rows) { row($tab + 1, $type , $_, $attributes) for @$row; } } } line($tab,qq(</$tag>)); } # End elements for tables. # Start elements for forms. =head2 C<label> pod to do =cut sub label { print plain_element('label',['for',@ics,@java],@_); } =head2 C<option> pod to do =cut sub option { print plain_element('option',['value',@ics,@java],@_); } =head3 C<selection> B<C<selection>> has options and the optional parameters C<name>, C<mul +tiple>, and C<label>. selection($tab, \@options, { name => 'select_name', multiple => 'multiple', label => ['label text', { for => 'select_name', id => 'label_id', class => 'label_class', style => 'label_style' } id => 'select_id', class => 'select_class', style => 'select_style' }); =head4 Setting up the options If you do not want your options formatted, all you need to do is pass +the text and C<value> of the option. If you want formatting, you need to pass the other optional parameters. ['unformatted option', { value => 'unformatted' }], ['formatted option', { value => 'formatted', id => 'option_id', class => 'option_class', style => 'option_style' }] =cut =head2 C<selection> pod to do =cut sub selection { my ($tab,$options,$opt) = @_; my $tag = 'select'; my $open = open_tag($tag,$opt,['name','multiple',@ics,@java]); label($tab,@{$opt->{label}}) if ($opt->{label} && $opt->{place_label +} eq 'before'); line($tab,qq(<$open>)); for (@$options) { option($tab + 1,@$_); } line($tab,qq(</$tag>)); label($tab,@{$opt->{label}}) if ($opt->{label} && $opt->{place_label +} eq 'after'); } =head2 C<textarea> pod to do =cut sub textarea { my ($tab,$value,$opt) = @_; my $tag = 'textarea'; my $open = open_tag($tag,$opt,['name','rows','cols',@ics,@java]); label($tab,@{$opt->{label}}) if ($opt->{label} && $opt->{place_label +} eq 'before'); line($tab,"<$open>$value</$tag>"); label($tab,@{$opt->{label}}) if ($opt->{label} && $opt->{place_label +} eq 'after'); } # I have to rewrite input so it can print a list of inputs for check b +oxes and radio boxes. =head2 C<input> pod to do =cut sub input { my ($tab,$opt) = @_; my $tag = 'input'; my $open = open_tag($tag,$opt,['type','value','name',@ics,@java]); my $text = $opt->{text} ? "$opt->{text} " : ''; label($tab,@{$opt->{label}}) if ($opt->{label} && $opt->{place_label +} eq 'before'); line($tab,"$text<$open>"); label($tab,@{$opt->{label}}) if ($opt->{label} && $opt->{place_label +} eq 'after'); } =head2 C<legend> pod to do =cut sub legend { print plain_element('legend',[@ics,@java],@_); } ## fieldset sub under 'tables' subs, fieldset pod under forms pod. =head3 C<fieldset> B<C<fieldset>> has code and the optional paramter C<legend>. C<code> i +s an anonymous subroutine. fieldset($tab, sub { ... fieldset elements ... }, { legend => 'legend_text', id => 'fieldset_id', class => 'fieldset_class', style => 'fieldset_style' }); =cut =head2 C<fieldset> pod to do =cut sub fieldset { my ($tab,$code,$opt) = @_; my $tag = 'fieldset'; my $open = open_tag($tag,$opt,[@ics,@java]); line($tab,qq(<$open>)); legend($tab,$opt->{legend}) if $opt->{legend}; &$code; line($tab,qq(</$tag>)); } =head2 forms =cut ##?? =head3 C<form> B<C<form>> has code and the optional paramters C<action> and C<method> +. C<code> is an anonymous subroutine. form($tab, sub { ... form elements ... }, { action => 'form_action', method => 'form_method', id => 'form_id', class => 'form_class', style => 'form_style' }); =cut =head2 C<form> pod to do =cut sub form { my ($tab,$code,$opt) = @_; my $tag = 'form'; my $open = open_tag($tag,$opt,['action','method',@ics,@java]); line($tab,qq(<$open>)); &$code; line($tab,qq(</$tag>)); } # End elements for forms. =head2 C<div> B<C<div>> code and optional parameters. C<code> is an anonymous sub. div($tab, sub { print "Text with out any formatting, great for data dumping." }, { id => 'div_id', class => 'div_class', style => 'div_style' }); =cut sub div { my ($tab,$code,$opt) = @_; my $tag = 'div'; my $open = open_tag($tag,$opt,[@ics,@java]); line($tab,qq(<$open>)); &$code; line($tab,qq(</$tag>)); } =head2 C<pre> B<C<pre>> has code but no optional parameters. The C<tab> will be igno +red and C<code> is an anonymous sub. pre($tab, sub { print "Text without any formatting, great for data dumping." }); =cut sub pre { my ($tab,$code) = @_; line(0,'<pre>'); &$code; line(0,'</pre>'); } # End elements =head1 AUTHOR Written by Lady Aleena (Lady underscore Aleena at xecu dot net) with a + lot of help from the L<PerlMonks|http://www.perlmonks.org>. =cut 1;


Comment on Re^6: RFC: Proofread the POD for my HTML elements module
Select or Download Code
Re^7: RFC: Proofread the POD for my HTML elements module
by Lady_Aleena (Deacon) on Apr 24, 2013 at 04:21 UTC

    I have made changes since my original post and more are forthcoming when I get inspired. So I do not make this thread any longer than it already is, I created a gist on GitHub. Now onto some comments.

    1. Did you know by mixing the POD in with the code, you added two pages worth of scrolling? With each =cut and the blank line after it, you added that much more scrolling. The code with the POD at the end is already 854 lines long. Adding another 70+ lines and 25% of a kb makes getting around the file more work. (If you have read my home node, file size still matters.)
    2. You have =head3 Setting up the list items before =head2 C<list>. The =head3 would be viewed as part of the =head2 C<paragraph> above it. My head levels were not arbitrary, they are written for (PO)document structure.
    3. Any element not exported does not get a POD heading for it.
      • title - set with the title parameter in head.
      • item - used in the list function.
      • term - used in the definition_list function.
      • definition - used in the definition_list function.
      • cell - set with the rows parameter in table.
      • row - set with the rows parameter in table.
      • col - set with the cols parameter in table.
      • cols - written but unused.
      • legend - set by the legend parameter in fieldset.
      • label - set by the label parameter in selection, textarea, and input functions.
      • option - used in the selection function.
    4. $tab and a tabindex are mutually exclusive. tabindex would be an optional parameter in anchor, input, selection, and textarea.
    5. Comments are supposed to be little things, so one # and a space are enough. I think most text editors these days have syntax highlighting, so long strings of # are not needed.

    Reading the POD in POD Checker would show you why I set up the POD as I did. You will see my document structure in all its glory. Any time I write a POD, I always check it with the POD checker.

    I am not getting how your tabbed lines work. I have not tried it yet, since it is a major paradigm shift.

    Have a cookie and a very nice day!
    Lady Aleena

      I agree with your module need criteria. Being faced with CGI.pm when you start up in perl does kind of slow down production. A functional base HTML element Module would be a far better introduction to programatically producing html. is this what you are thinking here? However, I believe a functional module is expected to export some routines. For example I am expecting I will not have to declare I want to import html, head, body, div, paragraph at a bare minimum. I can understand you being informed not to create an import list if the module was going to be in any way object orientated, but as a functional module, no import list, does not make sense.

      1. yes you are right here, my bad.
      2. I remained consistent here. I placed a head2 above each exported function, and where your pod matched filled in, otherwise placed the approximate pod nearby in the format existing. I found that the pod was not in the same order as the source, this made finding the related pod and source cumbersome in clarity.
      3. Some of the items in the list are still in your EXPORT_OK list. I'm figuring this is just oversight at the moment. However it would be clearer if when I viewed the source I could distinguish between what a user function and an intrenal module function. I understand the convention is to include an underscore within the function name. Or more explicitly as the first character of the function name. For example, I might currently think &definition_list is an internal module function which I should not use (excepting it being in the export_ok list), but that I can import and use &legend. In this case my headaches increase and my kudos for the author decrease when the author decides to reimplement &legend behaviour. Certainly adds to the folklore...
      4. keyword being 'would'. I do not think any other optional parameter other than the prescribed values can curently be input, being validated, as they are.
      5. Pod is to the user as comments are to the maintainer, no? What I mean is, well written comments complement the source, such as CGI.pm, the comments I included in the source were meant to hint at this kind of using comments to structure the source into sections. You already started doing this with the # start/end comments. My comments are still getting the noobland translation app treatment. I will keep your point in mind.

      The main principal of the tabbing is, I do not think the user wants to sit and write out tab increments and decrements. I think the user wants to the module to do that for them. What I am suggesting is that you present the user with a couple of optins how the tabs will be implemented, and they choose which they like, by setting a flag on or off. The major difference is you write an internal function to handle the implementations, based on the flag value, saving the user from having to do this. Would you like me to work on that properly? I have so far just thrown it in as an idea more than anything. I think really just need to clarify the way the variable is set, and add an actual $level return sub. I can see from your functions you have already determined some elements will be untabbed anyway such as pre, and anchor. So you are already making half the decision for the user.

      The gist source is really readable and easy to navigate, good stuff.

        I tried mixing @EXPORT and @EXPORT_OK. I had to call the default function anyway in the qw(), so it is one or the other, not both.

        1. You figured right, it was an oversight. legend and label should have been removed from the @EXPORT_OK list. I had not gotten to it. Also, definition_list is exportable, however I have not rewritten it to be like the others. It has data gathering in it which is very specific to my site. I need to make it more generally useable.
        2. tabindex has been added to the appropriate elements. :)
        3. I will save bytes where ever I can, so if it means my comments are little, I am okay with it.

        If you think this has the goods to ever be uploaded to CPAN and get users, then by all means play around with making default tabbing at your leisure. anchor and pre are the only elements which do not get tabbed. The former is an inline element, and the latter is special (any tabs before the end tag are part of the output, which is not good). Please remember to hunt down every $tab. Also, if you do it, please add the tabbing code here with maybe an example of one element, but also fork the gist. :)

        PS. I am still trying to figure out how to get rid of the use of &$code. I am not really happy with it in the five elements it is used in.

        Have a cookie and a very nice day!
        Lady Aleena

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1030115]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (3)
As of 2014-10-24 21:44 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    For retirement, I am banking on:










    Results (137 votes), past polls