I decided to spend a little longer coming up with a better solution,  
so went back to the original rails ordinalize method and instead now  
regex the string in place.

I include it here just in case its useful to someone. My knowledge of  
regex is low so I make no claims to its robustness.

       start_date = page.start_date
       sdate = start_date.strftime("%A") + " " +  
start_date.strftime("%d").to_i.ordinalize  + " " +  
start_date.strftime("%B")
       %{ #{sdate.gsub(/(.)(\d+)(st|nd|rd|th)(.)/) {|s| $1 + $2 +  
'<sup>' + $3 + '</sup>' + $4} } }

Thanks for all your help, and special thanks to Sean for the shards  
and schedular extentions which helped me to dive into the code (for  
better or worse!)

[Radiant] How to include classes in extensions?

subsorama at gmail.com subsorama at gmail.com
Fri Dec 7 19:22:24 GMT 2007
Previous message: [Radiant] How to include classes in extensions?
Next message: [Radiant] Issues while Installing backdoor
Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Many thanks for both your detailed answers, they were indeed very
helpful. I went ahead with the mixin module as I also wanted the
ordinals styled with <sup>'s. After some thought I should imagine a
much cleaner way would be by defining a regexp for the date string and
running that from the tags, but as you can probably tell I'm learning
as I go. I'm not sure well formed the tags are on the other side but
it's seems to be working as I wanted.

For your pleasure:

        start_date = page.start_date
        sdate = start_date.strftime("%A") + " " +
start_date.strftime("%d").to_i.ordinalize  + " " +
start_date.strftime("%B")
        sdate


Its probably not the place to ask, but if anyone knows a simple way to
replace those ordinals in the string using regexp I would be very
gratefiul!


Thanks once again for your all help,

Dominic


On 7 Dec 2007, at 14:18, Andrew O'Brien wrote:

 > Hi Dominic,
 >
 > First off, I think what you're trying to do is already done by a  
Rails
 > core extension to Integer.  See:
 >
 > http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Integer/Inflections.html
 >
 > If you still want to do something like this, it needs to be more like
 > (and I haven't tested this code):
 >
 > module Ordinalizable
 >  def ordinalize
 >    cardinal = self.to_i.abs
 >    if (10...20).include?(cardinal) then
 >      cardinal.to_s << 'th'
 >    else
 >      cardinal.to_s << %w{th st nd rd th th th th th th}[cardinal %  
10]
 >    end
 >  end
 > end
 >
 > # Only Integers should be ordinalized
 > Integer.send :include, Ordinalizable
 >
 > Stick this in your extension's lib directory and explicitly require  
it
 > from the extension file.
 >
 > Your first example where you monkey-patch Numeric should have worked
 > (depending of course on if the file was loaded), however, like I said
 > above, Floats and most of the other Numerics probably shouldn't be
 > ordinalized.  I think module mixin is generally cleaner from a design
 > standpoint (opinions may vary), though.
 >
 > Your second one has a couple of problems, which I point out not out  
of
 > toolishness, but in the hope that it's helpful: ;)
 >
 > 1) Numeric doesn't need to inherit from Page.  This is only necessary
 > for new Page types, which will appear in the Page Type select box.
 >
 > 2) Putting a class inside an extension is often a good way to keep
 > your namespace clean, but you probably shouldn't do it for anything
 > that inherits from ActiveRecord::Base.
 >
 > 3) It looks like what you've got is a case of mixed metaphors here:
 > you're trying to mixin a module to put an instance method into a
 > class, and you're trying to monkey-patch the class directly.  Both  
are
 > fine on their own (with varying opinions on cleanliness), but neither
 > will work this way.
 >
 > 4) You don't want to include the module into Page.  Since ordinalize
 > assumes that self is an Integer, it doesn't make any sense for it to
 > operate on a Page.  If, however, you defined a module with a number  
of
 > tags (which it sounds like you're also trying to do elsewhere), that
 > is what you want to do to get the tags into Page.
 >
 > Hope this helps,
 > Andrew
 >
 > On Dec 7, 2007 7:32 AM,  <subsorama at gmail.com> wrote:
 >> Hi,
 >>
 >> I would like to access this snippet of code from within my extension
 >> tags:
 >>
 >> class Numeric
 >>   def ordinal
 >>     cardinal = self.to_i.abs
 >>     if (10...20).include?(cardinal) then
 >>       cardinal.to_s << 'th'
 >>     else
 >>       cardinal.to_s << %w{th st nd rd th th th th th th}[cardinal %
 >> 10]
 >>     end
 >>   end
 >> end
 >>
 >> As the tags get called on the page I have tried adding the above to:
 >>
 >> module StartDate::PageExtensions
 >>   class Numeric < Page
 >>
 >>     def ordinal
 >>       cardinal = self.to_i.abs
 >>       if (10...20).include?(cardinal) then
 >>         cardinal.to_s << 'th'
 >>       else
 >>         cardinal.to_s << %w{th st nd rd th th th th th th} 
[cardinal %
 >> 10]
 >>       end
 >>     end
 >>
 >>   end
 >> end
 >>
 >> which is called from:
 >>
 >> Page.send :include, StartDate::PageExtensions
 >>
 >> The tag works fine when I don't call the new method, but when I do
 >> I'm
 >> getting an "undefined method 'ordinal' error", so I must be defining
 >> it wrong, but how do I do it right?
 >>
 >> Any advice?
 >>
 >>
 >> Thanks,
 >>
 >> Dominic
 >> _______________________________________________
 >> Radiant mailing list
 >> Post:   Radiant at lists.radiantcms.org
 >> Search: http://radiantcms.org/mailing-list/search/
 >> Site:   http://lists.radiantcms.org/mailman/listinfo/radiant
 >>
 > _______________________________________________
 > Radiant mailing list
 > Post:   Radiant at lists.radiantcms.org
 > Search: http://radiantcms.org/mailing-list/search/
 > Site:   http://lists.radiantcms.org/mailman/listinfo/radiant

Previous message: [Radiant] How to include classes in extensions?
Next message: [Radiant] Issues while Installing backdoor
Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Radiant mailing list

_______________________________________________
Radiant mailing list
Post:   [email protected]
Search: http://radiantcms.org/mailing-list/search/
Site:   http://lists.radiantcms.org/mailman/listinfo/radiant

Reply via email to