# @COPYRIGHT@
package Socialtext::Formatter::Block;
use strict;
use warnings;
use base 'Socialtext::Formatter::Unit';
sub contains_phrases {
Socialtext::Formatter->all_phrases;
}
################################################################################
package Socialtext::Formatter::Heading;
use base 'Socialtext::Formatter::Block';
use Class::Field qw( const field );
const formatter_id => 'hx';
field 'level';
sub match {
my $self = shift;
my $text = shift;
return unless $text =~ /^(\^{1,6})\s*(.*?)(\s+=+)?\s*\n+/m;
$self->level( length($1) );
$self->set_match($2);
}
sub html_start {
my $self = shift;
my $text = $self->get_text;
my $id = Socialtext::Page->name_to_id($text);
sprintf '', $self->level,
Socialtext::Formatter::legalize_sgml_id($id);
}
sub html_end {
my $self = shift;
'level . ">\n"
}
################################################################################
package Socialtext::Formatter::Paragraph;
use base 'Socialtext::Formatter::Block';
use Class::Field qw( const );
const formatter_id => 'p';
const html_start => "
\n";
const html_end => "
\n";
const pattern_block =>
qr/((?:^(?!(?:[\#\-\*]+ |[\^\|\>]|\.\w+\s*\n)).*\S.*\n)+(^\s*\n)*)/m;
sub text_filter {
my $self = shift;
my $text = shift;
$text =~ s/(\r?\n)*\z//;
$text =~ s/\n/
\n/g;
# And now remove any BRs we just added WITHIN HTML comments,
# so they don't screw up Wikiwyg.
return $text unless $text =~ /$/s;
$_;
} split /()/s, $text;
}
################################################################################
package Socialtext::Formatter::EmptyParagraph;
use base 'Socialtext::Formatter::Paragraph';
use Class::Field qw( const );
const formatter_id => 'empty_p';
const pattern_block => qr/((^\s*\n)+)/m;
const html_start => "";
const html_end => "
";
################################################################################
package Socialtext::Formatter::WaflParagraph;
use base 'Socialtext::Formatter::Paragraph';
use Class::Field qw( const );
const formatter_id => 'wafl_p';
const pattern_block => qr/^(\{.*\})\n/m;
const html_start => "";
const html_end => "
";
sub text_filter { $_[1] }
################################################################################
package Socialtext::Formatter::Indent;
use base 'Socialtext::Formatter::Block';
use Class::Field qw( const field );
const formatter_id => 'indent';
field 'level';
field 'start_level';
sub match {
my $self = shift;
my $text = shift;
return unless $text =~ /^(>+)/m;
my $l = length($1);
$self->level($l);
return unless $text =~ /(^(>{$l}(?!>).*\n)+)/m;
$self->set_match; # sets text field
my $new_text = $self->text;
$new_text =~ s/^>+\s*//gm;
$self->text($new_text);
return 1;
}
sub text_filter { Socialtext::Formatter::Paragraph->text_filter($_[1]) }
sub html_start {
my $self = shift;
my $level
= defined $self->start_level ? $self->start_level : $self->level;
return ( '' x $level ) . "\n";
}
sub html_end {
my $self = shift;
my $level = $self->level;
my $next = $self->next_unit;
my $newline = "\n";
if ( ref($next) and $next->formatter_id eq 'indent' ) {
my $next_level = $next->level;
if ( $level < $next_level ) {
$next->start_level( $next_level - $level );
$level = 0;
}
else {
$next->start_level(0);
$level = $level - $next_level;
$newline = '';
}
}
return ( '
' x $level ) . $newline;
}
################################################################################
package Socialtext::Formatter::Item;
use base 'Socialtext::Formatter::Block';
use Class::Field qw( const );
const formatter_id => 'li';
const html_start => "";
const html_end => "\n";
const bullet => '[\#\*\-\+]+(?=\ +|$)';
sub match {
my $self = shift;
my $text = shift;
my $bullet = $self->bullet;
return unless $text =~ /^$bullet(?:\ *)(.*)\n/m;
$self->set_match;
}
sub text_filter {
my $self = shift;
my $text = shift;
$text = " " if not length($text);
$text;
}
1;