Text-Trac-0.18/000755 000765 000024 00000000000 12510314520 013503 5ustar00gaborstaff000000 000000 Text-Trac-0.18/.perlcriticrc000644 000765 000024 00000001533 12507676756 016227 0ustar00gaborstaff000000 000000 # please alpha sort config items as you add them severity = 5 verbose = 11 theme = core [TestingAndDebugging::RequireUseStrict] equivalent_modules = Moo Dancer Dancer2 [TestingAndDebugging::RequireUseWarnings] severity = 5 equivalent_modules = Moo Dancer Dancer2 #[-ControlStructures::ProhibitPostfixControls] #[-Documentation::RequirePodLinksIncludeText] #[-Documentation::RequirePodSections] #[-Modules::RequireVersionVar] #[-RegularExpressions::RequireDotMatchAnything] #[-RegularExpressions::RequireExtendedFormatting] #[-RegularExpressions::RequireLineBoundaryMatching] #[-Variables::ProhibitPunctuationVars] # [CodeLayout::RequireTrailingCommas] severity = 5 #[ValuesAndExpressions::ProhibitEmptyQuotes] #severity = 5 [ValuesAndExpressions::ProhibitInterpolationOfLiterals] severity = 5 #[ValuesAndExpressions::ProhibitNoisyQuotes] #severity = 5 Text-Trac-0.18/.perltidyrc000644 000765 000024 00000000153 12507676762 015715 0ustar00gaborstaff000000 000000 -pbp -nst -et=4 --maximum-line-length=120 # Break a line after opening/before closing token. -vt=0 -vtc=0 Text-Trac-0.18/.shipit000644 000765 000024 00000000267 12405013043 015010 0ustar00gaborstaff000000 000000 steps = CommitMessageWrap, FindVersion, ChangeVersion, CheckChangeLog, DistTest, Commit, Tag, MakeDist, UploadCPAN svk.tagpattern = rel-%v commit_message.format = lang/perl/Punc: %msgText-Trac-0.18/.tidyallrc000644 000765 000024 00000000264 12507676775 015532 0ustar00gaborstaff000000 000000 [PerlTidy] select = {bin,lib,t}/**/*.{pl,pm,t,psgi} select = etc/munin/* select = app.psgi select = Makefile.PL argv = --profile=$ROOT/.perltidyrc [SortLines] select = .gitignore Text-Trac-0.18/.travis.yml000644 000765 000024 00000000475 12507703254 015636 0ustar00gaborstaff000000 000000 branches: except: - gh-pages language: perl perl: - "5.20" - "5.18" - "5.16" - "5.14" - "5.12" - "5.10" before_install: - cpanm --notest Test::Version - cpanm --notest Test::Pod::Coverage - cpanm --notest Test::Pod - cpanm --notest Test::Code::TidyAll - cpanm --notest Test::Perl::Critic Text-Trac-0.18/Changes000644 000765 000024 00000004051 12510314412 014776 0ustar00gaborstaff000000 000000 Revision history for Text-Trac 0.18 2015.04.05 Remove auto_include from Makefile.PL to limit inc/ to the Module::Install code. 0.17 2015.04.05 Add lots of full html tests. Add command line script script/trac2html Enable excluding class="" from the HTML run Perl::Tidy run Perl::Critic Escape { in regex RT #100712 0.16 2014.09.13 New maintainer. Link to Github. License in META files. 0.15 Sun Mar 8 Fix for RT#43894.Updated Module::Install in this module. Thanks for ANDK! 0.14 Mon Feb 23 Fix for RT#43337.Image URLs are not converted into embedded images anymore.Thanks for cmcosse! 0.13 Tue Jul 29 Revert inline_parsers in Text::Trac::BlockNode. Thanks for yappo! 0.12 Tue Apr 15 Support comment link. See http://rt.cpan.org/Ticket/Display.html?id=34805. Thanks for CLSUNG! 0.11 Thu Mar 6 Fix for http://rt.cpan.org/Ticket/Display.html?id=33670#txn-430322 Thanks for David Wheeler! 0.10 Fri Feb 29 Fix for http://rt.cpan.org/Ticket/Display.html?id=33670 Thanks for David Wheeler! 0.09 Thu Feb 28 Fix for http://rt.cpan.org/Ticket/Display.html?id=33575 and http://rt.cpan.org/Ticket/Display.html?id=33576. Thanks for David Wheeler! 0.08 Tue Nov 20 Apply a patch of https://rt.cpan.org/Ticket/Display.html?id=30816. Thanks to Kazuyoshi KATO! 0.07 Sun Mar 25 Tiny fix for Ul.pm and Ol.pm 0.06 Wed Nov 9 Fix list handling(Ul.pm and Ol.pm). Refactor inline node parsers wholly. Add supports for TracLinks and WikiMacros. 0.05 Fri Oct 27 Using Test::Base instead of Test::More in 01-text-trac.t. Fix the bug reported on rt.cpan.org ticket #21431. http://rt.cpan.org/Ticket/Display.html?id=21431 Thanks to Andrew Sterling Hanenkamp and Graham TerMarsch. 0.04 Wed Jul 19 Fix autolink handling, again. 0.03 Wed Jul 19 Fix autolink handling. 0.02 Tue Jun 20 Fix the link pattern of AutoLinkHttp.pm. 0.01 Tue Jun 20 First version, released on an unsuspecting world. Text-Trac-0.18/inc/000755 000765 000024 00000000000 12510314520 014254 5ustar00gaborstaff000000 000000 Text-Trac-0.18/lib/000755 000765 000024 00000000000 12510314520 014251 5ustar00gaborstaff000000 000000 Text-Trac-0.18/Makefile.PL000644 000765 000024 00000001050 12510314201 015445 0ustar00gaborstaff000000 000000 use inc::Module::Install; name('Text-Trac'); all_from('lib/Text/Trac.pm'); license 'perl'; test_requires('Test::Base'); test_requires('Test::More'); #test_requires('Test::Differences'); requires('UNIVERSAL::require'); requires('Class::Accessor::Fast'); requires('Class::Data::Inheritable'); requires('Tie::IxHash'); requires('List::MoreUtils'); requires('HTML::Entities'); requires('Path::Tiny'); no_index( package => 'TestMacro' ); install_script 'script/trac2html'; auto_install; repository 'https://github.com/szabgab/Text-Trac'; WriteAll; Text-Trac-0.18/MANIFEST000644 000765 000024 00000005114 12510314506 014641 0ustar00gaborstaff000000 000000 .perlcriticrc .perltidyrc .shipit .tidyallrc .travis.yml Changes inc/Module/AutoInstall.pm inc/Module/Install.pm inc/Module/Install/AutoInstall.pm inc/Module/Install/Base.pm inc/Module/Install/Can.pm inc/Module/Install/Fetch.pm inc/Module/Install/Include.pm inc/Module/Install/Makefile.pm inc/Module/Install/Metadata.pm inc/Module/Install/Scripts.pm inc/Module/Install/Win32.pm inc/Module/Install/WriteAll.pm lib/Text/Trac.pm lib/Text/Trac/BlockNode.pm lib/Text/Trac/Blockquote.pm lib/Text/Trac/Context.pm lib/Text/Trac/Dl.pm lib/Text/Trac/Heading.pm lib/Text/Trac/Hr.pm lib/Text/Trac/InlineNode.pm lib/Text/Trac/LinkResolver.pm lib/Text/Trac/LinkResolver/Attachment.pm lib/Text/Trac/LinkResolver/Changeset.pm lib/Text/Trac/LinkResolver/Comment.pm lib/Text/Trac/LinkResolver/Log.pm lib/Text/Trac/LinkResolver/Milestone.pm lib/Text/Trac/LinkResolver/Report.pm lib/Text/Trac/LinkResolver/Source.pm lib/Text/Trac/LinkResolver/Ticket.pm lib/Text/Trac/LinkResolver/Wiki.pm lib/Text/Trac/Macro.pm lib/Text/Trac/Macro/HelloWorld.pm lib/Text/Trac/Macro/Timestamp.pm lib/Text/Trac/Node.pm lib/Text/Trac/Ol.pm lib/Text/Trac/P.pm lib/Text/Trac/Pre.pm lib/Text/Trac/Table.pm lib/Text/Trac/Text.pm lib/Text/Trac/Ul.pm Makefile.PL MANIFEST This list of files META.yml README.md script/trac2html t/00-load.t t/01-text-trac.t t/02-macros.t t/03-trac-links.t t/04-list.t t/05-disable_links.t t/06-enable_links.t t/07-custom_url.t t/08-regression.t t/10-script.t t/11-script-noclass.t t/95-tidyall.t t/96-perl-critic.t t/boilerplate.t t/corpus/padre_development.trac t/corpus/padre_download_debian.trac t/corpus/padre_download_fedora.trac t/corpus/padre_download_freebsd.trac t/corpus/padre_download_mandriva.trac t/corpus/padre_download_netbsd.trac t/corpus/padre_download_opensuse.trac t/corpus/padre_download_ubuntu.trac t/corpus/padre_features.trac t/expected/padre_development.html t/expected/padre_development_noclass.html t/expected/padre_download_debian.html t/expected/padre_download_debian_noclass.html t/expected/padre_download_fedora.html t/expected/padre_download_fedora_noclass.html t/expected/padre_download_freebsd.html t/expected/padre_download_freebsd_noclass.html t/expected/padre_download_mandriva.html t/expected/padre_download_mandriva_noclass.html t/expected/padre_download_netbsd.html t/expected/padre_download_netbsd_noclass.html t/expected/padre_download_opensuse.html t/expected/padre_download_opensuse_noclass.html t/expected/padre_download_ubuntu.html t/expected/padre_download_ubuntu_noclass.html t/expected/padre_features.html t/expected/padre_features_noclass.html t/pod-coverage.t t/pod.t t/TestTextTrac.pm t/version.t Text-Trac-0.18/META.yml000644 000765 000024 00000001467 12510314451 014767 0ustar00gaborstaff000000 000000 --- abstract: 'Perl extension for formatting text with Trac Wiki Style.' author: - 'Gosuke Miyashita, C<< >>' build_requires: ExtUtils::MakeMaker: 6.36 Test::Base: 0 Test::More: 0 configure_requires: ExtUtils::MakeMaker: 6.36 distribution_type: module dynamic_config: 1 generated_by: 'Module::Install version 1.14' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 name: Text-Trac no_index: directory: - inc - t package: - TestMacro requires: Class::Accessor::Fast: 0 Class::Data::Inheritable: 0 HTML::Entities: 0 List::MoreUtils: 0 Path::Tiny: 0 Tie::IxHash: 0 UNIVERSAL::require: 0 resources: license: http://dev.perl.org/licenses/ repository: https://github.com/szabgab/Text-Trac version: '0.18' Text-Trac-0.18/README.md000644 000765 000024 00000001065 12507677354 015013 0ustar00gaborstaff000000 000000 ###Status [![Build Status](https://travis-ci.org/szabgab/Text-Trac.png)](https://travis-ci.org/szabgab/Text-Trac) Text-Trac INSTALLATION To install this module, run the following commands: perl Makefile.PL make make test make install SUPPORT AND DOCUMENTATION After installing, you can find documentation for this module with the perldoc command. perldoc Text::Trac COPYRIGHT AND LICENCE Copyright (C) 2006 Gosuke Miyashita This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Text-Trac-0.18/script/000755 000765 000024 00000000000 12510314520 015007 5ustar00gaborstaff000000 000000 Text-Trac-0.18/t/000755 000765 000024 00000000000 12510314520 013746 5ustar00gaborstaff000000 000000 Text-Trac-0.18/t/00-load.t000644 000765 000024 00000000242 12507700160 015272 0ustar00gaborstaff000000 000000 #!perl -T use strict; use warnings; use Test::More tests => 1; BEGIN { use_ok('Text::Trac'); } diag("Testing Text::Trac $Text::Trac::VERSION, Perl $], $^X"); Text-Trac-0.18/t/01-text-trac.t000755 000765 000024 00000015340 12507700147 016304 0ustar00gaborstaff000000 000000 use strict; use warnings; use t::TestTextTrac; run_tests; __DATA__ ### h1 test --- input = heading 1 = --- expected

heading 1

### h2 test< --- input == heading 2 == --- expected

heading 2

### h3 test --- input === heading 3 === --- expected

heading 3

### h4 test --- input ==== heading 4 ==== --- expected

heading 4

### h5 test --- input ===== heading 5 ===== --- expected
heading 5
### bold test --- input '''bold''' '''bold''' --- expected

bold bold

### italic test --- input ''italic'' ''italic'' --- expected

italic italic

### bolditalic test --- input '''''bolditalic''''' '''''bolditalic''''' --- expected

bolditalic bolditalic

### underline test --- input __underline__ __underline__ --- expected

underline underline

### monospace test --- input `monospace` {{{monospace}}} --- expected

monospace monospace

### strike test --- input ~~strike~~ ~~strike~~ --- expected

strike strike

### sup test --- input ^sup^ ^sup^ --- expected

sup sup

### sub test --- input ,,sub,, ,,sub,, --- expected

sub sub

### br test --- input line1[[BR]]line2 --- expected

line1
line2

### p test --- input test test --- expected

test test

### ul test --- input * list 1-1 * list 1-2 * list 2-1 * list 2-2 --- expected ### ol test --- input 1. list 1-1 1. list 1-2 a. list a-1 a. list a-2 --- expected
  1. list 1-1
  2. list 1-2
    1. list a-1
    2. list a-2
### blockquote test --- input This text is a quote from someone else. --- expected

This text is a quote from someone else.

### blockquote2 test --- input Ask not what your country can do for you. Ask what you can do for your country. --John F. Kennedy --- expected

Ask not what your country can do for you. Ask what you can do for your country.

--John F. Kennedy

### pre test --- input {{{ This is pre-formatted text. This also pre-formatted text. }}} --- expected
  This is pre-formatted text.
  This also pre-formatted text.
### table test --- input ||Cell 1||Cell 2||Cell 3|| ||Cell 4||Cell 5||Cell 6|| --- expected
Cell 1Cell 2Cell 3
Cell 4Cell 5Cell 6
### hr test --- input line1 ---- line2 --- expected

line1


line2

### dl test --- input title1:: content 1-1 content 1-2 title2:: content 2-1 content 2-2 content 2-3 --- expected
title1
content 1-1 content 1-2
title2
content 2-1 content 2-2 content 2-3
### autolink test --- input http://mizzy.org/ [http://mizzy.org/ Title] --- expected

http://mizzy.org/ Title

### auto image link test --- input http://mizzy.org/test.png [http://mizzy.org/test.png Image] --- expected

http://mizzy.org/test.png Image

### ul node with single space --- input * indent with * single space * sublist with * two spaces --- expected ### ul node with double space --- input * indent with * two spaces * sublist with * two spaces --- expected ### ol node with single space --- input 1. indent with 1. single space a. sublist with a. two spaces --- expected
  1. indent with
  2. single space
    1. sublist with
    2. two spaces
### ol node with double space --- input 1. indent with 1. two spaces a. sublist with a. two spaces --- expected
  1. indent with
  2. two spaces
    1. sublist with
    2. two spaces
### dl node with single space --- input title1:: indent title single space title2:: indent content double space --- expected
title1
indent title single space
title2
indent content double space
### dl node with double space --- input title1:: indent title double space title2:: indent content double space --- expected
title1
indent title double space
title2
indent content double space
### unknown short link --- input unknown:target --- expected

unknown:target

### unknown long link --- input [unknown:target label] --- expected

[unknown:target label]

### escape HTML meta-characters --- input foo baz. foo '''bar''' baz. * foo bar. * foo '''bar''' baz. 1. foo bar. 1. foo '''bar''' baz. ||foo||||'''baz'''|| {{{ foo baz. foo '''bar''' baz. }}} --- expected

foo <bar> baz. foo bar baz.

  • foo <bar> bar.
  • foo bar baz.
  1. foo <bar> bar.
  2. foo bar baz.
foo<bar>baz
foo <bar> baz.
foo '''bar''' baz.
### citation link --- input >> Someone's original text >> Someone's original text >> Someone's original text > Someone else's reply text > Someone else's reply text My reply text >> Someone's original text My reply text --- expected

Someone's original text Someone's original text Someone's original text

Someone else's reply text Someone else's reply text

My reply text

Someone's original text

My reply text

#### List item #--- input #* First #* Second #--- expected #
    #
  • First
  • #
  • Second
  • #
# #### Image #--- input #[[Image(cool_diff_box.png)]] #--- expected # Text-Trac-0.18/t/02-macros.t000755 000765 000024 00000001266 12507700165 015660 0ustar00gaborstaff000000 000000 use strict; use warnings; use t::TestTextTrac; run_tests; __DATA__ ### macro with no arguments --- input [[HelloWorld]] --- expected

Hello World, args =

### macro with quoted arguments --- input [[HelloWorld( "one, one", "two, two", 'three, three' )]] --- expected

Hello World, args = one, one, two, two, three, three

### macro with embedded terminators --- input [[HelloWorld( func(arg), ]] )]] --- expected

Hello World, args = func(arg), ]]

### macros with extra ws aren't valid --- input [[ HelloWorld(foo) ]] --- expected

[[ HelloWorld(foo) ]]

### unknown macro doesn't die --- input [[TheUnknownMacro]] --- expected

[[TheUnknownMacro]]

Text-Trac-0.18/t/03-trac-links.t000755 000765 000024 00000017362 12507700171 016445 0ustar00gaborstaff000000 000000 use strict; use warnings; use t::TestTextTrac; run_tests; __DATA__ ### ticket link test 1 --- input #1 --- expected

#1

### ticket link test 2 --- input ticket:1 --- expected

ticket:1

### ticket link test 3 --- input !#1 --- expected

#1

### ticket link test 4 --- input !ticket:1 --- expected

ticket:1

### ticket link test 5 --- input [ticket:1] --- expected

1

### ticket link test 6 --- input [ticket:1 ticket 1] --- expected

ticket 1

### ticket link test 7 --- input ![ticket:1] --- expected

[ticket:1]

### report link test 1 --- input {1} --- expected

{1}

### report link test 2 --- input report:1 --- expected

report:1

### report link test 3 --- input !{1} --- expected

{1}

### report link test 4 --- input !report:1 --- expected

report:1

### report link test 5 --- input [report:1] --- expected

1

### report link test 6 --- input [report:1 report 1] --- expected

report 1

### report link test 7 --- input ![report:1] --- expected

[report:1]

### changeset link test 1 --- input [1] --- expected

[1]

### changeset link test 2 --- input changeset:1 --- expected

changeset:1

### changeset link test 3 --- input r1 --- expected

r1

### changeset link test 4 --- input [changeset:1] --- expected

1

### changeset link test 5 --- input [changeset:1 changeset 1] --- expected

changeset 1

### changeset link test 6 --- input ![1] --- expected

[1]

### changeset link test 7 --- input !changeset:1 --- expected

changeset:1

### changeset link test 8 --- input !r1 --- expected

r1

### changeset link test 9 --- input ![changeset:1] --- expected

[changeset:1]

### revision log link test 1 --- input r1:3 --- expected

r1:3

### revision log link test 2 --- input [1:3] --- expected

[1:3]

### revision log link test 3 --- input log:#1:3 --- expected

log:#1:3

### revision log link test 4 --- input [log:#1:3] --- expected

#1:3

### revision log link test 5 --- input [log:#1:3 log 1 - 3] --- expected

log 1 - 3

### wiki link test 1 --- input TracLinks --- expected

TracLinks

### wiki link test 2 --- input wiki:trac_links --- expected

wiki:trac_links

### wiki link test 3 --- input !TracLinks --- expected

TracLinks

### wiki link test 4 --- input !wiki:TracLinks --- expected

wiki:TracLinks

### wiki link test 5 --- input [wiki:TracLinks Trac Links] --- expected

Trac Links

### milestone link test 1 --- input milestone:1.0 --- expected

milestone:1.0

### milestone link test 2 --- input [milestone:1.0] --- expected

1.0

### milestone link test 3 --- input [milestone:1.0 milestone 1.0] --- expected

milestone 1.0

### milestone link test 4 --- input !milestone:1.0 --- expected

milestone:1.0

### milestone link test 5 --- input ![milestone:1.0] --- expected

[milestone:1.0]

### attahcment link test 1 --- input attachment:ticket:33:DSCF0001.jpg --- expected

attachment:ticket:33:DSCF0001.jpg

### attahcment link test 2 --- input attachment:wiki:TracLinks:DSCF0001.jpg --- expected

attachment:wiki:TracLinks:DSCF0001.jpg

### attahcment link test 3 --- input [attachment:ticket:33:DSCF0001.jpg] --- expected

ticket:33:DSCF0001.jpg

### attahcment link test 4 --- input [attachment:ticket:33:DSCF0001.jpg file] --- expected

file

### attahcment link test 5 --- input !attachment:ticket:33:DSCF0001.jpg --- expected

attachment:ticket:33:DSCF0001.jpg

### attahcment link test 6 --- input !attachment:wiki:TracLinks:DSCF0001.jpg --- expected

attachment:wiki:TracLinks:DSCF0001.jpg

### attahcment link test 7 --- input ![attachment:wiki:TracLinks:DSCF0001.jpg] --- expected

[attachment:wiki:TracLinks:DSCF0001.jpg]

### source link test 1 --- input source:trunk/COPYING --- expected

source:trunk/COPYING

### source link test 2 --- input source:trunk/COPYING#200 --- expected

source:trunk/COPYING#200

### source link test 3 --- input [source:trunk/COPYING] --- expected

trunk/COPYING

### source link test 4 --- input [source:trunk/COPYING COPYING] --- expected

COPYING

### source link test 5 --- input [source:trunk/COPYING#200] --- expected

trunk/COPYING#200

### source link test 6 --- input [source:trunk/COPYING#200 COPYING] --- expected

COPYING

### source link test 7 --- input !source:trunk/COPYING --- expected

source:trunk/COPYING

### source link test 8 --- input !source:trunk/COPYING#200 --- expected

source:trunk/COPYING#200

### source link test 9 --- input ![source:trunk/COPYING] --- expected

[source:trunk/COPYING]

### escaping links and wiki page names --- input == EscapingLinksand!WikiPageNames == --- expected

EscapingLinksandWikiPageNames

### comment link test 1 --- input comment:ticket:1:8 --- expected

comment:ticket:1:8

Text-Trac-0.18/t/04-list.t000644 000765 000024 00000004623 12507700176 015350 0ustar00gaborstaff000000 000000 use strict; use warnings; use t::TestTextTrac; run_tests; __DATA__ ### ul node another pattern 1 --- input * 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 --- expected
  • 1
  • 2
    • 3
    • 4
      • 5
      • 6
  • 7
  • 8
### ul node another pattern 2 --- input * 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 --- expected
  • 1
  • 2
    • 3
    • 4
      • 5
      • 6
  • 7
  • 8
### ol node another pattern 1 --- input a. 1 a. 2 a. 3 a. 4 a. 5 a. 6 a. 7 a. 8 --- expected
  1. 1
  2. 2
    1. 3
    2. 4
      1. 5
      2. 6
  3. 7
  4. 8
### ol node another pattern 2 --- input a. 1 a. 2 a. 3 a. 4 a. 5 a. 6 a. 7 a. 8 --- expected
  1. 1
  2. 2
    1. 3
    2. 4
      1. 5
      2. 6
  3. 7
  4. 8
### 2 set of ul nodes --- input * list 1-1 * list 1-2 * list 1-3 * list 2-1 * list 2-2 * list 2-3 --- expected
  • list 1-1
  • list 1-2
  • list 1-3
  • list 2-1
  • list 2-2
  • list 2-3
### 2 set of ol nodes --- input a. list 1-1 a. list 1-2 a. list 1-3 a. list 2-1 a. list 2-2 a. list 2-3 --- expected
  1. list 1-1
  2. list 1-2
  3. list 1-3
  1. list 2-1
  2. list 2-2
  3. list 2-3
### SVN::Notify set example set. --- input * Item 1 * Item 1.1 * Item 1.1.1 * Item 1.1.2 * Item 1.1.3 * Item 1.2 * Item 2 --- expected
  • Item 1
    • Item 1.1
      • Item 1.1.1
      • Item 1.1.2
      • Item 1.1.3
    • Item 1.2
  • Item 2
### SVN::Notify set example set.(ol) --- input a. Item 1 a. Item 1.1 a. Item 1.1.1 a. Item 1.1.2 a. Item 1.1.3 a. Item 1.2 a. Item 2 --- expected
  1. Item 1
    1. Item 1.1
      1. Item 1.1.1
      2. Item 1.1.2
      3. Item 1.1.3
    2. Item 1.2
  2. Item 2
### ol start with 2 --- input 2. Item 1 2. Item 2 --- expected
  1. Item 1
  2. Item 2
Text-Trac-0.18/t/05-disable_links.t000644 000765 000024 00000001064 12507700204 017165 0ustar00gaborstaff000000 000000 #!perl -T use strict; use warnings; use Test::Base; use Text::Trac; delimiters('###'); plan tests => 1 * blocks; my $p = Text::Trac->new( disable_links => [qw( log milestone )] ); sub parse { local $_ = shift; $p->parse($_); $p->html; } filters { input => 'parse', expected => 'chomp' }; run_is 'input' => 'expected'; __DATA__ ### log --- input r1:3 --- expected

r1:3

### milestone --- input milestone:1.0 --- expected

milestone:1.0

### ticket --- input ticket:1 --- expected

ticket:1

Text-Trac-0.18/t/06-enable_links.t000644 000765 000024 00000001163 12507700213 017011 0ustar00gaborstaff000000 000000 #!perl -T use strict; use warnings; use Test::Base; use Text::Trac; delimiters('###'); plan tests => 1 * blocks; my $p = Text::Trac->new( enable_links => [qw( log milestone )] ); sub parse { local $_ = shift; $p->parse($_); $p->html; } filters { input => 'parse', expected => 'chomp' }; run_is 'input' => 'expected'; __DATA__ ### log --- input r1:3 --- expected

r1:3

### milestone --- input milestone:1.0 --- expected

milestone:1.0

### ticket --- input ticket:1 --- expected

ticket:1

Text-Trac-0.18/t/07-custom_url.t000644 000765 000024 00000003367 12507700222 016570 0ustar00gaborstaff000000 000000 #!perl -T use strict; use warnings; use Test::Base; use Text::Trac; delimiters('###'); plan tests => 1 * blocks; my $p = Text::Trac->new( trac_attachment_url => 'http://mizzy.org/attachment', trac_changeset_url => 'http://mizzy.org/changeset', trac_log_url => 'http://mizzy.org/log', trac_milestone_url => 'http://mizzy.org/milestone', trac_report_url => 'http://mizzy.org/report', trac_source_url => 'http://mizzy.org/source', trac_ticket_url => 'http://mizzy.org/ticket', trac_wiki_url => 'http://mizzy.org/wiki', ); sub parse { local $_ = shift; $p->parse($_); $p->html; } filters { input => 'parse', expected => 'chomp' }; run_is 'input' => 'expected'; __DATA__ ### attachment --- input attachment:ticket:33:DSCF0001.jpg --- expected

attachment:ticket:33:DSCF0001.jpg

### changeset --- input [1] --- expected

[1]

### revision log --- input r1:3 --- expected

r1:3

### milestone --- input milestone:1.0 --- expected

milestone:1.0

### report --- input {1} --- expected

{1}

### source --- input source:trunk/COPYING --- expected

source:trunk/COPYING

### ticket --- input #1 --- expected

#1

### wiki --- input TracLinks --- expected

TracLinks

Text-Trac-0.18/t/08-regression.t000644 000765 000024 00000000535 12507700232 016550 0ustar00gaborstaff000000 000000 use strict; use warnings; use t::TestTextTrac; run_tests; __DATA__ ### regression test 1 --- input [http://shibuya.pm.org/blosxom/techtalks/200610.html Shibuya.pm テクニカルトーク #7] --- expected

Shibuya.pm テクニカルトーク #7

Text-Trac-0.18/t/10-script.t000644 000765 000024 00000001755 12510160434 015670 0ustar00gaborstaff000000 000000 use strict; use warnings; use Test::More tests => 2; #use Test::Differences qw(eq_or_diff); use File::Temp qw(tempdir); use Path::Tiny qw(path); my $dir = tempdir( CLEANUP => 1 ); subtest usage => sub { plan tests => 1; my $out = qx{$^X script/trac2html}; like $out, qr{Usage: script/trac2html}; #diag $out; }; my @cases = qw( padre_download_debian padre_download_fedora padre_download_mandriva padre_download_opensuse padre_download_ubuntu padre_download_freebsd padre_download_netbsd padre_development padre_features ); # Ubuntu generates warnings subtest full_html => sub { plan tests => 2 * @cases; foreach my $case (@cases) { my $out = qx{$^X script/trac2html --infile t/corpus/$case.trac --outfile $dir/$case.html}; is $out, '', 'out'; my $html_generated = path("$dir/$case.html")->slurp_utf8; my $html_expected = path("t/expected/$case.html")->slurp_utf8; #eq_or_diff $html_generated, $html_expected, 'Mandriva'; is $html_generated, $html_expected, $case; } }; Text-Trac-0.18/t/11-script-noclass.t000644 000765 000024 00000002001 12510162745 017321 0ustar00gaborstaff000000 000000 use strict; use warnings; use Test::More tests => 2; #use Test::Differences qw(eq_or_diff); use File::Temp qw(tempdir); use Path::Tiny qw(path); my $dir = tempdir( CLEANUP => 1 ); subtest usage => sub { plan tests => 1; my $out = qx{$^X script/trac2html}; like $out, qr{Usage: script/trac2html}; #diag $out; }; my @cases = qw( padre_download_debian padre_download_fedora padre_download_mandriva padre_download_opensuse padre_download_ubuntu padre_download_freebsd padre_download_netbsd padre_development padre_features ); # Ubuntu generates warnings subtest full_html => sub { plan tests => 2 * @cases; foreach my $case (@cases) { my $out = qx{$^X script/trac2html --infile t/corpus/$case.trac --outfile $dir/$case.html --noclass}; is $out, '', 'out'; my $html_generated = path("$dir/$case.html")->slurp_utf8; my $html_expected = path("t/expected/${case}_noclass.html")->slurp_utf8; #eq_or_diff $html_generated, $html_expected, 'Mandriva'; is $html_generated, $html_expected, $case; } }; Text-Trac-0.18/t/95-tidyall.t000644 000765 000024 00000000310 12507677017 016045 0ustar00gaborstaff000000 000000 use strict; use warnings; use Test::More; ## no critic eval 'use Test::Code::TidyAll 0.20'; plan skip_all => "Test::Code::TidyAll 0.20 required to check if the code is clean." if $@; tidyall_ok(); Text-Trac-0.18/t/96-perl-critic.t000644 000765 000024 00000001162 12507677026 016627 0ustar00gaborstaff000000 000000 use strict; use warnings; use Test::More; ## no critic #use Perl::Critic; eval 'use Test::Perl::Critic 1.02'; plan skip_all => 'Test::Perl::Critic 1.02 required' if $@; # NOTE: New files will be tested automatically. # FIXME: Things should be removed (not added) to this list. # Temporarily skip any files that existed before adding the tests. # Eventually these should all be removed (once the files are cleaned up). my %skip = map { ( $_ => 1 ) } qw( ); my @files = grep { !$skip{$_} } ( Perl::Critic::Utils::all_perl_files(qw( bin lib t )) ); foreach my $file (@files) { critic_ok( $file, $file ); } done_testing(); Text-Trac-0.18/t/boilerplate.t000644 000765 000024 00000001712 12507701132 016443 0ustar00gaborstaff000000 000000 #!perl -T use strict; use warnings; use Test::More tests => 2; sub not_in_file_ok { my ( $filename, %regex ) = @_; open my $fh, '<', $filename or die "couldn't open $filename for reading: $!"; my %violated; while ( my $line = <$fh> ) { while ( my ( $desc, $regex ) = each %regex ) { if ( $line =~ $regex ) { push @{ $violated{$desc} ||= [] }, $.; } } } if (%violated) { fail("$filename contains boilerplate text"); diag "$_ appears on lines @{$violated{$_}}" for keys %violated; } else { pass("$filename contains no boilerplate text"); } } not_in_file_ok( Changes => 'placeholder date/time' => qr(Date/time) ); sub module_boilerplate_ok { my ($module) = @_; not_in_file_ok( $module => 'the great new $MODULENAME' => qr/ - The great new /, 'boilerplate description' => qr/Quick summary of what the module/, 'stub function definition' => qr/function[12]/, ); } module_boilerplate_ok('lib/Text/Trac.pm'); Text-Trac-0.18/t/corpus/000755 000765 000024 00000000000 12510314520 015261 5ustar00gaborstaff000000 000000 Text-Trac-0.18/t/expected/000755 000765 000024 00000000000 12510314520 015547 5ustar00gaborstaff000000 000000 Text-Trac-0.18/t/pod-coverage.t000644 000765 000024 00000000377 12507703131 016523 0ustar00gaborstaff000000 000000 #!perl -T use strict; use warnings; use Test::More; ## no critic eval 'use Test::Pod::Coverage 1.04 tests=>1'; plan skip_all => 'Test::Pod::Coverage 1.04 required for testing POD coverage' if $@; pod_coverage_ok( 'Text::Trac', 'Text::Trac is covered' ); Text-Trac-0.18/t/pod.t000644 000765 000024 00000000263 12507701205 014724 0ustar00gaborstaff000000 000000 #!perl -T use strict; use warnings; use Test::More; ## no critic eval 'use Test::Pod 1.14'; plan skip_all => 'Test::Pod 1.14 required for testing POD' if $@; all_pod_files_ok(); Text-Trac-0.18/t/TestTextTrac.pm000755 000765 000024 00000000714 12507706426 016727 0ustar00gaborstaff000000 000000 package t::TestTextTrac; use strict; use warnings; use Test::Base -Base; use Text::Trac; our @EXPORT = qw( run_tests ); sub run_tests { delimiters('###'); filters { input => 'parse', expected => 'chomp' }; run_is 'input' => 'expected'; } package t::TestTextTrac::Filter; use strict; use warnings; use Test::Base::Filter -Base; my $p = Text::Trac->new( trac_url => 'http://trac.mizzy.org/public/' ); sub parse { $p->parse(@_); return $p->html; } 1; Text-Trac-0.18/t/version.t000644 000765 000024 00000000473 12507701216 015634 0ustar00gaborstaff000000 000000 use strict; use warnings; use Test::More; ## no critic eval q{use Test::Version 1.003001 qw( version_all_ok ), { is_strict => 0, has_version => 1, }; }; plan skip_all => 'Test::Version 1.003001 required for testing version numbers' if $@; version_all_ok(); done_testing; Text-Trac-0.18/t/expected/padre_development.html000644 000765 000024 00000013321 12510160253 022134 0ustar00gaborstaff000000 000000

[[PageOutline(1-2)]]

Development in general

We are using Subversion for version control. The main development of Padre is in the trunk http://svn.perlide.org/padre/trunk/Padre but there are several additional projects and almost all the plugins of Padre also live in the same repository so the best if you check out the whole trunk http://svn.perlide.org/padre/trunk

$ svn co http://svn.perlide.org/padre/trunk padre

Then you can run the standard CPAN module process:

Make sure you have all of the needed prerequisites. See http://padre.perlide.org/trac/wiki/Download

$ cd padre/Padre
$ perl Makefile.PL      # which will tell about all the missing dependencies of Padre
                        # this may fail if you don't have Module::Install
                        # if so, start cpan and install it with all its prerequisites
$ make
$ make test

For a more detailed set of instructions on how to install the dependencies visit the Download

Once all the above works well you can launch Padre from the SVN tree by running $ perl dev

dev has some more parameters you can see by typing $ perl dev -h

The most important being $ perl dev -a that will include the path to all the plugins located in trunk/

Coding

See the http://search.cpan.org/dist/Padre/lib/Padre/Manual/Hacking.pod file for Core Padre development and http://search.cpan.org/dist/Padre/lib/Padre/Plugin.pm for Plugin development.

Translation

Translation is basically part of the development effort. For more details please take a look at this page: See [wiki:TranslationIntro]

Documentation

The documentation of Padre is standard POD embedded in the .pm files. If you'd like to improve those you should check out the source code of Padre as described above and send patches or ask for commit bit. The documentation is part of the regular development process.

QA/Testing

Unfortunately Padre has not enough automated test mostly due to the fact that we hardly know how to test GUI applications. The existing tests are located in the standard t/ directory. If you'd like to help in this and if you are on Windows you could take a look at the t/win32/ directory where we have a few tests written using Win32::GUItest. You would be very highly regarded if you improved the test coverage of Padre!!

Release Management

See separate page about Release

Development in a branch

Most of our development is done on the trunk but occasionally we prefer to make our private corner for experimental changes or changes that might not be stable for some time. Instructions on how to do that:

Create a branch and work on it:

Assuming you have already checked out http://svn.perlide.org/padre/trunk/ to /path/to/padre

$ svn cp http://svn.perlide.org/padre/trunk/Padre http://svn.perlide.org/padre/branches/My-branch -m'some messages'
$ cd /path/to/padre/Padre
$ svn switch http://svn.perlide.org/padre/branches/My-branch .

If you run svn st ..

You will see a letter S infront to the Padre directory as that one is switched.

Now you can edit, test and commit as usual. Your changes will be committed to the branch.

When done and you would like to merge your changes

1. Make sure everything is committed

$ cd /path/to/padre/Padre
$ svn switch http://svn.perlide.org/padre/trunk/Padre
$ svn log --stop-on-copy http://svn.perlide.org/padre/branches/My-branch

This will show you the changes you made on the branch. Take the FIRST and LAST revision numbers in this log and use the following command to see the full change you made: svn diff -rFIRST:LAST http://svn.perlide.org/padre/branches/My-branch

use the following to merge it back to trunk svn merge -rFIRST:LAST http://svn.perlide.org/padre/branches/My-branch . svn commit -m'merged -rFIRST:LAST http://svn.perlide.org/padre/branches/My-branch ' svn rm http://svn.perlide.org/padre/branches/My-branch -m'My-branch is not needed any more'

If you decided it was a dead-end you can just switch back to trunk and remove the branch.

Tickets

[[TicketQuery(component=development,order=id,desc=1,format=table,col=resolution|summary|owner|reporter)]]

Text-Trac-0.18/t/expected/padre_development_noclass.html000644 000765 000024 00000012545 12510162656 023676 0ustar00gaborstaff000000 000000

[[PageOutline(1-2)]]

Development in general

We are using Subversion for version control. The main development of Padre is in the trunk http://svn.perlide.org/padre/trunk/Padre but there are several additional projects and almost all the plugins of Padre also live in the same repository so the best if you check out the whole trunk http://svn.perlide.org/padre/trunk

$ svn co http://svn.perlide.org/padre/trunk padre

Then you can run the standard CPAN module process:

Make sure you have all of the needed prerequisites. See http://padre.perlide.org/trac/wiki/Download

$ cd padre/Padre
$ perl Makefile.PL      # which will tell about all the missing dependencies of Padre
                        # this may fail if you don't have Module::Install
                        # if so, start cpan and install it with all its prerequisites
$ make
$ make test

For a more detailed set of instructions on how to install the dependencies visit the Download

Once all the above works well you can launch Padre from the SVN tree by running $ perl dev

dev has some more parameters you can see by typing $ perl dev -h

The most important being $ perl dev -a that will include the path to all the plugins located in trunk/

Coding

See the http://search.cpan.org/dist/Padre/lib/Padre/Manual/Hacking.pod file for Core Padre development and http://search.cpan.org/dist/Padre/lib/Padre/Plugin.pm for Plugin development.

Translation

Translation is basically part of the development effort. For more details please take a look at this page: See [wiki:TranslationIntro]

Documentation

The documentation of Padre is standard POD embedded in the .pm files. If you'd like to improve those you should check out the source code of Padre as described above and send patches or ask for commit bit. The documentation is part of the regular development process.

QA/Testing

Unfortunately Padre has not enough automated test mostly due to the fact that we hardly know how to test GUI applications. The existing tests are located in the standard t/ directory. If you'd like to help in this and if you are on Windows you could take a look at the t/win32/ directory where we have a few tests written using Win32::GUItest. You would be very highly regarded if you improved the test coverage of Padre!!

Release Management

See separate page about Release

Development in a branch

Most of our development is done on the trunk but occasionally we prefer to make our private corner for experimental changes or changes that might not be stable for some time. Instructions on how to do that:

Create a branch and work on it:

Assuming you have already checked out http://svn.perlide.org/padre/trunk/ to /path/to/padre

$ svn cp http://svn.perlide.org/padre/trunk/Padre http://svn.perlide.org/padre/branches/My-branch -m'some messages'
$ cd /path/to/padre/Padre
$ svn switch http://svn.perlide.org/padre/branches/My-branch .

If you run svn st ..

You will see a letter S infront to the Padre directory as that one is switched.

Now you can edit, test and commit as usual. Your changes will be committed to the branch.

When done and you would like to merge your changes

1. Make sure everything is committed

$ cd /path/to/padre/Padre
$ svn switch http://svn.perlide.org/padre/trunk/Padre
$ svn log --stop-on-copy http://svn.perlide.org/padre/branches/My-branch

This will show you the changes you made on the branch. Take the FIRST and LAST revision numbers in this log and use the following command to see the full change you made: svn diff -rFIRST:LAST http://svn.perlide.org/padre/branches/My-branch

use the following to merge it back to trunk svn merge -rFIRST:LAST http://svn.perlide.org/padre/branches/My-branch . svn commit -m'merged -rFIRST:LAST http://svn.perlide.org/padre/branches/My-branch ' svn rm http://svn.perlide.org/padre/branches/My-branch -m'My-branch is not needed any more'

If you decided it was a dead-end you can just switch back to trunk and remove the branch.

Tickets

[[TicketQuery(component=development,order=id,desc=1,format=table,col=resolution|summary|owner|reporter)]]

Text-Trac-0.18/t/expected/padre_download_debian.html000644 000765 000024 00000006347 12510156116 022740 0ustar00gaborstaff000000 000000

Debian Installation Instructions

Installation using the Package Manager

Padre 0.63 is available in Debian 6.0 ("squeeze"), as well as in the unstable (Pare 0.90) and testing (Padre 0.90) branches of Debian.

Install: # aptitude install padre

Older Stable Releases

If you run a stable release prior to Squeeze (6.0), you'd have to add an "unstable" or "testing" source to /etc/apt/sources.list, e.g. as follows: deb http://mirror.isoc.org.il/pub/debian/ unstable main deb-src http://mirror.isoc.org.il/pub/debian/ unstable main

Then update the package list # aptitude update

and perform the installation as described above.

Installation from CPAN or Subversion

Make sure that CPAN can work properly. Install the build-essential package if it is not yet installed.

aptitude install libppix-regexp-perl libalien-wxwidgets-perl libppix-editortools-perl libio-string-perl libdevel-dumpvar-perl libfile-spec-perl libwx-perl libprobe-perl-perl libwxbase2.8-dev libdevel-refactor-perl libnet-daemon-perl libclass-unload-perl libthreads-shared-perl libwxgtk2.8-0 libtext-diff-perl libfile-next-perl libdbi-perl libtext-glob-perl ack-grep libclass-inspector-perl libtext-findindent-perl libfile-remove-perl libplrpc-perl libmodule-manifest-perl libparse-exuberantctags-perl libtemplate-tiny-perl libparse-errorstring-perl-perl libpod-pom-perl  liborlite-migrate-perl libfile-pushd-perl libio-stringy-perl libwxbase2.8-0 libipc-run-perl libclass-adapter-perl libtask-weaken-perl  libpod2-base-perl liborlite-perl libfile-find-rule-perl libpod-abstract-perl libclass-xsaccessor-perl libio-pty-perl libclone-perl  libwx-perl-processstream-perl libipc-run3-perl libwxgtk2.8-dev libdbd-sqlite3-perl libfile-sharedir-perl libppi-perl wx2.8-headers  libfile-homedir-perl liblist-moreutils-perl libdebug-client-perl libnumber-compare-perl libyaml-tiny-perl libgtk2.0-dev

Then either install from CPAN (which will help you to resolve possible additional dependencies), or run perl Makefile.PL make make test make install in the Padre directory. Pay attention to the output of perl Makefile.PL, it may remind you of some missing CPAN modules that you need to install.

(last checked Sep. 22, 2011, on Debian testing)

Still Not Working?

Following the instructions on this page did not lead to a successful installation?

Contact us.

We will do our best to help you. By letting us know that something does not work you will help us, too. When we know about it, we can improve this documentation and Padre itself.

Text-Trac-0.18/t/expected/padre_download_debian_noclass.html000644 000765 000024 00000006153 12510161742 024456 0ustar00gaborstaff000000 000000

Debian Installation Instructions

Installation using the Package Manager

Padre 0.63 is available in Debian 6.0 ("squeeze"), as well as in the unstable (Pare 0.90) and testing (Padre 0.90) branches of Debian.

Install: # aptitude install padre

Older Stable Releases

If you run a stable release prior to Squeeze (6.0), you'd have to add an "unstable" or "testing" source to /etc/apt/sources.list, e.g. as follows: deb http://mirror.isoc.org.il/pub/debian/ unstable main deb-src http://mirror.isoc.org.il/pub/debian/ unstable main

Then update the package list # aptitude update

and perform the installation as described above.

Installation from CPAN or Subversion

Make sure that CPAN can work properly. Install the build-essential package if it is not yet installed.

aptitude install libppix-regexp-perl libalien-wxwidgets-perl libppix-editortools-perl libio-string-perl libdevel-dumpvar-perl libfile-spec-perl libwx-perl libprobe-perl-perl libwxbase2.8-dev libdevel-refactor-perl libnet-daemon-perl libclass-unload-perl libthreads-shared-perl libwxgtk2.8-0 libtext-diff-perl libfile-next-perl libdbi-perl libtext-glob-perl ack-grep libclass-inspector-perl libtext-findindent-perl libfile-remove-perl libplrpc-perl libmodule-manifest-perl libparse-exuberantctags-perl libtemplate-tiny-perl libparse-errorstring-perl-perl libpod-pom-perl  liborlite-migrate-perl libfile-pushd-perl libio-stringy-perl libwxbase2.8-0 libipc-run-perl libclass-adapter-perl libtask-weaken-perl  libpod2-base-perl liborlite-perl libfile-find-rule-perl libpod-abstract-perl libclass-xsaccessor-perl libio-pty-perl libclone-perl  libwx-perl-processstream-perl libipc-run3-perl libwxgtk2.8-dev libdbd-sqlite3-perl libfile-sharedir-perl libppi-perl wx2.8-headers  libfile-homedir-perl liblist-moreutils-perl libdebug-client-perl libnumber-compare-perl libyaml-tiny-perl libgtk2.0-dev

Then either install from CPAN (which will help you to resolve possible additional dependencies), or run perl Makefile.PL make make test make install in the Padre directory. Pay attention to the output of perl Makefile.PL, it may remind you of some missing CPAN modules that you need to install.

(last checked Sep. 22, 2011, on Debian testing)

Still Not Working?

Following the instructions on this page did not lead to a successful installation?

Contact us.

We will do our best to help you. By letting us know that something does not work you will help us, too. When we know about it, we can improve this documentation and Padre itself.

Text-Trac-0.18/t/expected/padre_download_fedora.html000644 000765 000024 00000005440 12510156100 022740 0ustar00gaborstaff000000 000000

Fedora Installation Instructions

Installation using the Package Manager

Fedora 15

Provided versions: perl-Padre-0.84-1.fc15 with wxGTK-2.8.11-4.fc15 and perl-Alien-wxWidgets-0.51-4.fc15 # yum install perl-Padre

Fedora 14

Provided versions: perl-Padre-0.64-1.fc14 with wxGTK-2.8.11-3.fc14 and perl-Alien-wxWidgets-0.51-2.fc14 # yum install perl-Padre Apparently, after this padre will still complain libwx_gtk2u_stc-2.8.so cannot open shared object file

then also install # yum install wxGTK-devel

Related bug, which should be fixed in future versions: https://bugzilla.redhat.com/show_bug.cgi?id=656317

In older releases of Fedora is impossible to update because of Fedora update policy. In case you'd like to have latest Padre, you need update to the latest Fedora or use CPAN installation install Padre from CPAN.

=== Older releases === Older releases are not supported, but if you insist on using them install Padre and wxGTK-devel, which should workaround bugs. # yum install perl-Padre wxGTK-devel

Fedora-13 includes Padre-0.64 with Wx Version: 0.92 wxWidgets 2.8.11.

Fedora-12 includes Padre-0.64 with Wx Version: 0.92 wxWidgets 2.8.11.

Fedora-11 includes Padre-0.32 with Wx Version: 0.91.

Fedora-10 includes Padre-0.20 with Wx Version: 0.89.

Fedora-9 includes wxGTK-2.8.7 perl-Wx-0.81 perl-Alien-wxWidgets-0.32.

Fedora-8 includes Wx Version: 0.74 perl-Alien-wxWidgets-0.31.

Manual rebuild

It is possible rebuild latest Padre source rpm on your computer, but you will need rebuild also _a lot_ of dependencies. It's not recommended and it might be better to use CPAN. If you still like to rebuild it, you can try: Download source rpm http://koji.fedoraproject.org/koji/packageinfo?packageID=6964 yum install rpm-build rpmbuild --rebuild perl-Padre-yourversion.src.rpm

Still Not Working?

Following the instructions on this page did not lead to a successful installation?

Contact us.

We will do our best to help you. By letting us know that something does not work you will help us, too. When we know about it, we can improve this documentation and Padre itself.

Text-Trac-0.18/t/expected/padre_download_fedora_noclass.html000644 000765 000024 00000005300 12510162102 024454 0ustar00gaborstaff000000 000000

Fedora Installation Instructions

Installation using the Package Manager

Fedora 15

Provided versions: perl-Padre-0.84-1.fc15 with wxGTK-2.8.11-4.fc15 and perl-Alien-wxWidgets-0.51-4.fc15 # yum install perl-Padre

Fedora 14

Provided versions: perl-Padre-0.64-1.fc14 with wxGTK-2.8.11-3.fc14 and perl-Alien-wxWidgets-0.51-2.fc14 # yum install perl-Padre Apparently, after this padre will still complain libwx_gtk2u_stc-2.8.so cannot open shared object file

then also install # yum install wxGTK-devel

Related bug, which should be fixed in future versions: https://bugzilla.redhat.com/show_bug.cgi?id=656317

In older releases of Fedora is impossible to update because of Fedora update policy. In case you'd like to have latest Padre, you need update to the latest Fedora or use CPAN installation install Padre from CPAN.

=== Older releases === Older releases are not supported, but if you insist on using them install Padre and wxGTK-devel, which should workaround bugs. # yum install perl-Padre wxGTK-devel

Fedora-13 includes Padre-0.64 with Wx Version: 0.92 wxWidgets 2.8.11.

Fedora-12 includes Padre-0.64 with Wx Version: 0.92 wxWidgets 2.8.11.

Fedora-11 includes Padre-0.32 with Wx Version: 0.91.

Fedora-10 includes Padre-0.20 with Wx Version: 0.89.

Fedora-9 includes wxGTK-2.8.7 perl-Wx-0.81 perl-Alien-wxWidgets-0.32.

Fedora-8 includes Wx Version: 0.74 perl-Alien-wxWidgets-0.31.

Manual rebuild

It is possible rebuild latest Padre source rpm on your computer, but you will need rebuild also _a lot_ of dependencies. It's not recommended and it might be better to use CPAN. If you still like to rebuild it, you can try: Download source rpm http://koji.fedoraproject.org/koji/packageinfo?packageID=6964 yum install rpm-build rpmbuild --rebuild perl-Padre-yourversion.src.rpm

Still Not Working?

Following the instructions on this page did not lead to a successful installation?

Contact us.

We will do our best to help you. By letting us know that something does not work you will help us, too. When we know about it, we can improve this documentation and Padre itself.

Text-Trac-0.18/t/expected/padre_download_freebsd.html000644 000765 000024 00000006457 12510160023 023122 0ustar00gaborstaff000000 000000

FreeBSD Installation Instructions

Installation using pkg_add

Because the FreeBSD Perl package comes without threads support no official Padre packages are available. The prefered method is to manually recompile Perl port to support threads and then build Padre and all it's dependencies from Ports (see below).

However there are highly experimental packages available for FreeBSD 6-STABLE and 7-STABLE.

First, make sure you have uninstalled the non-threaded Perl package or that you have threaded Perl already compiled. Please note, that after installing threaded Perl all Perl modules already installed have to be recompiled. All packages depend on Perl 5.8.9 (that's the current Perl version for 6 and 7 branches).

First set PACKAGESITE environment variable to point to http://therek.net/freebsd/tb/6-STABLE-i386/All/Latest/ for 6-STABLE or http://therek.net/freebsd/tb/7-STABLE-i386/All/Latest/ for 7-STABLE. Then install packages as usual:

# setenv PACKAGESITE http://therek.net/freebsd/tb/6-STABLE-i386/All/Latest/ # for C Shell
# export PACKAGESITE=http://therek.net/freebsd/tb/6-STABLE-i386/All/Latest/ # for Bourne Shell
# pkg_add -r p5-Padre

Feedback is welcome.

Installation from Source

To run Padre on FreeBSD you have to recompile Perl to support threads. To verify whether your Perl installation has thread support turned on run following command. $ perl -V:usethreads usethreads='define';

If the result is define then you have already threaded Perl installed, otherwise execute: # cd /usr/ports/lang/perl5.8 && make WITH_THREADS=yes # make deinstall && make reinstall Optionally you can substitute make WITH_THREADS=yes with the following and choose THREADS in the menu. Then uninstall and reinstall Perl as above. This has an advantage over the previous method, because the preferred configuration options will be stored in your system's packing database. This way next time you'll be building Perl (i.e. updating) all stored options will be applied without the need to manually specify them. # make config # make

To install Padre and its dependencies just execute: # cd /usr/ports/editors/p5-Padre # make install clean

Installation from CPAN

Currently, there are no Padre CPAN installation instructions specific to FreeBSD. Feel free to add comments and hints.

Still Not Working?

Following the instructions on this page did not lead to a successful installation?

Contact us.

We will do our best to help you. By letting us know that something does not work you will help us, too. When we know about it, we can improve this documentation and Padre itself.

Text-Trac-0.18/t/expected/padre_download_freebsd_noclass.html000644 000765 000024 00000006276 12510162540 024651 0ustar00gaborstaff000000 000000

FreeBSD Installation Instructions

Installation using pkg_add

Because the FreeBSD Perl package comes without threads support no official Padre packages are available. The prefered method is to manually recompile Perl port to support threads and then build Padre and all it's dependencies from Ports (see below).

However there are highly experimental packages available for FreeBSD 6-STABLE and 7-STABLE.

First, make sure you have uninstalled the non-threaded Perl package or that you have threaded Perl already compiled. Please note, that after installing threaded Perl all Perl modules already installed have to be recompiled. All packages depend on Perl 5.8.9 (that's the current Perl version for 6 and 7 branches).

First set PACKAGESITE environment variable to point to http://therek.net/freebsd/tb/6-STABLE-i386/All/Latest/ for 6-STABLE or http://therek.net/freebsd/tb/7-STABLE-i386/All/Latest/ for 7-STABLE. Then install packages as usual:

# setenv PACKAGESITE http://therek.net/freebsd/tb/6-STABLE-i386/All/Latest/ # for C Shell
# export PACKAGESITE=http://therek.net/freebsd/tb/6-STABLE-i386/All/Latest/ # for Bourne Shell
# pkg_add -r p5-Padre

Feedback is welcome.

Installation from Source

To run Padre on FreeBSD you have to recompile Perl to support threads. To verify whether your Perl installation has thread support turned on run following command. $ perl -V:usethreads usethreads='define';

If the result is define then you have already threaded Perl installed, otherwise execute: # cd /usr/ports/lang/perl5.8 && make WITH_THREADS=yes # make deinstall && make reinstall Optionally you can substitute make WITH_THREADS=yes with the following and choose THREADS in the menu. Then uninstall and reinstall Perl as above. This has an advantage over the previous method, because the preferred configuration options will be stored in your system's packing database. This way next time you'll be building Perl (i.e. updating) all stored options will be applied without the need to manually specify them. # make config # make

To install Padre and its dependencies just execute: # cd /usr/ports/editors/p5-Padre # make install clean

Installation from CPAN

Currently, there are no Padre CPAN installation instructions specific to FreeBSD. Feel free to add comments and hints.

Still Not Working?

Following the instructions on this page did not lead to a successful installation?

Contact us.

We will do our best to help you. By letting us know that something does not work you will help us, too. When we know about it, we can improve this documentation and Padre itself.

Text-Trac-0.18/t/expected/padre_download_mandriva.html000644 000765 000024 00000002137 12507704755 023326 0ustar00gaborstaff000000 000000

Madriva Installation Instructions

Installation using the Package Manager

Mandriva 2009.0 comes with pre-packaged Padre 0.10. Mandriva 2009.1 will ship Padre 0.29. Mandriva cooker (development version) is following upstream quite closely.

To install padre:

# urpmi perl-Padre

Installation from CPAN

Mandriva 2008.1

To install Padre enter the following commands:

# urpmi perl-Alien-wxWidgets
# urpmi perl-Wx
$ cpan
cpan> install Padre

Still Not Working?

Following the instructions on this page did not lead to a successful installation?

Contact us.

We will do our best to help you. By letting us know that something does not work you will help us, too. When we know about it, we can improve this documentation and Padre itself.

Text-Trac-0.18/t/expected/padre_download_mandriva_noclass.html000644 000765 000024 00000002053 12510162167 025032 0ustar00gaborstaff000000 000000

Madriva Installation Instructions

Installation using the Package Manager

Mandriva 2009.0 comes with pre-packaged Padre 0.10. Mandriva 2009.1 will ship Padre 0.29. Mandriva cooker (development version) is following upstream quite closely.

To install padre:

# urpmi perl-Padre

Installation from CPAN

Mandriva 2008.1

To install Padre enter the following commands:

# urpmi perl-Alien-wxWidgets
# urpmi perl-Wx
$ cpan
cpan> install Padre

Still Not Working?

Following the instructions on this page did not lead to a successful installation?

Contact us.

We will do our best to help you. By letting us know that something does not work you will help us, too. When we know about it, we can improve this documentation and Padre itself.

Text-Trac-0.18/t/expected/padre_download_netbsd.html000644 000765 000024 00000004663 12510160136 022771 0ustar00gaborstaff000000 000000

NetBSD Installation Instructions

Installation using the Package Manager

For binary packages installation take a look at http://www.netbsd.org/docs/software/packages.html#binarydist. There are packages available for some platforms (including NetBSD and Darwin). The 2010Q1 release of pkgsrc will provide binary packages for Padre, too.

Packed by Sno|, contact pkgsrc-users@NetBSD.org in case of problems.

To install Padre on NetBSD or any other pkgsrc supported platform, simply $ cd /usr/pkgsrc/editors/p5-Padre $ make install clean clean-depends

If you want to add plugin's, too, check which ones are already available: $ cd /usr/pkgsrc $ echo */p5-Padre-Plugin-*

For each desired plugin, change the working directory to it's location and install as done above.

If you have trouble installing Padre using pkgsrc (and read the pkgsrc guide, mailing list archives and open PR's carefully), feel free to send your question to pkgsrc-p5-people or pkgsrc-users mailing list as found on http://www.netbsd.org/mailinglists/#descriptions-of-mailing-lists . Although the import and maintaining is mostly done by Jens Rehsack, your chance getting feedback is better asking the proper mailing list instead of the primary maintainer. You might get questions answered on irc://irc.freenode.net/ in the channel #pkgsrc .

Installation from CPAN

Currently, there are no Padre CPAN installation instructions specific to NetBSD. Feel free to add comments and hints.

Still Not Working?

Following the instructions on this page did not lead to a successful installation?

Contact us.

We will do our best to help you. By letting us know that something does not work you will help us, too. When we know about it, we can improve this documentation and Padre itself.

Text-Trac-0.18/t/expected/padre_download_netbsd_noclass.html000644 000765 000024 00000004503 12510162323 024504 0ustar00gaborstaff000000 000000

NetBSD Installation Instructions

Installation using the Package Manager

For binary packages installation take a look at http://www.netbsd.org/docs/software/packages.html#binarydist. There are packages available for some platforms (including NetBSD and Darwin). The 2010Q1 release of pkgsrc will provide binary packages for Padre, too.

Packed by Sno|, contact pkgsrc-users@NetBSD.org in case of problems.

To install Padre on NetBSD or any other pkgsrc supported platform, simply $ cd /usr/pkgsrc/editors/p5-Padre $ make install clean clean-depends

If you want to add plugin's, too, check which ones are already available: $ cd /usr/pkgsrc $ echo */p5-Padre-Plugin-*

For each desired plugin, change the working directory to it's location and install as done above.

If you have trouble installing Padre using pkgsrc (and read the pkgsrc guide, mailing list archives and open PR's carefully), feel free to send your question to pkgsrc-p5-people or pkgsrc-users mailing list as found on http://www.netbsd.org/mailinglists/#descriptions-of-mailing-lists . Although the import and maintaining is mostly done by Jens Rehsack, your chance getting feedback is better asking the proper mailing list instead of the primary maintainer. You might get questions answered on irc://irc.freenode.net/ in the channel #pkgsrc .

Installation from CPAN

Currently, there are no Padre CPAN installation instructions specific to NetBSD. Feel free to add comments and hints.

Still Not Working?

Following the instructions on this page did not lead to a successful installation?

Contact us.

We will do our best to help you. By letting us know that something does not work you will help us, too. When we know about it, we can improve this documentation and Padre itself.

Text-Trac-0.18/t/expected/padre_download_opensuse.html000644 000765 000024 00000002334 12510156415 023351 0ustar00gaborstaff000000 000000

openSUSE Installation Instructions

Installation using the Package Manager

Installation from CPAN

  1. Add the packman repository.
  2. Install the package 損wxWidgets-devel束 and the schema 損C/C++ Development束.

[[Image(yast.png)]] 3. Install Padre from CPAN.

Configure make_install_make_command and mbuild_install_build_command to enable sudo support in CPAN.

Still Not Working?

Following the instructions on this page did not lead to a successful installation?

Contact us.

We will do our best to help you. By letting us know that something does not work you will help us, too. When we know about it, we can improve this documentation and Padre itself.

Text-Trac-0.18/t/expected/padre_download_opensuse_noclass.html000644 000765 000024 00000002174 12510163644 025077 0ustar00gaborstaff000000 000000

openSUSE Installation Instructions

Installation using the Package Manager

Installation from CPAN

  1. Add the packman repository.
  2. Install the package 損wxWidgets-devel束 and the schema 損C/C++ Development束.

[[Image(yast.png)]] 3. Install Padre from CPAN.

Configure make_install_make_command and mbuild_install_build_command to enable sudo support in CPAN.

Still Not Working?

Following the instructions on this page did not lead to a successful installation?

Contact us.

We will do our best to help you. By letting us know that something does not work you will help us, too. When we know about it, we can improve this documentation and Padre itself.

Text-Trac-0.18/t/expected/padre_download_ubuntu.html000644 000765 000024 00000015272 12510157424 023040 0ustar00gaborstaff000000 000000

Ubuntu Installation Instructions

Apparently Ubuntu 11.04 also comes with broken wxWidgets or broken Wx. see here too

Please follow the instructions below to manually install (again) the wx related modules. Probably the best way is to use local::lib so your installation won't interfere with the system installation.

=== If you have upgraded to **natty**(11.04) from mavrick(10.10), * to install the wx library files you can #!sh $sudo apt-get install libwxbase2.8-0 libwxgtk2.8-0 libwxbase2.8-dev libwxgtk2.8-dev libgtk2.0-dev * Install gtk2-engines-pixbuf to get rid of the annoying warning on Ubuntu 11.10: Gtk-WARNING **: Unable to locate theme engine in module_path: "pixmap"

sudo apt-get install gtk2-engines-pixbuf * you can check the library files are installed with #!sh $ dpkg -l |grep -i libwx |awk '{ print $2 }' libwxbase2.8-0 libwxbase2.8-dev libwxgtk2.8-0 libwxgtk2.8-dev

$ dpkg -l |grep -i libgtk2.0-dev |awk '{ print $2 }' libgtk2.0-dev * you will need to reinstall WX. #!sh $sudo cpan .... cpan[1]> force install Wx Going to read '/root/.cpan/Metadata'

Database was generated on Wed, 04 May 2011 04:32:25 GMT

Running install for module 'Wx' Running make for M/MB/MBARBON/Wx-0.98.tar.gz Fetching with LWP: ....

Installation using the Package Manager

Ubuntu 10.10 contains Padre 0.63, Ubuntu 10.04 contains Padre 0.50

sudo apt-get install padre

Because of a packaging error, padre does not work out of the box on Ubuntu 10.10. One possible workaround is to install wx-perl from CPAN: sudo cpan Alien::wxWidgets sudo cpan Wx

Use apt-cache to find out which plug-ins are available: apt-cache -n search padre

On Ubuntu 10.04, you can install the following plug-ins: sudo apt-get install libpadre-plugin-css-perl libpadre-plugin-html-perl libpadre-plugin-spellcheck-perl libpadre-plugin-xml-perl libpadre-plugin-autoformat-perl libpadre-plugin-vi-perl libpadre-plugin-nopaste-perl

Installation from CPAN

This was checked for Ubuntu 9.04 and 10.10 but it should work for later versions as well.

  • Install required development packages
sudo apt-get install libwxgtk2.8-0 libwxgtk2.8-dev libwxbase2.8-dev libwxbase2.8-0 libgtk2.0-dev g++
# in your $HOME
cd $HOME

perl -v
# This is perl, v5.10.1 (*) built for i686-linux-gnu-thread-multi
# This is called system perl

# Install local::lib into your $HOME
wget http://search.cpan.org/CPAN/authors/id/G/GE/GETTY/local-lib-1.006007.tar.gz
tar xfz local-lib-1.006007.tar.gz
cd local-lib-1.006007/
perl Makefile.PL --bootstrap
make test && make install
cd $HOME

# Add local::lib to your .bashrc
echo 'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)' >>~/.bashrc

# Optional step if you do not want to close your terminal
eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)

# Optional: remove local::lib folder
rm -rf local-lib-1.006007

  • configure the cpan client setting the prerequisite_policy to 'follow' and to add a CPAN server in the urllist:
  • cpan
  • conf prerequisites_policy follow
  • conf urllist http://cpan.yahoo.com/
  • conf save
  • cpan App::cpanminus
  • cpanm Alien::wxWidgets
  • cpanm Wx
  • cpanm Padre

There are certain places where CPAN.pm is still asking for confirmation "is just needed temporarily during building or testing. Do you want to install it permanently (y/n) [yes]".

This can be eliminated by setting build_requires_install_policy to 'yes' in the CPAN client: * conf build_requires_install_policy yes * conf save

=== If you accidentally tried to install with wx-2.6 libs This can happen if you blindly try to install Padre using cpan without checking for library dependencies. In that case, the installation will die at some point during the Wx compilation phase. Alien::wxWidgets will think that you have v 2.6 (even after you install 2.8), so you must remove it before moving forward with the install. To check if Alien::wxWidgets is incorrect, run this at your command line: #!sh perl -MAlien::wxWidgets -e 'print Alien::wxWidgets->version, "\n"' If the output says 2.006### then Alien::wxWidgets needs to be fixed. If it says 2.008###, then this is not a problem.

Before doing any of the following steps, ensure that you have the wx-2.8 dev libs installed via apt-get, as detailed above. The steps that I have tried to fix this problem, in increasing levels of severity, are as follows. After you try each one, you can test if Alien::wxWidgets is properly configured by running the one-liner shown above and checking that the output says 2.008###.

* Force-install Alien::wxWidgets. (This didn't work for me for some reason.) * Install App::pmuninstall via CPAN and use it to remove Alien::wxWidgets. Then reinstall Alien::wxWidgets. * Remove the Alien::wxWidgets files by hand, then re-install Alien::wxWidgets from cpan. If you are using local::lib, you will find these in ~/perl5/lib/perl5/Alien and ~/perl5/lib/perl5/i686-linux-gnu-thread-multi/Alien. If you are installing these into your system perl, you will find these under similar folders at /usr/local/lib/perl5/..., I believe.

Still Not Working?

Following the instructions on this page did not lead to a successful installation?

Contact us.

We will do our best to help you. By letting us know that something does not work you will help us, too. When we know about it, we can improve this documentation and Padre itself.

Text-Trac-0.18/t/expected/padre_download_ubuntu_noclass.html000644 000765 000024 00000014735 12510162263 024562 0ustar00gaborstaff000000 000000

Ubuntu Installation Instructions

Apparently Ubuntu 11.04 also comes with broken wxWidgets or broken Wx. see here too

Please follow the instructions below to manually install (again) the wx related modules. Probably the best way is to use local::lib so your installation won't interfere with the system installation.

=== If you have upgraded to **natty**(11.04) from mavrick(10.10), * to install the wx library files you can #!sh $sudo apt-get install libwxbase2.8-0 libwxgtk2.8-0 libwxbase2.8-dev libwxgtk2.8-dev libgtk2.0-dev * Install gtk2-engines-pixbuf to get rid of the annoying warning on Ubuntu 11.10: Gtk-WARNING **: Unable to locate theme engine in module_path: "pixmap"

sudo apt-get install gtk2-engines-pixbuf * you can check the library files are installed with #!sh $ dpkg -l |grep -i libwx |awk '{ print $2 }' libwxbase2.8-0 libwxbase2.8-dev libwxgtk2.8-0 libwxgtk2.8-dev

$ dpkg -l |grep -i libgtk2.0-dev |awk '{ print $2 }' libgtk2.0-dev * you will need to reinstall WX. #!sh $sudo cpan .... cpan[1]> force install Wx Going to read '/root/.cpan/Metadata'

Database was generated on Wed, 04 May 2011 04:32:25 GMT

Running install for module 'Wx' Running make for M/MB/MBARBON/Wx-0.98.tar.gz Fetching with LWP: ....

Installation using the Package Manager

Ubuntu 10.10 contains Padre 0.63, Ubuntu 10.04 contains Padre 0.50

sudo apt-get install padre

Because of a packaging error, padre does not work out of the box on Ubuntu 10.10. One possible workaround is to install wx-perl from CPAN: sudo cpan Alien::wxWidgets sudo cpan Wx

Use apt-cache to find out which plug-ins are available: apt-cache -n search padre

On Ubuntu 10.04, you can install the following plug-ins: sudo apt-get install libpadre-plugin-css-perl libpadre-plugin-html-perl libpadre-plugin-spellcheck-perl libpadre-plugin-xml-perl libpadre-plugin-autoformat-perl libpadre-plugin-vi-perl libpadre-plugin-nopaste-perl

Installation from CPAN

This was checked for Ubuntu 9.04 and 10.10 but it should work for later versions as well.

  • Install required development packages
sudo apt-get install libwxgtk2.8-0 libwxgtk2.8-dev libwxbase2.8-dev libwxbase2.8-0 libgtk2.0-dev g++
# in your $HOME
cd $HOME

perl -v
# This is perl, v5.10.1 (*) built for i686-linux-gnu-thread-multi
# This is called system perl

# Install local::lib into your $HOME
wget http://search.cpan.org/CPAN/authors/id/G/GE/GETTY/local-lib-1.006007.tar.gz
tar xfz local-lib-1.006007.tar.gz
cd local-lib-1.006007/
perl Makefile.PL --bootstrap
make test && make install
cd $HOME

# Add local::lib to your .bashrc
echo 'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)' >>~/.bashrc

# Optional step if you do not want to close your terminal
eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)

# Optional: remove local::lib folder
rm -rf local-lib-1.006007

  • configure the cpan client setting the prerequisite_policy to 'follow' and to add a CPAN server in the urllist:
  • cpan
  • conf prerequisites_policy follow
  • conf urllist http://cpan.yahoo.com/
  • conf save
  • cpan App::cpanminus
  • cpanm Alien::wxWidgets
  • cpanm Wx
  • cpanm Padre

There are certain places where CPAN.pm is still asking for confirmation "is just needed temporarily during building or testing. Do you want to install it permanently (y/n) [yes]".

This can be eliminated by setting build_requires_install_policy to 'yes' in the CPAN client: * conf build_requires_install_policy yes * conf save

=== If you accidentally tried to install with wx-2.6 libs This can happen if you blindly try to install Padre using cpan without checking for library dependencies. In that case, the installation will die at some point during the Wx compilation phase. Alien::wxWidgets will think that you have v 2.6 (even after you install 2.8), so you must remove it before moving forward with the install. To check if Alien::wxWidgets is incorrect, run this at your command line: #!sh perl -MAlien::wxWidgets -e 'print Alien::wxWidgets->version, "\n"' If the output says 2.006### then Alien::wxWidgets needs to be fixed. If it says 2.008###, then this is not a problem.

Before doing any of the following steps, ensure that you have the wx-2.8 dev libs installed via apt-get, as detailed above. The steps that I have tried to fix this problem, in increasing levels of severity, are as follows. After you try each one, you can test if Alien::wxWidgets is properly configured by running the one-liner shown above and checking that the output says 2.008###.

* Force-install Alien::wxWidgets. (This didn't work for me for some reason.) * Install App::pmuninstall via CPAN and use it to remove Alien::wxWidgets. Then reinstall Alien::wxWidgets. * Remove the Alien::wxWidgets files by hand, then re-install Alien::wxWidgets from cpan. If you are using local::lib, you will find these in ~/perl5/lib/perl5/Alien and ~/perl5/lib/perl5/i686-linux-gnu-thread-multi/Alien. If you are installing these into your system perl, you will find these under similar folders at /usr/local/lib/perl5/..., I believe.

Still Not Working?

Following the instructions on this page did not lead to a successful installation?

Contact us.

We will do our best to help you. By letting us know that something does not work you will help us, too. When we know about it, we can improve this documentation and Padre itself.

Text-Trac-0.18/t/expected/padre_features.html000644 000765 000024 00000037734 12510160376 021454 0ustar00gaborstaff000000 000000

[[PageOutline(1-2)]]

List of existing and planned features with links to description of each feature with relevant tickets and test cases to make sure the features are implemented correctly.

Features

* Tools Prefernces draft

Perl-specific features

Plugins

Feature requests and ideas from other sources

In this section we have lists of features taken from verious articles and web sites comparing tools and even from other IDEs.

For each feature we first link it to a related ticket but later on we will point to the description of our implementation of that feature.

From Perlmonks

Perlmonks has a table comparing features of IDEs and editors to be used for Perl development.

The table can be found at Perl Development Tools

TODO: add links to the relevant Feature Pages

Feature Status or link to ticket
Perl Exclusive Why is yes considered good here?
Free yes - Under the "perl" license.
Perl Engine Any - Padre itself runs on 5.8.7 or higher but your code can run on any version of perl
Syntax Checking yes
Syntax colouring yes
Autoindent yes
Incremental search yes
Bracket Completition and Matching yes
Folding see under Visual Editor Effects
Var tree see in Outline
Code browser see in Outline
Debugger Perl 5 Debugger
Stepping See Debugger
Breakpoints See Debugger
Watches See Debugger
Var evaluation See Debugger
Stack module See Debugger
Bookmarks yes
Suggest & complete see #67 but add more
Identify errors also Syntax Checking
Interactive shell
Code snippets yes
Project
Control version Integrated Version Control
Multi document yes
Split View
IME Multilingual Input Method Editor
Docs & Help viewer yes
Module installer
WEB Integrated Web Server
FTP #12 Read and write over ftp protocol (modify the program at remote server)
HTML export #112 To export the source of program with the syntax colouring.
Linux Download
BSD DownloadFreeBSD and DownloadNetBSD
Mac OS X DownloadMacOSX
Solaris
Windows [wiki:DownloadWindows]

From Perl Needs Better Tools

Perl Needs Better Tools by Matisse Enzer

Feature Status or link to ticket
Syntax coloring
Real Time Syntax Checking
Version control integration
Code-assist editor
Excellent refactoring support Refactoring Perl 5 code
Tree view of source files and resources
Support for creating and running unit tests Automated Build and Test
Language-specific help Context Sensitive Help
Run your code under a debugger with real-time display of results
Automatic reformatting of code.
handling of multiple languages
Automated build and test

From Enlightened Perl

Work together with the folks at Enlightened Perl http://www.enlightenedperl.org/ to see how Padre can provide a GUI for their efforts. Look at Kensho, http://search.cpan.org/dist/Task-Kensho/ a list of recommended module and see how Padre can provide a GUI (via a plugin or in core Padre) for them.

From Competitors

See the 'Competitor Analysis'

From Eclipse EPIC

Eclipse CDT - C/C++ Development Tooling Eclipse Java development tools (JDT)

Some of these features are only relevant (or possible) for C/C++ or Java

Feature Status or link to ticket
Find all references
Find definition/declaration/usage
Type Hierarchy
Call Hierarchy (or call graph)
Refactoring
Source navigation
Syntax highlighting
Code folding under Visual Editor Effects
Hyperlink navigation
Include browser
Project creation Project Skeleton Generation
Managed build for various toolchains
Standard make build Via Run menu
Macro definition browser
Code generation partly (File -> New...)
Visual debugging tools
Memory, registers, and disassembly viewers
Text-Trac-0.18/t/expected/padre_features_noclass.html000644 000765 000024 00000035072 12510162706 023166 0ustar00gaborstaff000000 000000

[[PageOutline(1-2)]]

List of existing and planned features with links to description of each feature with relevant tickets and test cases to make sure the features are implemented correctly.

Features

* Tools Prefernces draft

Perl-specific features

Plugins

Feature requests and ideas from other sources

In this section we have lists of features taken from verious articles and web sites comparing tools and even from other IDEs.

For each feature we first link it to a related ticket but later on we will point to the description of our implementation of that feature.

From Perlmonks

Perlmonks has a table comparing features of IDEs and editors to be used for Perl development.

The table can be found at Perl Development Tools

TODO: add links to the relevant Feature Pages

Feature Status or link to ticket
Perl Exclusive Why is yes considered good here?
Free yes - Under the "perl" license.
Perl Engine Any - Padre itself runs on 5.8.7 or higher but your code can run on any version of perl
Syntax Checking yes
Syntax colouring yes
Autoindent yes
Incremental search yes
Bracket Completition and Matching yes
Folding see under Visual Editor Effects
Var tree see in Outline
Code browser see in Outline
Debugger Perl 5 Debugger
Stepping See Debugger
Breakpoints See Debugger
Watches See Debugger
Var evaluation See Debugger
Stack module See Debugger
Bookmarks yes
Suggest & complete see #67 but add more
Identify errors also Syntax Checking
Interactive shell
Code snippets yes
Project
Control version Integrated Version Control
Multi document yes
Split View
IME Multilingual Input Method Editor
Docs & Help viewer yes
Module installer
WEB Integrated Web Server
FTP #12 Read and write over ftp protocol (modify the program at remote server)
HTML export #112 To export the source of program with the syntax colouring.
Linux Download
BSD DownloadFreeBSD and DownloadNetBSD
Mac OS X DownloadMacOSX
Solaris
Windows [wiki:DownloadWindows]

From Perl Needs Better Tools

Perl Needs Better Tools by Matisse Enzer

Feature Status or link to ticket
Syntax coloring
Real Time Syntax Checking
Version control integration
Code-assist editor
Excellent refactoring support Refactoring Perl 5 code
Tree view of source files and resources
Support for creating and running unit tests Automated Build and Test
Language-specific help Context Sensitive Help
Run your code under a debugger with real-time display of results
Automatic reformatting of code.
handling of multiple languages
Automated build and test

From Enlightened Perl

Work together with the folks at Enlightened Perl http://www.enlightenedperl.org/ to see how Padre can provide a GUI for their efforts. Look at Kensho, http://search.cpan.org/dist/Task-Kensho/ a list of recommended module and see how Padre can provide a GUI (via a plugin or in core Padre) for them.

From Competitors

See the 'Competitor Analysis'

From Eclipse EPIC

Eclipse CDT - C/C++ Development Tooling Eclipse Java development tools (JDT)

Some of these features are only relevant (or possible) for C/C++ or Java

Feature Status or link to ticket
Find all references
Find definition/declaration/usage
Type Hierarchy
Call Hierarchy (or call graph)
Refactoring
Source navigation
Syntax highlighting
Code folding under Visual Editor Effects
Hyperlink navigation
Include browser
Project creation Project Skeleton Generation
Managed build for various toolchains
Standard make build Via Run menu
Macro definition browser
Code generation partly (File -> New...)
Visual debugging tools
Memory, registers, and disassembly viewers
Text-Trac-0.18/t/corpus/padre_development.trac000644 000765 000024 00000010211 12510160232 021623 0ustar00gaborstaff000000 000000 [[PageOutline(1-2)]] = Development in general = We are using Subversion for version control. The main development of Padre is in the trunk [http://svn.perlide.org/padre/trunk/Padre] but there are several additional projects and almost all the plugins of Padre also live in the same repository so the best if you check out the whole trunk [http://svn.perlide.org/padre/trunk] {{{ $ svn co http://svn.perlide.org/padre/trunk padre }}} Then you can run the standard CPAN module process: Make sure you have all of the needed prerequisites. See [http://padre.perlide.org/trac/wiki/Download] {{{ $ cd padre/Padre $ perl Makefile.PL # which will tell about all the missing dependencies of Padre # this may fail if you don't have Module::Install # if so, start cpan and install it with all its prerequisites $ make $ make test }}} For a more detailed set of instructions on how to install the dependencies visit the [wiki:Download] Once all the above works well you can launch Padre from the SVN tree by running {{{ $ perl dev }}} dev has some more parameters you can see by typing {{{ $ perl dev -h }}} The most important being {{{ $ perl dev -a }}} that will include the path to all the plugins located in trunk/ == Coding == See the http://search.cpan.org/dist/Padre/lib/Padre/Manual/Hacking.pod file for Core Padre development and http://search.cpan.org/dist/Padre/lib/Padre/Plugin.pm for Plugin development. == Translation == Translation is basically part of the development effort. For more details please take a look at this page: See [wiki:TranslationIntro] == Documentation == The documentation of Padre is standard POD embedded in the .pm files. If you'd like to improve those you should check out the source code of Padre as described above and send patches or ask for commit bit. The documentation is part of the regular development process. == QA/Testing == Unfortunately Padre has not enough automated test mostly due to the fact that we hardly know how to test GUI applications. The existing tests are located in the standard t/ directory. If you'd like to help in this and if you are on Windows you could take a look at the t/win32/ directory where we have a few tests written using Win32::GUItest. You would be very highly regarded if you improved the test coverage of Padre!! == Release Management == See separate page about [wiki:Release] = Development in a branch = Most of our development is done on the trunk but occasionally we prefer to make our private corner for experimental changes or changes that might not be stable for some time. Instructions on how to do that: Create a branch and work on it: Assuming you have already checked out http://svn.perlide.org/padre/trunk/ to /path/to/padre {{{ $ svn cp http://svn.perlide.org/padre/trunk/Padre http://svn.perlide.org/padre/branches/My-branch -m'some messages' $ cd /path/to/padre/Padre $ svn switch http://svn.perlide.org/padre/branches/My-branch . }}} If you run {{{ svn st .. }}} You will see a letter S infront to the Padre directory as that one is switched. Now you can edit, test and commit as usual. Your changes will be committed to the branch. When done and you would like to merge your changes 1. Make sure everything is committed {{{ $ cd /path/to/padre/Padre $ svn switch http://svn.perlide.org/padre/trunk/Padre $ svn log --stop-on-copy http://svn.perlide.org/padre/branches/My-branch }}} This will show you the changes you made on the branch. Take the FIRST and LAST revision numbers in this log and use the following command to see the full change you made: {{{ svn diff -rFIRST:LAST http://svn.perlide.org/padre/branches/My-branch }}} use the following to merge it back to trunk {{{ svn merge -rFIRST:LAST http://svn.perlide.org/padre/branches/My-branch . svn commit -m'merged -rFIRST:LAST http://svn.perlide.org/padre/branches/My-branch ' svn rm http://svn.perlide.org/padre/branches/My-branch -m'My-branch is not needed any more' }}} If you decided it was a dead-end you can just switch back to trunk and remove the branch. == Tickets == [[TicketQuery(component=development,order=id,desc=1,format=table,col=resolution|summary|owner|reporter)]] Text-Trac-0.18/t/corpus/padre_download_debian.trac000644 000765 000024 00000005154 12405306202 022426 0ustar00gaborstaff000000 000000 = Debian Installation Instructions = == Installation using the Package Manager == Padre 0.63 is available in [http://www.debian.org/ Debian] 6.0 ("squeeze"), as well as in the {{{unstable}}} (Pare 0.90) and {{{testing}}} (Padre 0.90) branches of Debian. Install: {{{ # aptitude install padre }}} === Older Stable Releases === If you run a stable release prior to Squeeze (6.0), you'd have to add an "unstable" or "testing" source to {{{/etc/apt/sources.list}}}, e.g. as follows: {{{ deb http://mirror.isoc.org.il/pub/debian/ unstable main deb-src http://mirror.isoc.org.il/pub/debian/ unstable main }}} Then update the package list {{{ # aptitude update }}} and perform the installation as described above. == Installation from CPAN or Subversion == Make sure that CPAN can work properly. Install the {{{build-essential}}} package if it is not yet installed. {{{ aptitude install libppix-regexp-perl libalien-wxwidgets-perl libppix-editortools-perl libio-string-perl libdevel-dumpvar-perl libfile-spec-perl libwx-perl libprobe-perl-perl libwxbase2.8-dev libdevel-refactor-perl libnet-daemon-perl libclass-unload-perl libthreads-shared-perl libwxgtk2.8-0 libtext-diff-perl libfile-next-perl libdbi-perl libtext-glob-perl ack-grep libclass-inspector-perl libtext-findindent-perl libfile-remove-perl libplrpc-perl libmodule-manifest-perl libparse-exuberantctags-perl libtemplate-tiny-perl libparse-errorstring-perl-perl libpod-pom-perl liborlite-migrate-perl libfile-pushd-perl libio-stringy-perl libwxbase2.8-0 libipc-run-perl libclass-adapter-perl libtask-weaken-perl libpod2-base-perl liborlite-perl libfile-find-rule-perl libpod-abstract-perl libclass-xsaccessor-perl libio-pty-perl libclone-perl libwx-perl-processstream-perl libipc-run3-perl libwxgtk2.8-dev libdbd-sqlite3-perl libfile-sharedir-perl libppi-perl wx2.8-headers libfile-homedir-perl liblist-moreutils-perl libdebug-client-perl libnumber-compare-perl libyaml-tiny-perl libgtk2.0-dev }}} Then either install from CPAN (which will help you to resolve possible additional dependencies), or run {{{ perl Makefile.PL make make test make install }}} in the Padre directory. Pay attention to the output of {{{perl Makefile.PL}}}, it may remind you of some missing CPAN modules that you need to install. (last checked Sep. 22, 2011, on Debian testing) == Still Not Working? == Following the instructions on this page did not lead to a successful installation? [http://padre.perlide.org/contact.html Contact us]. We will do our best to help you. By letting us know that something does not work you will help us, too. When we know about it, we can improve this documentation and Padre itself. Text-Trac-0.18/t/corpus/padre_download_fedora.trac000644 000765 000024 00000004275 12405306245 022456 0ustar00gaborstaff000000 000000 = Fedora Installation Instructions = == Installation using the Package Manager == === Fedora 15 === Provided versions: perl-Padre-0.84-1.fc15 with wxGTK-2.8.11-4.fc15 and perl-Alien-wxWidgets-0.51-4.fc15 {{{ # yum install perl-Padre }}} === Fedora 14 === Provided versions: perl-Padre-0.64-1.fc14 with wxGTK-2.8.11-3.fc14 and perl-Alien-wxWidgets-0.51-2.fc14 {{{ # yum install perl-Padre }}} Apparently, after this padre will still complain {{{ libwx_gtk2u_stc-2.8.so cannot open shared object file }}} then also install {{{ # yum install wxGTK-devel }}} Related bug, which should be fixed in future versions: https://bugzilla.redhat.com/show_bug.cgi?id=656317 In older releases of Fedora is impossible to update because of Fedora update policy. In case you'd like to have latest Padre, you need update to the latest Fedora or use CPAN installation [wiki:DownloadCPAN install Padre from CPAN]. === Older releases === Older releases are not supported, but if you insist on using them install Padre and wxGTK-devel, which should workaround bugs. {{{ # yum install perl-Padre wxGTK-devel }}} Fedora-13 includes Padre-0.64 with Wx Version: 0.92 wxWidgets 2.8.11. Fedora-12 includes Padre-0.64 with Wx Version: 0.92 wxWidgets 2.8.11. Fedora-11 includes Padre-0.32 with Wx Version: 0.91. Fedora-10 includes Padre-0.20 with Wx Version: 0.89. Fedora-9 includes wxGTK-2.8.7 perl-Wx-0.81 perl-Alien-wxWidgets-0.32. Fedora-8 includes Wx Version: 0.74 perl-Alien-wxWidgets-0.31. === Manual rebuild === It is possible rebuild latest Padre source rpm on your computer, but you will need rebuild also _a lot_ of dependencies. It's not recommended and it might be better to use CPAN. If you still like to rebuild it, you can try: {{{ Download source rpm http://koji.fedoraproject.org/koji/packageinfo?packageID=6964 yum install rpm-build rpmbuild --rebuild perl-Padre-yourversion.src.rpm }}} == Still Not Working? == Following the instructions on this page did not lead to a successful installation? [http://padre.perlide.org/contact.html Contact us]. We will do our best to help you. By letting us know that something does not work you will help us, too. When we know about it, we can improve this documentation and Padre itself. Text-Trac-0.18/t/corpus/padre_download_freebsd.trac000644 000765 000024 00000005247 12510157777 022643 0ustar00gaborstaff000000 000000 = FreeBSD Installation Instructions = == Installation using pkg_add == Because the FreeBSD Perl package comes without threads support no official Padre packages are available. The prefered method is to manually recompile Perl port to support threads and then build Padre and all it's dependencies from Ports (see below). However there are __'''highly experimental'''__ packages available for FreeBSD 6-STABLE and 7-STABLE. First, make sure you have uninstalled the non-threaded Perl package or that you have threaded Perl already compiled. Please note, that after installing threaded Perl all Perl modules already installed have to be recompiled. All packages depend on Perl 5.8.9 (that's the current Perl version for 6 and 7 branches). First set `PACKAGESITE` environment variable to point to {{{ http://therek.net/freebsd/tb/6-STABLE-i386/All/Latest/ }}} for 6-STABLE or {{{ http://therek.net/freebsd/tb/7-STABLE-i386/All/Latest/ }}} for 7-STABLE. Then install packages as usual: {{{ # setenv PACKAGESITE http://therek.net/freebsd/tb/6-STABLE-i386/All/Latest/ # for C Shell # export PACKAGESITE=http://therek.net/freebsd/tb/6-STABLE-i386/All/Latest/ # for Bourne Shell # pkg_add -r p5-Padre }}} Feedback is welcome. == Installation from Source == To run Padre on FreeBSD you have to recompile Perl to support threads. To verify whether your Perl installation has thread support turned on run following command. {{{ $ perl -V:usethreads usethreads='define'; }}} If the result is `define` then you have already threaded Perl installed, otherwise execute: {{{ # cd /usr/ports/lang/perl5.8 && make WITH_THREADS=yes # make deinstall && make reinstall }}} Optionally you can substitute `make WITH_THREADS=yes` with the following and choose `THREADS` in the menu. Then uninstall and reinstall Perl as above. This has an advantage over the previous method, because the preferred configuration options will be stored in your system's packing database. This way next time you'll be building Perl (i.e. updating) all stored options will be applied without the need to manually specify them. {{{ # make config # make }}} To install Padre and its dependencies just execute: {{{ # cd /usr/ports/editors/p5-Padre # make install clean }}} == Installation from CPAN == Currently, there are no Padre CPAN installation instructions specific to FreeBSD. Feel free to add comments and hints. == Still Not Working? == Following the instructions on this page did not lead to a successful installation? [http://padre.perlide.org/contact.html Contact us]. We will do our best to help you. By letting us know that something does not work you will help us, too. When we know about it, we can improve this documentation and Padre itself. Text-Trac-0.18/t/corpus/padre_download_mandriva.trac000644 000765 000024 00000001467 12507704716 023027 0ustar00gaborstaff000000 000000 = Madriva Installation Instructions = == Installation using the Package Manager == Mandriva 2009.0 comes with pre-packaged Padre 0.10. Mandriva 2009.1 will ship Padre 0.29. Mandriva cooker (development version) is following upstream quite closely. To install padre: {{{ # urpmi perl-Padre }}} == Installation from CPAN == === Mandriva 2008.1 === To install Padre enter the following commands: {{{ # urpmi perl-Alien-wxWidgets # urpmi perl-Wx $ cpan cpan> install Padre }}} == Still Not Working? == Following the instructions on this page did not lead to a successful installation? [http://padre.perlide.org/contact.html Contact us]. We will do our best to help you. By letting us know that something does not work you will help us, too. When we know about it, we can improve this documentation and Padre itself. Text-Trac-0.18/t/corpus/padre_download_netbsd.trac000644 000765 000024 00000003513 12510160121 022453 0ustar00gaborstaff000000 000000 = NetBSD Installation Instructions = == Installation using the Package Manager == For binary packages installation take a look at http://www.netbsd.org/docs/software/packages.html#binarydist. There are packages available for some platforms (including NetBSD and Darwin). The 2010Q1 release of pkgsrc will provide binary packages for Padre, too. Packed by Sno|, contact pkgsrc-users@NetBSD.org in case of problems. To install Padre on NetBSD or any other pkgsrc supported platform, simply {{{ $ cd /usr/pkgsrc/editors/p5-Padre $ make install clean clean-depends }}} If you want to add plugin's, too, check which ones are already available: {{{ $ cd /usr/pkgsrc $ echo */p5-Padre-Plugin-* }}} For each desired plugin, change the working directory to it's location and install as done above. If you have trouble installing Padre using pkgsrc (and read the pkgsrc guide, mailing list archives and open PR's carefully), feel free to send your question to {{{ pkgsrc-p5-people }}} or {{{ pkgsrc-users }}} mailing list as found on {{{ http://www.netbsd.org/mailinglists/#descriptions-of-mailing-lists }}}. Although the import and maintaining is mostly done by Jens Rehsack, your chance getting feedback is better asking the proper mailing list instead of the primary maintainer. You might get questions answered on {{{ irc://irc.freenode.net/ }}} in the channel {{{ #pkgsrc }}}. == Installation from CPAN == Currently, there are no Padre CPAN installation instructions specific to NetBSD. Feel free to add comments and hints. == Still Not Working? == Following the instructions on this page did not lead to a successful installation? [http://padre.perlide.org/contact.html Contact us]. We will do our best to help you. By letting us know that something does not work you will help us, too. When we know about it, we can improve this documentation and Padre itself. Text-Trac-0.18/t/corpus/padre_download_opensuse.trac000644 000765 000024 00000001525 12510156372 023053 0ustar00gaborstaff000000 000000 = openSUSE Installation Instructions = == Installation using the Package Manager == == Installation from CPAN == 1. [http://opensuse-community.org/Repositories/11.1 Add the packman repository.] 2. Install the package 損wxWidgets-devel束 and the schema 損C/C++ Development束. [[Image(yast.png)]] 3. [wiki:DownloadCPAN Install Padre from CPAN.] Configure [http://search.cpan.org/perldoc?CPAN#Config_Variables make_install_make_command and mbuild_install_build_command] to enable {{{sudo}}} support in CPAN. == Still Not Working? == Following the instructions on this page did not lead to a successful installation? [http://padre.perlide.org/contact.html Contact us]. We will do our best to help you. By letting us know that something does not work you will help us, too. When we know about it, we can improve this documentation and Padre itself. Text-Trac-0.18/t/corpus/padre_download_ubuntu.trac000644 000765 000024 00000013236 12510157401 022530 0ustar00gaborstaff000000 000000 = Ubuntu Installation Instructions = Apparently Ubuntu 11.04 also comes with [https://bugs.launchpad.net/ubuntu/+source/padre/+bug/761782 broken wxWidgets or broken Wx]. [http://ubuntuforums.org/showthread.php?t=1745375 see here too] Please follow the instructions below to manually install (again) the wx related modules. Probably the best way is to use local::lib so your installation won't interfere with the system installation. === If you have upgraded to **natty**(11.04) from mavrick(10.10), * to install the wx library files you can {{{#!sh $sudo apt-get install libwxbase2.8-0 libwxgtk2.8-0 libwxbase2.8-dev libwxgtk2.8-dev libgtk2.0-dev }}} * Install {{{gtk2-engines-pixbuf}}} to get rid of the annoying warning on Ubuntu 11.10: {{{Gtk-WARNING **: Unable to locate theme engine in module_path: "pixmap"}}} {{{ sudo apt-get install gtk2-engines-pixbuf }}} * you can check the library files are installed with {{{#!sh $ dpkg -l |grep -i libwx |awk '{ print $2 }' libwxbase2.8-0 libwxbase2.8-dev libwxgtk2.8-0 libwxgtk2.8-dev $ dpkg -l |grep -i libgtk2.0-dev |awk '{ print $2 }' libgtk2.0-dev }}} * you will need to reinstall WX. {{{#!sh $sudo cpan .... cpan[1]> force install Wx Going to read '/root/.cpan/Metadata' Database was generated on Wed, 04 May 2011 04:32:25 GMT Running install for module 'Wx' Running make for M/MB/MBARBON/Wx-0.98.tar.gz Fetching with LWP: .... }}} == Installation using the Package Manager == Ubuntu 10.10 contains Padre 0.63, Ubuntu 10.04 contains Padre 0.50 {{{ sudo apt-get install padre }}} Because of a packaging error, [https://bugs.launchpad.net/ubuntu/+source/padre/+bug/485012 padre does not work out of the box on Ubuntu 10.10]. One possible workaround is to install wx-perl from CPAN: {{{ sudo cpan Alien::wxWidgets sudo cpan Wx }}} Use {{{apt-cache}}} to find out which plug-ins are available: {{{ apt-cache -n search padre }}} On Ubuntu 10.04, you can install the following plug-ins: {{{ sudo apt-get install libpadre-plugin-css-perl libpadre-plugin-html-perl libpadre-plugin-spellcheck-perl libpadre-plugin-xml-perl libpadre-plugin-autoformat-perl libpadre-plugin-vi-perl libpadre-plugin-nopaste-perl }}} == Installation from CPAN == This was checked for Ubuntu 9.04 and 10.10 but it should work for later versions as well. * Install required development packages {{{ sudo apt-get install libwxgtk2.8-0 libwxgtk2.8-dev libwxbase2.8-dev libwxbase2.8-0 libgtk2.0-dev g++ }}} * download and setup local::lib ( http://search.cpan.org/dist/local-lib/ ) {{{ # in your $HOME cd $HOME perl -v # This is perl, v5.10.1 (*) built for i686-linux-gnu-thread-multi # This is called system perl # Install local::lib into your $HOME wget http://search.cpan.org/CPAN/authors/id/G/GE/GETTY/local-lib-1.006007.tar.gz tar xfz local-lib-1.006007.tar.gz cd local-lib-1.006007/ perl Makefile.PL --bootstrap make test && make install cd $HOME # Add local::lib to your .bashrc echo 'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)' >>~/.bashrc # Optional step if you do not want to close your terminal eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib) # Optional: remove local::lib folder rm -rf local-lib-1.006007 }}} * configure the cpan client setting the prerequisite_policy to 'follow' and to add a CPAN server in the urllist: * {{{cpan}}} * {{{conf prerequisites_policy follow}}} * {{{conf urllist http://cpan.yahoo.com/}}} * {{{conf save}}} * {{{cpan App::cpanminus}}} * {{{cpanm Alien::wxWidgets}}} * {{{cpanm Wx}}} * {{{cpanm Padre}}} There are certain places where CPAN.pm is still asking for confirmation "is just needed temporarily during building or testing. Do you want to install it permanently (y/n) [yes]". This can be eliminated by setting build_requires_install_policy to 'yes' in the CPAN client: * {{{conf build_requires_install_policy yes}}} * {{{conf save}}} === If you accidentally tried to install with wx-2.6 libs This can happen if you blindly try to install Padre using cpan without checking for library dependencies. In that case, the installation will die at some point during the Wx compilation phase. Alien::wxWidgets will think that you have v 2.6 (even after you install 2.8), so you must remove it before moving forward with the install. To check if Alien::wxWidgets is incorrect, run this at your command line: {{{#!sh perl -MAlien::wxWidgets -e 'print Alien::wxWidgets->version, "\n"' }}} If the output says 2.006### then Alien::wxWidgets needs to be fixed. If it says 2.008###, then this is not a problem. Before doing any of the following steps, ensure that you have the wx-2.8 dev libs installed via apt-get, as detailed above. The steps that I have tried to fix this problem, in increasing levels of severity, are as follows. After you try each one, you can test if Alien::wxWidgets is properly configured by running the one-liner shown above and checking that the output says 2.008###. * Force-install Alien::wxWidgets. (This didn't work for me for some reason.) * Install App::pmuninstall via CPAN and use it to remove Alien::wxWidgets. Then reinstall Alien::wxWidgets. * Remove the Alien::wxWidgets files by hand, then re-install Alien::wxWidgets from cpan. If you are using local::lib, you will find these in ~/perl5/lib/perl5/Alien and ~/perl5/lib/perl5/i686-linux-gnu-thread-multi/Alien. If you are installing these into your system perl, you will find these under similar folders at /usr/local/lib/perl5/..., I believe. == Still Not Working? == Following the instructions on this page did not lead to a successful installation? [http://padre.perlide.org/contact.html Contact us]. We will do our best to help you. By letting us know that something does not work you will help us, too. When we know about it, we can improve this documentation and Padre itself. Text-Trac-0.18/t/corpus/padre_features.trac000644 000765 000024 00000024616 12510160356 021144 0ustar00gaborstaff000000 000000 [[PageOutline(1-2)]] List of existing and planned features with links to description of each feature with relevant tickets and test cases to make sure the features are implemented correctly. = Features = * multi-platform: [wiki:DownloadWindows Microsoft Windows], [wiki:Download Linux], [wiki:DownloadFreeBSD FreeBSD], [wiki:DownloadMacOSX Mac OS X], [wiki:DownloadNetBSD NetBSD] * Free and Open Source Software under the Perl licensing terms: [http://svn.perlide.org/padre/trunk/Padre/COPYING GPL I] [http://svn.perlide.org/padre/trunk/Padre/Artistic Artistic I] * Written in Perl. There are parts that rely on libraries written in C or C++ but they are all wrapped in CPAN packages and have an API in Perl 5. * [wiki:Features/BasicEditorFeatures Basic Editor Features] * [wiki:Features/VisualEditorEffects Visual Editor Effects] * Line Numbers * Code Folding * Current Line * Right Margin * Newlines * Whitespaces * Indentation Guide * [wiki:Features/SyntaxHighlighting Syntax Highlighting] * [wiki:Features/Run Run a Script] * [wiki:Features/TitleAndStatusBarPersonalization Title and Status Bar Personalization] * [wiki:Features/CommandLineWindow Command Line Window] * [wiki:Features/OpenResource Open Resource] * [wiki:Features/QuickMenuAccess Quick Menu Access] * [wiki:Features/SingleInstance Single Instance] * [wiki:Features/AutoSave Automatic Save and Backup] * [wiki:Features/RemoteEditing Remote Editing via FTP, HTTP, SSH] * [wiki:Features/CooperativeEditing Cooperative Editing] (Swarm) * [wiki:Features/SearchAndReplace Search and Replace] * [wiki:Features/IncrementalSearch Incremental Search] * [wiki:Features/FindInFiles Find In Files] * [wiki:Features/TODOList TODO List] * [wiki:Features/EditPatch Patch] * [wiki:Features/AutoDiff Auto-Diff] * [wiki:Features/CodeSnippets Code Snippets] * [wiki:Features/CPANModuleInstaller CPAN Module Installer] * [wiki:Features/SessionManagement Session Management] * [wiki:Features/SplitView Split View] * [wiki:Features/Bookmarks Bookmarks] * [wiki:Features/RightClick Context Menu] * [wiki:Features/ProjectManagement Project Management] * [wiki:Features/ProjectSkeletonGeneration Project Skeleton Generation] * [wiki:Features/Autocomplete Autocomplete] * [wiki:Features/HelpViewer Help Viewer] * [wiki:Features/ContextSensitiveHelp Context Sensitive Help] * [wiki:Features/RectangularEditing Rectangular Selection and Editing] * [wiki:Features/Autoindent Autoindent] * [wiki:Features/Brackets Bracket Completition and Matching] * [wiki:Features/Outline Code Browser and Var tree called Outline] * [wiki:Features/Autocomplete Source code suggestions and Autocomplete] * [wiki:Features/PreferenceSystem Configuration and Preference System] * [wiki:Features/OpenSelection Open Selection] * Multi-document editing - as far as we understand this only means you can edit several files at the same time * Code-assist editor - What does this cover? * IME - [wiki:Features/MultilingualInputMethodEditor Multilingual Input Method Editor] * [wiki:Features/IntegratedWebServer Integrated Web Server] for web application development * Call tips * [wiki:Features/ToolsPrefernces Tools Prefernces draft] == Perl-specific features == * [wiki:Features/SyntaxChecking Real Time Syntax Checking For Perl 5 and 6] * [wiki:Features/Perl5Debugger Perl 5 Debugger] - perl debugging in Padre * [wiki:Features/RefactoringPerl5 Refactoring Perl 5 code] * [wiki:Features/AutomatedBuildAndTest Automated Build and Test] * [wiki:Features/Perl6 Perl 6 features] * [wiki:Features/RegexEditor Regex Editor] * [wiki:PluginAPI Extendable in Perl 5] via a Powerful [wiki:PluginAPI Plugin API] * [wiki:Features/PerlTidy] - automatic reformatting (tidying) of code * [wiki:Features/REPL REPL] * [wiki:Features/ProjectBrowser Project Browser] (Tree view of source files and resources) * [wiki:Features/IdentifyCommonErrors Identify Common Errors] * special features for beginners (we can create a page listing them) * advanced features (we can create a page listing them) * [wiki:Features/Extendable Extendable in Perl 6 and other languages] * [wiki:Features/HandleMultipleLanguages] == Plugins == * [wiki:Plugins] generic plugins related tickets * [wiki:Features/IntegratedVersionControl Integrated Version Control] * [wiki:Features/SuperGrep Super Grep] = Feature requests and ideas from other sources = In this section we have lists of features taken from verious articles and web sites comparing tools and even from other IDEs. For each feature we first link it to a related ticket but later on we will point to the description of our implementation of that feature. == From Perlmonks == Perlmonks has a table comparing features of IDEs and editors to be used for Perl development. The table can be found at [http://www.perlmonks.org/?node=Perl%20Development%20Tools Perl Development Tools] TODO: add links to the relevant Feature Pages || '''Feature''' || '''Status or link to ticket''' || || Perl Exclusive || Why is yes considered good here? || || Free || yes - Under the "perl" license. || || Perl Engine || Any - Padre itself runs on 5.8.7 or higher but your code can run on any version of perl || || [wiki:Features/SyntaxChecking Syntax Checking] || yes || || [wiki:Features/SyntaxHighlighting Syntax colouring] || yes || || [wiki:Features/Autoindent Autoindent] || yes || || [wiki:Features/IncrementalSearch Incremental search] || yes || || [wiki:Features/Brackets Bracket Completition and Matching] || yes || || Folding || see under [wiki:Features/VisualEditorEffects Visual Editor Effects] || || Var tree || see in [wiki:Features/Outline Outline] || || Code browser || see in [wiki:Features/Outline Outline] || || Debugger || [wiki:Features/Perl5Debugger Perl 5 Debugger] || || Stepping || See Debugger || || Breakpoints || See Debugger || || Watches || See Debugger || || Var evaluation || See Debugger || || Stack module || See Debugger || || [wiki:Features/Bookmarks Bookmarks] || yes || || Suggest & complete || see #67 but add more || || [wiki:Features/IdentifyCommonErrors Identify errors] || also [wiki:Features/SyntaxChecking Syntax Checking] || || [wiki:Features/REPL Interactive shell] || || || [wiki:Features/CodeSnippets Code snippets] || yes || || [wiki:Features/ProjectManagement Project] || || || Control version || [wiki:Features/IntegratedVersionControl Integrated Version Control] || || Multi document || yes || || [wiki:Features/SplitView Split View] || || || IME || Multilingual Input Method Editor || || [wiki:Features/HelpViewer Docs & Help viewer] || yes || || [wiki:Features/CPANModuleInstaller Module installer] || || || WEB || [wiki:Features/IntegratedWebServer Integrated Web Server] || || FTP || #12 Read and write over ftp protocol (modify the program at remote server) || || HTML export || #112 To export the source of program with the syntax colouring. || || Linux || [wiki:Download] || || BSD || [wiki:DownloadFreeBSD] and [wiki:DownloadNetBSD] || || Mac OS X || [wiki:DownloadMacOSX] || || Solaris || || || Windows || [wiki:DownloadWindows] || == From Perl Needs Better Tools == [http://www.eigenstate.net/perl_tools/ Perl Needs Better Tools] by Matisse Enzer ||'''Feature''' || '''Status or link to ticket''' || ||[wiki:Features/SyntaxHighlighting Syntax coloring] || || ||[wiki:Features/SyntaxChecking Real Time Syntax Checking] || || ||[wiki:Features/IntegratedVersionControl Version control integration] || || ||Code-assist editor || || ||Excellent refactoring support || [wiki:Features/RefactoringPerl5 Refactoring Perl 5 code] || ||Tree view of source files and resources || || ||Support for creating and running unit tests || [wiki:Features/AutomatedBuildAndTest Automated Build and Test] || ||Language-specific help || [wiki:Features/ContextSensitiveHelp Context Sensitive Help] || ||Run your code under a debugger with real-time display of results || || ||Automatic reformatting of code. || || ||handling of multiple languages || || ||Automated build and test || || == From Enlightened Perl == Work together with the folks at Enlightened Perl http://www.enlightenedperl.org/ to see how Padre can provide a GUI for their efforts. Look at Kensho, http://search.cpan.org/dist/Task-Kensho/ a list of recommended module and see how Padre can provide a GUI (via a plugin or in core Padre) for them. == From Competitors == See the [wiki:'Competitor Analysis'] == From Eclipse EPIC == [http://www.eclipse.org/cdt/ Eclipse CDT - C/C++ Development Tooling] [http://www.eclipse.org/jdt/ Eclipse Java development tools (JDT)] Some of these features are only relevant (or possible) for C/C++ or Java ||'''Feature''' || '''Status or link to ticket''' || ||Find all references || || ||Find definition/declaration/usage || || ||Type Hierarchy || || ||Call Hierarchy (or call graph) || || ||[wiki:Features/RefactoringPerl5 Refactoring] || || ||[wiki:Features/SourceNavigation Source navigation] || || ||[wiki:Features/SyntaxHighlighting Syntax highlighting] || || ||Code folding || under [wiki:Features/VisualEditorEffects Visual Editor Effects] || ||Hyperlink navigation || || ||Include browser || || ||Project creation || [wiki:Features/ProjectSkeletonGeneration Project Skeleton Generation] || ||Managed build for various toolchains || || ||Standard make build || Via Run menu || ||Macro definition browser || || ||Code generation || partly (File -> New...) || ||Visual debugging tools || || ||Memory, registers, and disassembly viewers || || Text-Trac-0.18/script/trac2html000644 000765 000024 00000001737 12510161207 016644 0ustar00gaborstaff000000 000000 #!/usr/bin/env perl use strict; use warnings; use Text::Trac (); use Getopt::Long qw(GetOptions); use Path::Tiny qw(path); my ($infile, $outfile); my $url = ''; my $class = 1; GetOptions( 'infile=s' => \$infile, 'outfile=s' => \$outfile, 'url=s' => \$url, 'class!' => \$class, ) or usage(); usage() if not $infile or not $outfile; die "Infile '$infile' does not exist.\n" if not -e $infile; die "Outfile '$outfile' already exists.\n" if -e $outfile; main(); exit; sub main { my $parser = Text::Trac->new( trac_url => $url, class => $class, # disable_links => [ qw( changeset ticket ) ], ); $parser->parse( path($infile)->slurp_utf8 ); path($outfile)->spew_utf8( $parser->html ); } sub usage { print <<"END_USAGE"; Usage: $0 --infile filename (File in Trac wiki format) --outfile filename (The html file to generate) --url http://... () --noclass Don't include class="" in the HTML tags. END_USAGE exit; } Text-Trac-0.18/lib/Text/000755 000765 000024 00000000000 12510314520 015175 5ustar00gaborstaff000000 000000 Text-Trac-0.18/lib/Text/Trac/000755 000765 000024 00000000000 12510314520 016066 5ustar00gaborstaff000000 000000 Text-Trac-0.18/lib/Text/Trac.pm000755 000765 000024 00000006733 12510314425 016444 0ustar00gaborstaff000000 000000 package Text::Trac; use strict; use warnings; use Text::Trac::Context; use Text::Trac::BlockNode; our $VERSION = '0.18'; my %Defaults = ( html => '', permalink => '', min_heading_level => 1, class => 1, ); sub new { my ( $class, %args ) = @_; my $self = { %Defaults, %args, }; bless $self, $class; } sub parse { my $self = shift; my $text = shift or return; $self->{trac_url} = '/' unless defined $self->{trac_url}; for ( keys %$self ) { if ( $_ =~ /^trac.+url$/ ) { $self->{$_} .= '/' if $self->{$_} !~ m!/$!; } } my $c = Text::Trac::Context->new( { %$self, text => $text, } ); my $node = Text::Trac::BlockNode->new( { context => $c, } ); $node->parse; $self->{html} = $c->html; } sub html { $_[0]->{html}; } *process = \&parse; 1; __END__ =head1 NAME Text::Trac - Perl extension for formatting text with Trac Wiki Style. =head1 SYNOPSIS use Text::Trac; my $parser = Text::Trac->new( trac_url => 'http://trac.mizzy.org/public/', disable_links => [ qw( changeset ticket ) ], ); $parser->parse($text); print $parser->html; =head1 DESCRIPTION Text::Trac parses text with Trac WikiFormatting and convert it to html format. =head1 METHODS =head2 new Constructs Text::Trac object. Available arguments are: =head3 trac_url Base URL for TracLinks.Default is /. You can specify each type of URL individually. Available URLs are: =over =item trac_attachment_url =item trac_changeset_url =item trac_log_url =item trac_milestone_url =item trac_report_url =item trac_source_url =item trac_ticket_url =item trac_wiki_url =back =head3 disable_links Specify TracLink types you want to disable. All types are enabled if you don't specify this option. my $parser = Text::Trac->new( disable_links => [ qw( changeset ticket ) ], ); =head3 enable_links Specify TracLink types you want to enable.Other types are disabled. You cannot use both disable_links and enable_links at once. my $parser = Text::Trac->new( enable_links => [ qw( changeset ticket ) ], ); =head2 parse Parses text and converts it to html format. =head2 process An alias of parse method. =head2 html Return converted html string. =head1 SEE ALSO =over 3 =item L =item Trac L =item Trac WikiFormatting L =back =head1 AUTHORS Gosuke Miyashita, C<< >> Hideaki Tanaka, C<< >> =head1 BUGS Please report any bugs or feature requests to C, or through the web interface at L. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. =head1 SUPPORT You can find documentation for this module with the perldoc command. perldoc Text::Trac You can also look for information at: =over 4 =item * AnnoCPAN: Annotated CPAN documentation L =item * CPAN Ratings L =item * RT: CPAN's request tracker L =item * Search CPAN L =back =head1 COPYRIGHT & LICENSE Copyright 2006 Gosuke Miyashita, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut Text-Trac-0.18/lib/Text/Trac/BlockNode.pm000755 000765 000024 00000004557 12510314425 020306 0ustar00gaborstaff000000 000000 package Text::Trac::BlockNode; use strict; use warnings; use base qw( Class::Accessor::Fast Class::Data::Inheritable ); use UNIVERSAL::require; use Text::Trac::InlineNode; our $VERSION = '0.18'; __PACKAGE__->mk_classdata( block_nodes => [qw( heading hr p ul ol blockquote pre table dl )] ); #__PACKAGE__->mk_classdata( # inline_nodes => [ qw( bold_italic bold italic underline monospace strike sup sub br # auto_link_http macro trac_links ) ] #); __PACKAGE__->mk_classdata( block_parsers => [] ); __PACKAGE__->mk_classdata( inline_parsers => [] ); __PACKAGE__->mk_accessors(qw( context pattern inline_parser )); sub new { my ( $class, $params ) = @_; my $self = { %$params, }; bless $self, $class; $self->init; $self->inline_parser( Text::Trac::InlineNode->new( $self->context ) ); return $self; } sub init { my $self = shift; return $self; } sub parse { my $self = shift; my $c = $self->context; $self->block_parsers( $self->_get_parsers('block') ); #$self->inline_parsers( $self->_get_parsers('inline') ); while ( defined( my $l = $c->shiftline ) ) { next if $l =~ /^$/; for my $parser ( @{ $self->_get_matched_parsers( 'block', $l ) } ) { $parser->parse($l); } } } sub escape { my ( $self, $l ) = @_; return $self->inline_parser->escape($l); } sub replace { my ( $self, $l ) = @_; return $self->inline_parser->parse($l); } sub _get_parsers { my ( $self, $type ) = @_; $type .= '_nodes'; my @parsers; for ( @{ $self->$type } ) { my $class = 'Text::Trac::' . $self->_camelize($_); $class->require; push @parsers, $class->new( { context => $self->context } ); } return \@parsers; } sub _get_matched_parsers { my ( $self, $type, $l ) = @_; my $c = $self->context; $type .= '_parsers'; my @matched_parsers; for my $parser ( @{ $self->$type } ) { next if ( grep { ref($parser) eq 'Text::Trac::' . $self->_camelize($_) } @{ $c->in_block_of } and $type =~ /^block/ ); my $pattern = $parser->pattern or next; if ( $l =~ /$pattern/ ) { push @matched_parsers, $parser; } } push @matched_parsers, Text::Trac::P->new( { context => $self->context } ) if ( !@matched_parsers and $type =~ /^block/ ); return \@matched_parsers; } sub _camelize { my ( $self, $word ) = @_; my $camelized_word; for ( split '_', $word ) { chomp($_); $camelized_word .= ucfirst($_); } return $camelized_word; } 1; Text-Trac-0.18/lib/Text/Trac/Blockquote.pm000755 000765 000024 00000003344 12510314425 020547 0ustar00gaborstaff000000 000000 package Text::Trac::Blockquote; use strict; use warnings; use base qw( Text::Trac::BlockNode ); our $VERSION = '0.18'; sub init { my $self = shift; $self->pattern(qr/^(?:>|\s+(?![*\s]|[\daiAI]\.\ +).+$)/); $self->block_nodes( [qw( heading p ul ol )] ); } sub parse { my ( $self, $l ) = @_; my $c = $self->{context}; my $pattern = $self->pattern; return if $l =~ /::$/; if ( $l =~ /^(>+).+/ ) { my $depth = length $1; my $blockquote_depth = 0; for ( @{ $c->in_block_of } ) { $blockquote_depth++ if $_ eq 'blockquote'; } my $class = $c->{class} ? q{class="citation"} : ''; if ( $depth > $blockquote_depth ) { for ( 1 .. $depth ) { $c->htmllines(qq{
}); push @{ $c->in_block_of }, 'blockquote'; } } } else { $c->htmllines('
'); push @{ $c->in_block_of }, 'blockquote'; } $c->unshiftline; while ( $c->hasnext ) { last if ( $c->nextline =~ /^\s*$/ ); my $l = $c->shiftline; if ( $l =~ /^(>+).+/ ) { my $depth = length $1; my $blockquote_depth = 0; for ( @{ $c->in_block_of } ) { $blockquote_depth++ if $_ eq 'blockquote'; } if ( $depth < $blockquote_depth ) { $c->unshiftline; last; } } # parse other block nodes my $block_parsers = $self->_get_matched_parsers( 'block', $l ); for my $parser ( @{$block_parsers} ) { $l = $parser->parse($l); } # parse inline nodes my $inline_parsers = $l ? $self->_get_matched_parsers( 'inline', $l ) : undef; for my $parser ( @{$inline_parsers} ) { $l = $parser->parse($l); } $c->htmllines($l); } if ( @{ $c->in_block_of } and $c->in_block_of->[-1] eq 'blockquote' ) { pop @{ $c->in_block_of }; $c->htmllines('
'); } return $l; } 1; Text-Trac-0.18/lib/Text/Trac/Context.pm000755 000765 000024 00000002564 12510314425 020066 0ustar00gaborstaff000000 000000 package Text::Trac::Context; use strict; use warnings; use base qw (Class::Accessor::Fast); our $VERSION = '0.18'; __PACKAGE__->mk_accessors(qw( ul ol min_heading_level permalink in_block_of trac_url )); my %Defaults = ( text => '', html => '', htmllines => [], ul => {}, ol => {}, shift_count => 0, in_block_of => [], disable_links => [], enable_links => [], ); sub new { my ( $class, $args ) = @_; my $self = { %Defaults, %$args, }; bless $self, $class; $self->init; return $self; } sub init { my $self = shift; $self->{text} =~ s/\r//g; @{ $self->{lines} } = split( '\n', $self->{text} ); $self->{index} = -1; $self->{htmllines} = []; } sub hasnext { my $self = shift; defined( $self->{lines}->[ $self->{index} + 1 ] ); } sub nextline { my $self = shift; $self->{lines}->[ $self->{index} + 1 ]; } sub shiftline { my $self = shift; $self->{lines}->[ ++$self->{index} ]; } sub unshiftline { my $self = shift; $self->{lines}->[ --$self->{index} ]; } sub currentline { my $self = shift; $self->{lines}->[ $self->{index} ]; } sub html { my $self = shift; join( "\n", @{ $self->{htmllines} } ); } sub htmllines { my $self = shift; push @{ $self->{htmllines} }, $_[0] if defined $_[0]; $self->{htmllines}; } sub lasthtmlline { $_[0]->{htmllines}->[-1]; } sub list_level { my $self = shift; } 1; Text-Trac-0.18/lib/Text/Trac/Dl.pm000755 000765 000024 00000002001 12510314425 016763 0ustar00gaborstaff000000 000000 package Text::Trac::Dl; use strict; use warnings; use base qw(Text::Trac::BlockNode); our $VERSION = '0.18'; sub init { my $self = shift; $self->pattern(qr/^\s+(.*)::$/xms); } sub parse { my ( $self, $l ) = @_; my $c = $self->{context}; my $pattern = $self->pattern; if ( !@{ $c->in_block_of } or $c->in_block_of->[-1] ne 'dl' ) { $c->htmllines('
'); push @{ $c->in_block_of }, 'dl'; } $c->unshiftline; while ( $c->hasnext ) { last if ( $c->nextline =~ /^$/ ); my $l = $c->shiftline; if ( $l =~ /$pattern/ ) { if ( $c->in_block_of->[-1] eq 'dd' ) { $l = "\n
$1
"; pop @{ $c->in_block_of }; } else { $l = "
$1
"; } } else { $l =~ s/^\s+//g; if ( $c->in_block_of->[-1] ne 'dd' ) { $l = "
\n$l"; push @{ $c->in_block_of }, 'dd'; } } $c->htmllines($l); } if ( $c->in_block_of->[-1] eq 'dd' ) { $c->htmllines('
'); pop @{ $c->in_block_of }; } pop @{ $c->in_block_of }; $c->htmllines('
'); return; } 1; Text-Trac-0.18/lib/Text/Trac/Heading.pm000755 000765 000024 00000001054 12510314425 017772 0ustar00gaborstaff000000 000000 package Text::Trac::Heading; use strict; use warnings; use base qw(Text::Trac::BlockNode); our $VERSION = '0.18'; sub init { my $self = shift; $self->pattern(qr/^(=+) \s (.*) \s (=+)$/xms); } sub parse { my ( $self, $l ) = @_; my $c = $self->context; $l =~ $self->pattern or return; my $level = length($1) + $c->min_heading_level - 1; my $id = $self->_strip($2); $l = qq() . $self->replace($2) . qq(); $c->htmllines($l); } sub _strip { my ( $self, $word ) = @_; $word =~ s/[\s,_`'{}!]//g; return $word; } 1; Text-Trac-0.18/lib/Text/Trac/Hr.pm000755 000765 000024 00000000573 12510314425 017011 0ustar00gaborstaff000000 000000 package Text::Trac::Hr; use strict; use warnings; use base qw(Text::Trac::BlockNode); our $VERSION = '0.18'; sub init { my $self = shift; $self->pattern(qr/^----$/xms); return $self; } sub parse { my ( $self, $l ) = @_; my $c = $self->context; my $pattern = $self->pattern; $l =~ $pattern or return; $l =~ s{ $pattern }{
}xmsg; $c->htmllines($l); } 1; Text-Trac-0.18/lib/Text/Trac/InlineNode.pm000644 000765 000024 00000017056 12510314425 020465 0ustar00gaborstaff000000 000000 package Text::Trac::InlineNode; use strict; use warnings; use Tie::IxHash; use Text::Trac::Macro; use UNIVERSAL::require; use Text::Trac::LinkResolver; use HTML::Entities qw(); our $VERSION = '0.18'; tie my %token_table, 'Tie::IxHash'; #my $handler = $token_table{'!?\\[\\d+\\]|(?:\\b|!)r\\d+\\b(?!:\\d)'}; #$handler->format_link('test'); my $link_scheme = '[\w.+-]+'; my $quoted_string = q{'[^']+'|"[^"]+"}; my $shref_target_first = '[\w/?!#@]'; my $shref_target_middle = '(?:\|(?=[^|\s])|[^|<>\s])'; my $shref_target_last = '[a-zA-Z0-9/=]'; my $shref = "!?$link_scheme: (?: $quoted_string |$shref_target_first(?:$shref_target_middle*$shref_target_last)? ) "; my $macro = '\[\[[\w/+-]+(?:\(.*\))?\]\]'; my $lhref_relative_target = '[/.][^\s[\]]*'; my $lhref = "!?\\[ (?: $link_scheme: (?:$quoted_string|[^\\[\\]\\s]*) |(?:$lhref_relative_target|[^\\[\\]\\s]) ) (?: \\s+ $quoted_string |[^\\]]+ )? \\] "; my $rules = join '|', ( map {"($_)"} ( keys %token_table ) ); $rules = qr/$rules/x; s/^\!\?// for values %token_table; s/^\\// for values %token_table; sub new { my ( $class, $c ) = @_; # external link resolvers my %external_handler; for (@Text::Trac::LinkResolver::handlers) { my $class = 'Text::Trac::LinkResolver::' . ucfirst($_); $class->require; my $handler = $class->new($c); $token_table{ $handler->{pattern} } = $handler if defined $handler->{pattern}; $external_handler{$_} = $handler; } %token_table = ( q{'''''} => 'bolditalic', q{'''} => 'bold', q{''} => 'italic', '!?__' => 'underline', '!?~~' => 'strike', '!?,,' => 'subscript', '!?\^' => 'superscript', '`|\{\{\{|\}\}\}' => 'inline', $macro => 'macro', %token_table, $lhref => 'lhref', $shref => 'shref', ); my $rules = join '|', ( map {"($_)"} ( keys %token_table ) ); $rules = qr/$rules/x; s/^\!\?// for values %token_table; s/^\\// for values %token_table; my $self = { context => $c, open_tags => [], rules => $rules, external_handler => \%external_handler, }; bless $self, $class; return $self; } sub parse { my ( $self, $rest ) = @_; my $html = ''; while ( $rest =~ /$self->{rules}/xms ) { $html .= $self->escape($`) . $self->_replace( $&, $`, $' ); $rest = $'; } return $html . $self->escape($rest); } sub escape { my ( $self, $s ) = @_; return HTML::Entities::encode( $s, '<>&"' ); } sub _replace { my ( $self, $match, $pre_match, $post_match ) = @_; if ( $match =~ s/^!// ) { return $match; } else { TOKEN: for my $token ( keys %token_table ) { if ( $match =~ /$token/x ) { my $formatter = $token_table{$token}; if ( ref $formatter ) { for (qw/ log source attachment http /) { next TOKEN if $match =~ /^\[?$_/; } return $formatter->format_link($match); } else { my $method = "_${formatter}_formatter"; return $self->$method( $match, $pre_match, $post_match ); } } } } } sub _simple_tag_handler { my ( $self, $open_tag, $close_tag ) = @_; if ( $self->_is_open($open_tag) ) { $self->_close_tag($open_tag); return $close_tag; } else { $self->_open_tag($open_tag); return $open_tag; } } sub _is_open { my ( $self, $tag ) = @_; return grep { $tag eq $_ } @{ $self->{open_tags} }; } sub _open_tag { my ( $self, $tag ) = @_; push @{ $self->{open_tags} }, $tag; } sub _close_tag { my ( $self, $tag ) = @_; my $index = 0; for ( @{ $self->{open_tags} } ) { last if $tag eq $_; $index++; } splice @{ $self->{open_tags} }, $index; } sub _bolditalic_formatter { my $self = shift; my $is_open = $self->_is_open(''); my $tmp; if ($is_open) { $tmp .= ''; $self->_close_tag(''); } $tmp .= $self->_bold_formatter; unless ($is_open) { $tmp .= ''; $self->_open_tag(''); } return $tmp; } sub _bold_formatter { my $self = shift; return $self->_simple_tag_handler( '', '' ); } sub _italic_formatter { my $self = shift; return $self->_simple_tag_handler( '', '' ); } sub _underline_formatter { my ( $self, $match, $pre_match, $post_match ) = @_; my $class_underline = $self->{context}->{class} ? q{class="underline"} : ''; return $self->_simple_tag_handler( qq{}, '' ); } sub _strike_formatter { my ( $self, $match, $pre_match, $post_match ) = @_; return $self->_simple_tag_handler( '', '' ); } sub _superscript_formatter { my ( $self, $match, $pre_match, $post_match ) = @_; return $self->_simple_tag_handler( '', '' ); } sub _subscript_formatter { my ( $self, $match, $pre_match, $post_match ) = @_; return $self->_simple_tag_handler( '', '' ); } sub _inline_formatter { my ( $self, $match, $pre_match, $post_match ) = @_; return $self->_simple_tag_handler( '', '' ); } sub _shref_formatter { my ( $self, $match ) = @_; my ( $ns, $target ) = ( $match =~ m/($link_scheme): ( $quoted_string |$shref_target_first (?: $shref_target_middle* $shref_target_last )? ) /x ); return $self->_make_link( $ns, $target, $match, $match ); } sub _lhref_formatter { my ( $self, $match ) = @_; my ( $ns, $target, $label ) = ( $match =~ m/\[ ($link_scheme): ( (?:$quoted_string|[^\]\s]*) |(?:$lhref_relative_target|[^\]\s]) ) (?: \s+ ($quoted_string|[^\]]+) )? \] /x ); if ( !$label ) { # e.g. `[http://target]` or `[wiki:target]` if ($target) { if ( $target =~ m!^//! ) { $label = $ns . ':' . $target; } else { $label = $target; } } else { # e.g. `[search:]` $label = $ns; } } return $self->_make_link( $ns, $target, $match, $label ); } sub _make_link { my ( $self, $ns, $target, $match, $label ) = @_; if ( $target =~ m!^//! or $target eq 'mailto' ) { return $self->_make_ext_link( $ns . ':' . $target, $label ); } else { my $handler = $self->{external_handler}->{$ns}; return $handler ? $handler->format_link( $match, $target, $label ) : $match; } } sub _make_ext_link { my ( $self, $url, $text, $title ) = @_; my $title_attr = $title ? qq{title="$title"} : ''; $title ||= $text; my $local = $self->{context}->{local} || ''; my $class_link = $self->{context}->{class} ? q{class="ext-link"} : ''; my $class_icon = $self->{context}->{class} ? q{class="icon"} : ''; if ( $url !~ /^$local/ or !$local ) { return qq{$text}; } } sub _macro_formatter { my ( $self, $match ) = @_; my ( $name, $args ) = ( $match =~ m!\[\[ ([\w/+-]+) (?:\( (.*) \))? \]\]!x ); if ( $name =~ /br/i ) { return '
'; } else { return Text::Trac::Macro->new->parse( $name, $args, $match ); } } package Text::Trac::InlineNode::Initializer; 1; Text-Trac-0.18/lib/Text/Trac/LinkResolver/000755 000765 000024 00000000000 12510314520 020505 5ustar00gaborstaff000000 000000 Text-Trac-0.18/lib/Text/Trac/LinkResolver.pm000755 000765 000024 00000001205 12510314425 021050 0ustar00gaborstaff000000 000000 package Text::Trac::LinkResolver; use strict; use warnings; use List::MoreUtils qw( any ); our $VERSION = '0.18'; our @handlers = qw( changeset wiki report log ticket milestone source attachment comment ); sub new { my $class = shift; my $self = { context => shift }; bless $self, $class; $self->init; return $self; } sub _is_disabled { my ( $self, $resolver ) = @_; ( my $formatter = ref $self ) =~ s/.*:://; if ( @{ $self->{context}->{enable_links} } ) { return !any { lcfirst($formatter) eq $_ } @{ $self->{context}->{enable_links} }; } return any { lcfirst($formatter) eq $_ } @{ $self->{context}->{disable_links} }; } 1; Text-Trac-0.18/lib/Text/Trac/Macro/000755 000765 000024 00000000000 12510314520 017127 5ustar00gaborstaff000000 000000 Text-Trac-0.18/lib/Text/Trac/Macro.pm000755 000765 000024 00000001231 12510314425 017471 0ustar00gaborstaff000000 000000 package Text::Trac::Macro; use strict; use warnings; use base qw(Text::Trac::InlineNode Class::Accessor::Fast); use UNIVERSAL::require; use Text::ParseWords qw(quotewords); our $VERSION = '0.18'; __PACKAGE__->mk_accessors('pattern'); sub new { my $class = shift; my $self = {}; bless $self, $class; return $self; } sub parse { my ( $self, $name, $args, $match ) = @_; my $c = $self->{context}; my @args = $args ? quotewords( ',\s*', 0, $args ) : (); s/^\s+|\s+$//g for @args; foreach my $class ( "Text::Trac::Macro::$name", $name ) { if ( $class->require ) { $match = $class->process( $c, @args ) || ''; last; } } return $match; } 1; Text-Trac-0.18/lib/Text/Trac/Node.pm000755 000765 000024 00000000540 12510314425 017317 0ustar00gaborstaff000000 000000 package Text::Trac::Node; use strict; use warnings; use base qw( Class::Accessor::Fast ); our $VERSION = '0.18'; sub init { my $self = shift; $self->{pattern} = ''; } sub parse { die; } sub html { $_[0]->{html}; } sub pattern { $_[0]->{pattern}; } sub context { my $self = shift; $self->{context} = $_[0] if $_[0]; $self->{context}; } 1; Text-Trac-0.18/lib/Text/Trac/Ol.pm000755 000765 000024 00000002766 12510314425 017020 0ustar00gaborstaff000000 000000 package Text::Trac::Ol; use strict; use warnings; use base qw(Text::Trac::BlockNode); our $VERSION = '0.18'; sub init { my $self = shift; $self->pattern(qr/(\s+) ([\daiAI])\. \s+ (.*)$/xms); return $self; } sub parse { my ( $self, $l ) = @_; my $c = $self->{context}; my $pattern = $self->pattern; $l =~ $pattern or return $l; my $type = $2; my $space = length($1); my $level = $c->ol->{level} || 0; $c->ol->{space} ||= 0; my $start_tag; if ( $type =~ /(\d)/ ) { $start_tag = $type == 1 ? '
    ' : qq{
      }; } elsif ( $type eq 'a' ) { $start_tag = q{
        }; } elsif ( $type eq 'A' ) { $start_tag = q{
          }; } elsif ( $type eq 'i' ) { $start_tag = q{
            }; } elsif ( $type eq 'I' ) { $start_tag = q{
              }; } if ( $space > $c->ol->{space} ) { for ( 1 .. ( $space + 1 ) / 2 - $level ) { $l = $start_tag . $l; $level++; } } elsif ( $space < $c->ol->{space} ) { for ( 1 .. ( $c->ol->{space} - $space ) / 2 ) { $l = '
            ' . $l; $level--; } $l =~ s!(?<=)(?= )!!; } else { $l = "$l"; } $c->ol( { level => $level, space => $space } ); # parse inline nodes $l =~ s{ $pattern }{'
          1. ' . $self->replace($3)}xmsge; if ( $c->hasnext and $c->nextline =~ $pattern ) { $self->parse($l); } else { for ( 1 .. $c->ol->{level} ) { $l .= '
          '; } $c->ol->{level} = 0; $c->ol->{space} = 0; } $c->htmllines($l); return; } 1; Text-Trac-0.18/lib/Text/Trac/P.pm000755 000765 000024 00000003454 12510314425 016640 0ustar00gaborstaff000000 000000 package Text::Trac::P; use strict; use warnings; use base qw(Text::Trac::BlockNode); use Text::Trac::Text; our $VERSION = '0.18'; sub parse { my ( $self, $l ) = @_; my $c = $self->{context}; if ( !@{ $c->in_block_of } or $c->in_block_of->[-1] ne 'p' ) { $c->htmllines('

          '); push @{ $c->in_block_of }, 'p'; } # define block parsers called. $self->block_nodes( [qw( blockquote hr )] ); $self->block_parsers( $self->_get_parsers('block') ); my $cite_depth = 0; $c->unshiftline; while ( $c->hasnext ) { last if $c->nextline =~ /^$/; $l = $c->shiftline; last if $l =~ /^\s+$/; my $blockquote_depth = 0; for ( @{ $c->in_block_of } ) { $blockquote_depth++ if $_ eq 'blockquote'; } if ( $l =~ /^(>+)/ ) { $cite_depth = length $1; if ( $blockquote_depth != $cite_depth ) { $c->unshiftline; last; } else { $l =~ s/^>+//; } } elsif ( $l !~ /^(?:>|\s+)/ and $blockquote_depth ) { $c->htmllines('

          '); pop @{ $c->in_block_of }; for ( 1 .. $blockquote_depth ) { $c->htmllines('
'); pop @{ $c->in_block_of }; } $c->unshiftline; last; } # parse other block nodes my $parsers = $self->_get_matched_parsers( 'block', $l ); if ( grep { ref($_) ne 'Text::Trac::P' } @{$parsers} ) { $c->htmllines('

'); pop @{ $c->in_block_of }; $c->unshiftline; last; } # parse inline nodes $l = $self->replace($l); $c->htmllines($l); } if ( @{ $c->in_block_of } and $c->in_block_of->[-1] eq 'p' ) { $c->htmllines('

'); pop @{ $c->in_block_of }; my $blockquote_depth = 0; for ( @{ $c->in_block_of } ) { $blockquote_depth++ if $_ eq 'blockquote'; } if ($cite_depth) { for ( $blockquote_depth .. length $1 ) { $c->htmllines(''); pop @{ $c->in_block_of }; } } } return; } 1; Text-Trac-0.18/lib/Text/Trac/Pre.pm000755 000765 000024 00000001212 12510314425 017155 0ustar00gaborstaff000000 000000 package Text::Trac::Pre; use strict; use warnings; use base qw(Text::Trac::BlockNode); our $VERSION = '0.18'; sub init { my $self = shift; $self->pattern(qr/^\{\{\{$/xms); return $self; } sub parse { my ( $self, $l ) = @_; my $c = $self->{context}; my $pattern = $self->pattern; $l =~ /$pattern/ or return $l; my $match = $1; my $class = $c->{class} ? q{class="wiki"} : ''; if ( $l =~ /^\{\{\{$/ ) { $c->htmllines(qq{
});
	}

	while ( $c->hasnext ) {
		my $l = $c->shiftline;
		if ( $l =~ /^\}\}\}$/ ) {
			$c->htmllines('
'); last; } else { $c->htmllines( $self->escape($l) ); } } return; } 1; Text-Trac-0.18/lib/Text/Trac/Table.pm000755 000765 000024 00000001336 12510314425 017465 0ustar00gaborstaff000000 000000 package Text::Trac::Table; use strict; use warnings; use base qw(Text::Trac::BlockNode); our $VERSION = '0.18'; sub init { my $self = shift; $self->pattern(qr/^\|\|([^\|]*\|\|(?:[^\|]*\|\|)+)$/xms); return $self; } sub parse { my ( $self, $l ) = @_; my $c = $self->{context}; my $pattern = $self->pattern; $l =~ $pattern or return $l; $c->htmllines(''); $c->unshiftline; while ( $c->hasnext and ( $c->nextline =~ $pattern ) ) { my $l = $c->shiftline; $l =~ s{ $self->{pattern} }{$1}xmsg; $l = ''; $c->htmllines($l); } $c->htmllines('
' . join( '', map { $self->replace($_) # parse inline nodes } split( /\|\|/, $l ) ) . '
'); return; } 1; Text-Trac-0.18/lib/Text/Trac/Text.pm000755 000765 000024 00000000542 12510314425 017360 0ustar00gaborstaff000000 000000 package Text::Trac::Text; use strict; use warnings; our $VERSION = '0.18'; sub new { my $class = shift; my %args = @_; my $self = { context => $args{context}, html => '', }; bless $self, $class; } sub parse { my $self = shift; $self->{html} = ''; my $text = shift or return; $self->{html} = $text; } sub html { $_[0]->{html}; } 1; Text-Trac-0.18/lib/Text/Trac/Ul.pm000755 000765 000024 00000002131 12510314425 017010 0ustar00gaborstaff000000 000000 package Text::Trac::Ul; use strict; use warnings; use base qw(Text::Trac::BlockNode); our $VERSION = '0.18'; sub init { my $self = shift; $self->pattern(qr/(\s+) \* \s+ (.*)$/xms); } sub parse { my ( $self, $l ) = @_; my $c = $self->{context}; my $pattern = $self->pattern; $l =~ $pattern or return $l; my $space = length($1); my $level = $c->ul->{level} || 0; $c->ul->{space} ||= 0; if ( $space > $c->ul->{space} ) { for ( 1 .. ( $space + 1 ) / 2 - $level ) { $l = '
    ' . $l; $level++; } } elsif ( $space < $c->ul->{space} ) { for ( 1 .. ( $c->ul->{space} - $space ) / 2 ) { $l = '
' . $l; $level--; } $l =~ s!(?<=)(?= )!!; } else { $l = "$l"; } $c->ul( { level => $level, space => $space } ); # parse inline nodes $l =~ s{ $pattern }{"
  • " . $self->replace($2)}xmsge; if ( $c->hasnext and $c->nextline =~ /$pattern/ ) { $self->parse($l); } else { for ( 1 .. $c->ul->{level} ) { $l .= '
  • '; } $c->ul->{level} = 0; $c->ul->{space} = 0; } # parse inline nodes $c->htmllines($l); return; } 1; Text-Trac-0.18/lib/Text/Trac/Macro/HelloWorld.pm000755 000765 000024 00000000302 12510314425 021542 0ustar00gaborstaff000000 000000 package Text::Trac::Macro::HelloWorld; use strict; use warnings; our $VERSION = '0.18'; sub process { my ( $class, $c, @args ) = @_; return 'Hello World, args = ' . join ', ', @args; } 1; Text-Trac-0.18/lib/Text/Trac/Macro/Timestamp.pm000755 000765 000024 00000000254 12510314425 021440 0ustar00gaborstaff000000 000000 package Text::Trac::Macro::Timestamp; use strict; use warnings; our $VERSION = '0.18'; sub process { my $class = shift; return '' . localtime(time) . ''; } 1; Text-Trac-0.18/lib/Text/Trac/LinkResolver/Attachment.pm000755 000765 000024 00000001153 12510314425 023142 0ustar00gaborstaff000000 000000 package Text::Trac::LinkResolver::Attachment; use strict; use warnings; use base qw( Text::Trac::LinkResolver ); our $VERSION = '0.18'; sub init { my $self = shift; } sub format_link { my ( $self, $match, $target, $label ) = @_; return $match if $self->_is_disabled; my $c = $self->{context}; $label ||= $match; my ( $type, $name, $file ) = ( $match =~ m/attachment:([^:]+):([^:]+):([^:\]\s]+)/ ); my $url = $c->{trac_attachment_url} || $c->trac_url . 'attachment/'; $url .= "$type/$name/$file"; return sprintf '%s', ( $c->{class} ? q{class="attachment"} : '' ), $url, $label; } 1; Text-Trac-0.18/lib/Text/Trac/LinkResolver/Changeset.pm000755 000765 000024 00000001134 12510314425 022752 0ustar00gaborstaff000000 000000 package Text::Trac::LinkResolver::Changeset; use strict; use warnings; use base qw( Text::Trac::LinkResolver ); our $VERSION = '0.18'; sub init { my $self = shift; $self->{pattern} = '!?\[\d+\]|(?:\b|!)r\d+\b(?!:\d)'; } sub format_link { my ( $self, $match, $target, $label ) = @_; return $match if $self->_is_disabled; my $c = $self->{context}; $label ||= $match; my ($rev) = ( $match =~ m/(\d+)/ ); my $url = $c->{trac_changeset_url} || $c->trac_url . 'changeset/'; $url .= $rev; return sprintf '%s', ( $c->{class} ? q{class="changeset"} : '' ), $url, $label; } 1; Text-Trac-0.18/lib/Text/Trac/LinkResolver/Comment.pm000644 000765 000024 00000001204 12510314425 022446 0ustar00gaborstaff000000 000000 package Text::Trac::LinkResolver::Comment; use strict; use warnings; use base qw( Text::Trac::LinkResolver ); our $VERSION = '0.18'; sub init { my $self = shift; $self->{pattern} = '!?(?_is_disabled; my $c = $self->{context}; $label ||= $match; my ( $rev, $commentId ) = ( $match =~ m/(\d+):(\d+)/ ); my $url = $c->{trac_ticket_url} || $c->trac_url . 'ticket/'; $url .= $rev; $url .= "#comment:$commentId"; return sprintf '%s', ( $c->{class} ? q{class="ticket"} : '' ), $url, $label; } 1; Text-Trac-0.18/lib/Text/Trac/LinkResolver/Log.pm000644 000765 000024 00000001154 12510314425 021571 0ustar00gaborstaff000000 000000 package Text::Trac::LinkResolver::Log; use strict; use warnings; use base qw( Text::Trac::LinkResolver ); our $VERSION = '0.18'; sub init { my $self = shift; $self->{pattern} = '!?\[\d+:\d+\]|(?:\b|!)r\d+:\d+\b'; } sub format_link { my ( $self, $match, $target, $label ) = @_; return $match if $self->_is_disabled; my $c = $self->{context}; $label ||= $match; my ( $from, $to ) = ( $match =~ m/(\d+):(\d+)/ ); my $url = $c->{trac_log_url} || $c->trac_url . 'log/'; return sprintf '%s', ( $c->{class} ? q{class="source"} : '' ), $url, $to, $from, $label; } 1; Text-Trac-0.18/lib/Text/Trac/LinkResolver/Milestone.pm000755 000765 000024 00000001067 12510314425 023015 0ustar00gaborstaff000000 000000 package Text::Trac::LinkResolver::Milestone; use strict; use warnings; use base qw( Text::Trac::LinkResolver ); our $VERSION = '0.18'; sub init { my $self = shift; } sub format_link { my ( $self, $match, $target, $label ) = @_; return $match if $self->_is_disabled; my $c = $self->{context}; $label ||= $match; my ( $from, $to ) = ( $match =~ m/(\d+):(\d+)/ ); my $url = $c->{trac_milestone_url} || $c->trac_url . 'milestone/'; $url .= $target; return sprintf '%s', ( $c->{class} ? q{class="milestone"} : '' ), $url, $label; } 1; Text-Trac-0.18/lib/Text/Trac/LinkResolver/Report.pm000755 000765 000024 00000001072 12510314425 022325 0ustar00gaborstaff000000 000000 package Text::Trac::LinkResolver::Report; use strict; use warnings; use base qw( Text::Trac::LinkResolver ); our $VERSION = '0.18'; sub init { my $self = shift; $self->{pattern} = '!?\{\d+\}'; } sub format_link { my ( $self, $match, $target, $label ) = @_; return $match if $self->_is_disabled; my $c = $self->{context}; $label ||= $match; my ($rev) = ( $match =~ m/(\d+)/ ); my $url = $c->{trac_report_url} || $c->trac_url . 'report/'; $url .= $rev; return sprintf '%s', ( $c->{class} ? q{class="report"} : '' ), $url, $label; } 1; Text-Trac-0.18/lib/Text/Trac/LinkResolver/Source.pm000644 000765 000024 00000001121 12510314425 022302 0ustar00gaborstaff000000 000000 package Text::Trac::LinkResolver::Source; use strict; use warnings; use base qw( Text::Trac::LinkResolver ); our $VERSION = '0.18'; sub init { my $self = shift; } sub format_link { my ( $self, $match, $target, $label ) = @_; return $match if $self->_is_disabled; my $c = $self->{context}; $label ||= $match; my ( $file, $rev ) = ( $target =~ m/([^#]+)(?:#(\d+))?/ ); my $url = $c->{trac_source_url} || $c->trac_url . 'browser/'; $url .= $file; $url .= "?rev=$rev" if $rev; return sprintf '%s', ( $c->{class} ? q{class="source"} : '' ), $url, $label; } 1; Text-Trac-0.18/lib/Text/Trac/LinkResolver/Ticket.pm000755 000765 000024 00000001076 12510314425 022301 0ustar00gaborstaff000000 000000 package Text::Trac::LinkResolver::Ticket; use strict; use warnings; use base qw( Text::Trac::LinkResolver ); our $VERSION = '0.18'; sub init { my $self = shift; $self->{pattern} = '!?(?_is_disabled; my $c = $self->{context}; $label ||= $match; my ($rev) = ( $match =~ m/(\d+)/ ); my $url = $c->{trac_ticket_url} || $c->trac_url . 'ticket/'; $url .= $rev; return sprintf '%s', ( $c->{class} ? q{class="ticket"} : '' ), $url, $label; } 1; Text-Trac-0.18/lib/Text/Trac/LinkResolver/Wiki.pm000755 000765 000024 00000001327 12510314425 021760 0ustar00gaborstaff000000 000000 package Text::Trac::LinkResolver::Wiki; use strict; use warnings; use base qw( Text::Trac::LinkResolver ); our $VERSION = '0.18'; sub init { my $self = shift; $self->{pattern} = '!?(?_is_disabled; my $c = $self->{context}; $label ||= $match; $target ||= $match; if ( $label =~ /\[wiki:(\S+)\s+(.+)\]/ ) { $target = $1; $label = $2; } my $url = $c->{trac_wiki_url} || $c->trac_url . 'wiki/'; $url .= $target; return sprintf '%s', ( $c->{class} ? q{class="wiki"} : '' ), $url, $label; } 1; Text-Trac-0.18/inc/Module/000755 000765 000024 00000000000 12510314520 015501 5ustar00gaborstaff000000 000000 Text-Trac-0.18/inc/Module/AutoInstall.pm000644 000765 000024 00000062254 12510314451 020312 0ustar00gaborstaff000000 000000 #line 1 package Module::AutoInstall; use strict; use Cwd (); use File::Spec (); use ExtUtils::MakeMaker (); use vars qw{$VERSION}; BEGIN { $VERSION = '1.14'; } # special map on pre-defined feature sets my %FeatureMap = ( '' => 'Core Features', # XXX: deprecated '-core' => 'Core Features', ); # various lexical flags my ( @Missing, @Existing, %DisabledTests, $UnderCPAN, $InstallDepsTarget, $HasCPANPLUS ); my ( $Config, $CheckOnly, $SkipInstall, $AcceptDefault, $TestOnly, $AllDeps, $UpgradeDeps ); my ( $PostambleActions, $PostambleActionsNoTest, $PostambleActionsUpgradeDeps, $PostambleActionsUpgradeDepsNoTest, $PostambleActionsListDeps, $PostambleActionsListAllDeps, $PostambleUsed, $NoTest); # See if it's a testing or non-interactive session _accept_default( $ENV{AUTOMATED_TESTING} or ! -t STDIN ); _init(); sub _accept_default { $AcceptDefault = shift; } sub _installdeps_target { $InstallDepsTarget = shift; } sub missing_modules { return @Missing; } sub do_install { __PACKAGE__->install( [ $Config ? ( UNIVERSAL::isa( $Config, 'HASH' ) ? %{$Config} : @{$Config} ) : () ], @Missing, ); } # initialize various flags, and/or perform install sub _init { foreach my $arg ( @ARGV, split( /[\s\t]+/, $ENV{PERL_AUTOINSTALL} || $ENV{PERL_EXTUTILS_AUTOINSTALL} || '' ) ) { if ( $arg =~ /^--config=(.*)$/ ) { $Config = [ split( ',', $1 ) ]; } elsif ( $arg =~ /^--installdeps=(.*)$/ ) { __PACKAGE__->install( $Config, @Missing = split( /,/, $1 ) ); exit 0; } elsif ( $arg =~ /^--upgradedeps=(.*)$/ ) { $UpgradeDeps = 1; __PACKAGE__->install( $Config, @Missing = split( /,/, $1 ) ); exit 0; } elsif ( $arg =~ /^--default(?:deps)?$/ ) { $AcceptDefault = 1; } elsif ( $arg =~ /^--check(?:deps)?$/ ) { $CheckOnly = 1; } elsif ( $arg =~ /^--skip(?:deps)?$/ ) { $SkipInstall = 1; } elsif ( $arg =~ /^--test(?:only)?$/ ) { $TestOnly = 1; } elsif ( $arg =~ /^--all(?:deps)?$/ ) { $AllDeps = 1; } } } # overrides MakeMaker's prompt() to automatically accept the default choice sub _prompt { goto &ExtUtils::MakeMaker::prompt unless $AcceptDefault; my ( $prompt, $default ) = @_; my $y = ( $default =~ /^[Yy]/ ); print $prompt, ' [', ( $y ? 'Y' : 'y' ), '/', ( $y ? 'n' : 'N' ), '] '; print "$default\n"; return $default; } # the workhorse sub import { my $class = shift; my @args = @_ or return; my $core_all; print "*** $class version " . $class->VERSION . "\n"; print "*** Checking for Perl dependencies...\n"; my $cwd = Cwd::getcwd(); $Config = []; my $maxlen = length( ( sort { length($b) <=> length($a) } grep { /^[^\-]/ } map { ref($_) ? ( ( ref($_) eq 'HASH' ) ? keys(%$_) : @{$_} ) : '' } map { +{@args}->{$_} } grep { /^[^\-]/ or /^-core$/i } keys %{ +{@args} } )[0] ); # We want to know if we're under CPAN early to avoid prompting, but # if we aren't going to try and install anything anyway then skip the # check entirely since we don't want to have to load (and configure) # an old CPAN just for a cosmetic message $UnderCPAN = _check_lock(1) unless $SkipInstall || $InstallDepsTarget; while ( my ( $feature, $modules ) = splice( @args, 0, 2 ) ) { my ( @required, @tests, @skiptests ); my $default = 1; my $conflict = 0; if ( $feature =~ m/^-(\w+)$/ ) { my $option = lc($1); # check for a newer version of myself _update_to( $modules, @_ ) and return if $option eq 'version'; # sets CPAN configuration options $Config = $modules if $option eq 'config'; # promote every features to core status $core_all = ( $modules =~ /^all$/i ) and next if $option eq 'core'; next unless $option eq 'core'; } print "[" . ( $FeatureMap{ lc($feature) } || $feature ) . "]\n"; $modules = [ %{$modules} ] if UNIVERSAL::isa( $modules, 'HASH' ); unshift @$modules, -default => &{ shift(@$modules) } if ( ref( $modules->[0] ) eq 'CODE' ); # XXX: bugward compatibility while ( my ( $mod, $arg ) = splice( @$modules, 0, 2 ) ) { if ( $mod =~ m/^-(\w+)$/ ) { my $option = lc($1); $default = $arg if ( $option eq 'default' ); $conflict = $arg if ( $option eq 'conflict' ); @tests = @{$arg} if ( $option eq 'tests' ); @skiptests = @{$arg} if ( $option eq 'skiptests' ); next; } printf( "- %-${maxlen}s ...", $mod ); if ( $arg and $arg =~ /^\D/ ) { unshift @$modules, $arg; $arg = 0; } # XXX: check for conflicts and uninstalls(!) them. my $cur = _version_of($mod); if (_version_cmp ($cur, $arg) >= 0) { print "loaded. ($cur" . ( $arg ? " >= $arg" : '' ) . ")\n"; push @Existing, $mod => $arg; $DisabledTests{$_} = 1 for map { glob($_) } @skiptests; } else { if (not defined $cur) # indeed missing { print "missing." . ( $arg ? " (would need $arg)" : '' ) . "\n"; } else { # no need to check $arg as _version_cmp ($cur, undef) would satisfy >= above print "too old. ($cur < $arg)\n"; } push @required, $mod => $arg; } } next unless @required; my $mandatory = ( $feature eq '-core' or $core_all ); if ( !$SkipInstall and ( $CheckOnly or ($mandatory and $UnderCPAN) or $AllDeps or $InstallDepsTarget or _prompt( qq{==> Auto-install the } . ( @required / 2 ) . ( $mandatory ? ' mandatory' : ' optional' ) . qq{ module(s) from CPAN?}, $default ? 'y' : 'n', ) =~ /^[Yy]/ ) ) { push( @Missing, @required ); $DisabledTests{$_} = 1 for map { glob($_) } @skiptests; } elsif ( !$SkipInstall and $default and $mandatory and _prompt( qq{==> The module(s) are mandatory! Really skip?}, 'n', ) =~ /^[Nn]/ ) { push( @Missing, @required ); $DisabledTests{$_} = 1 for map { glob($_) } @skiptests; } else { $DisabledTests{$_} = 1 for map { glob($_) } @tests; } } if ( @Missing and not( $CheckOnly or $UnderCPAN) ) { require Config; my $make = $Config::Config{make}; if ($InstallDepsTarget) { print "*** To install dependencies type '$make installdeps' or '$make installdeps_notest'.\n"; } else { print "*** Dependencies will be installed the next time you type '$make'.\n"; } # make an educated guess of whether we'll need root permission. print " (You may need to do that as the 'root' user.)\n" if eval '$>'; } print "*** $class configuration finished.\n"; chdir $cwd; # import to main:: no strict 'refs'; *{'main::WriteMakefile'} = \&Write if caller(0) eq 'main'; return (@Existing, @Missing); } sub _running_under { my $thing = shift; print <<"END_MESSAGE"; *** Since we're running under ${thing}, I'll just let it take care of the dependency's installation later. END_MESSAGE return 1; } # Check to see if we are currently running under CPAN.pm and/or CPANPLUS; # if we are, then we simply let it taking care of our dependencies sub _check_lock { return unless @Missing or @_; if ($ENV{PERL5_CPANM_IS_RUNNING}) { return _running_under('cpanminus'); } my $cpan_env = $ENV{PERL5_CPAN_IS_RUNNING}; if ($ENV{PERL5_CPANPLUS_IS_RUNNING}) { return _running_under($cpan_env ? 'CPAN' : 'CPANPLUS'); } require CPAN; if ($CPAN::VERSION > '1.89') { if ($cpan_env) { return _running_under('CPAN'); } return; # CPAN.pm new enough, don't need to check further } # last ditch attempt, this -will- configure CPAN, very sorry _load_cpan(1); # force initialize even though it's already loaded # Find the CPAN lock-file my $lock = MM->catfile( $CPAN::Config->{cpan_home}, ".lock" ); return unless -f $lock; # Check the lock local *LOCK; return unless open(LOCK, $lock); if ( ( $^O eq 'MSWin32' ? _under_cpan() : == getppid() ) and ( $CPAN::Config->{prerequisites_policy} || '' ) ne 'ignore' ) { print <<'END_MESSAGE'; *** Since we're running under CPAN, I'll just let it take care of the dependency's installation later. END_MESSAGE return 1; } close LOCK; return; } sub install { my $class = shift; my $i; # used below to strip leading '-' from config keys my @config = ( map { s/^-// if ++$i; $_ } @{ +shift } ); my ( @modules, @installed, @modules_to_upgrade ); while (my ($pkg, $ver) = splice(@_, 0, 2)) { # grep out those already installed if (_version_cmp(_version_of($pkg), $ver) >= 0) { push @installed, $pkg; if ($UpgradeDeps) { push @modules_to_upgrade, $pkg, $ver; } } else { push @modules, $pkg, $ver; } } if ($UpgradeDeps) { push @modules, @modules_to_upgrade; @installed = (); @modules_to_upgrade = (); } return @installed unless @modules; # nothing to do return @installed if _check_lock(); # defer to the CPAN shell print "*** Installing dependencies...\n"; return unless _connected_to('cpan.org'); my %args = @config; my %failed; local *FAILED; if ( $args{do_once} and open( FAILED, '.#autoinstall.failed' ) ) { while () { chomp; $failed{$_}++ } close FAILED; my @newmod; while ( my ( $k, $v ) = splice( @modules, 0, 2 ) ) { push @newmod, ( $k => $v ) unless $failed{$k}; } @modules = @newmod; } if ( _has_cpanplus() and not $ENV{PERL_AUTOINSTALL_PREFER_CPAN} ) { _install_cpanplus( \@modules, \@config ); } else { _install_cpan( \@modules, \@config ); } print "*** $class installation finished.\n"; # see if we have successfully installed them while ( my ( $pkg, $ver ) = splice( @modules, 0, 2 ) ) { if ( _version_cmp( _version_of($pkg), $ver ) >= 0 ) { push @installed, $pkg; } elsif ( $args{do_once} and open( FAILED, '>> .#autoinstall.failed' ) ) { print FAILED "$pkg\n"; } } close FAILED if $args{do_once}; return @installed; } sub _install_cpanplus { my @modules = @{ +shift }; my @config = _cpanplus_config( @{ +shift } ); my $installed = 0; require CPANPLUS::Backend; my $cp = CPANPLUS::Backend->new; my $conf = $cp->configure_object; return unless $conf->can('conf') # 0.05x+ with "sudo" support or _can_write($conf->_get_build('base')); # 0.04x # if we're root, set UNINST=1 to avoid trouble unless user asked for it. my $makeflags = $conf->get_conf('makeflags') || ''; if ( UNIVERSAL::isa( $makeflags, 'HASH' ) ) { # 0.03+ uses a hashref here $makeflags->{UNINST} = 1 unless exists $makeflags->{UNINST}; } else { # 0.02 and below uses a scalar $makeflags = join( ' ', split( ' ', $makeflags ), 'UNINST=1' ) if ( $makeflags !~ /\bUNINST\b/ and eval qq{ $> eq '0' } ); } $conf->set_conf( makeflags => $makeflags ); $conf->set_conf( prereqs => 1 ); while ( my ( $key, $val ) = splice( @config, 0, 2 ) ) { $conf->set_conf( $key, $val ); } my $modtree = $cp->module_tree; while ( my ( $pkg, $ver ) = splice( @modules, 0, 2 ) ) { print "*** Installing $pkg...\n"; MY::preinstall( $pkg, $ver ) or next if defined &MY::preinstall; my $success; my $obj = $modtree->{$pkg}; if ( $obj and _version_cmp( $obj->{version}, $ver ) >= 0 ) { my $pathname = $pkg; $pathname =~ s/::/\\W/; foreach my $inc ( grep { m/$pathname.pm/i } keys(%INC) ) { delete $INC{$inc}; } my $rv = $cp->install( modules => [ $obj->{module} ] ); if ( $rv and ( $rv->{ $obj->{module} } or $rv->{ok} ) ) { print "*** $pkg successfully installed.\n"; $success = 1; } else { print "*** $pkg installation cancelled.\n"; $success = 0; } $installed += $success; } else { print << "."; *** Could not find a version $ver or above for $pkg; skipping. . } MY::postinstall( $pkg, $ver, $success ) if defined &MY::postinstall; } return $installed; } sub _cpanplus_config { my @config = (); while ( @_ ) { my ($key, $value) = (shift(), shift()); if ( $key eq 'prerequisites_policy' ) { if ( $value eq 'follow' ) { $value = CPANPLUS::Internals::Constants::PREREQ_INSTALL(); } elsif ( $value eq 'ask' ) { $value = CPANPLUS::Internals::Constants::PREREQ_ASK(); } elsif ( $value eq 'ignore' ) { $value = CPANPLUS::Internals::Constants::PREREQ_IGNORE(); } else { die "*** Cannot convert option $key = '$value' to CPANPLUS version.\n"; } push @config, 'prereqs', $value; } elsif ( $key eq 'force' ) { push @config, $key, $value; } elsif ( $key eq 'notest' ) { push @config, 'skiptest', $value; } else { die "*** Cannot convert option $key to CPANPLUS version.\n"; } } return @config; } sub _install_cpan { my @modules = @{ +shift }; my @config = @{ +shift }; my $installed = 0; my %args; _load_cpan(); require Config; if (CPAN->VERSION < 1.80) { # no "sudo" support, probe for writableness return unless _can_write( MM->catfile( $CPAN::Config->{cpan_home}, 'sources' ) ) and _can_write( $Config::Config{sitelib} ); } # if we're root, set UNINST=1 to avoid trouble unless user asked for it. my $makeflags = $CPAN::Config->{make_install_arg} || ''; $CPAN::Config->{make_install_arg} = join( ' ', split( ' ', $makeflags ), 'UNINST=1' ) if ( $makeflags !~ /\bUNINST\b/ and eval qq{ $> eq '0' } ); # don't show start-up info $CPAN::Config->{inhibit_startup_message} = 1; # set additional options while ( my ( $opt, $arg ) = splice( @config, 0, 2 ) ) { ( $args{$opt} = $arg, next ) if $opt =~ /^(?:force|notest)$/; # pseudo-option $CPAN::Config->{$opt} = $arg; } if ($args{notest} && (not CPAN::Shell->can('notest'))) { die "Your version of CPAN is too old to support the 'notest' pragma"; } local $CPAN::Config->{prerequisites_policy} = 'follow'; while ( my ( $pkg, $ver ) = splice( @modules, 0, 2 ) ) { MY::preinstall( $pkg, $ver ) or next if defined &MY::preinstall; print "*** Installing $pkg...\n"; my $obj = CPAN::Shell->expand( Module => $pkg ); my $success = 0; if ( $obj and _version_cmp( $obj->cpan_version, $ver ) >= 0 ) { my $pathname = $pkg; $pathname =~ s/::/\\W/; foreach my $inc ( grep { m/$pathname.pm/i } keys(%INC) ) { delete $INC{$inc}; } my $rv = do { if ($args{force}) { CPAN::Shell->force( install => $pkg ) } elsif ($args{notest}) { CPAN::Shell->notest( install => $pkg ) } else { CPAN::Shell->install($pkg) } }; $rv ||= eval { $CPAN::META->instance( 'CPAN::Distribution', $obj->cpan_file, ) ->{install} if $CPAN::META; }; if ( $rv eq 'YES' ) { print "*** $pkg successfully installed.\n"; $success = 1; } else { print "*** $pkg installation failed.\n"; $success = 0; } $installed += $success; } else { print << "."; *** Could not find a version $ver or above for $pkg; skipping. . } MY::postinstall( $pkg, $ver, $success ) if defined &MY::postinstall; } return $installed; } sub _has_cpanplus { return ( $HasCPANPLUS = ( $INC{'CPANPLUS/Config.pm'} or _load('CPANPLUS::Shell::Default') ) ); } # make guesses on whether we're under the CPAN installation directory sub _under_cpan { require Cwd; require File::Spec; my $cwd = File::Spec->canonpath( Cwd::getcwd() ); my $cpan = File::Spec->canonpath( $CPAN::Config->{cpan_home} ); return ( index( $cwd, $cpan ) > -1 ); } sub _update_to { my $class = __PACKAGE__; my $ver = shift; return if _version_cmp( _version_of($class), $ver ) >= 0; # no need to upgrade if ( _prompt( "==> A newer version of $class ($ver) is required. Install?", 'y' ) =~ /^[Nn]/ ) { die "*** Please install $class $ver manually.\n"; } print << "."; *** Trying to fetch it from CPAN... . # install ourselves _load($class) and return $class->import(@_) if $class->install( [], $class, $ver ); print << '.'; exit 1; *** Cannot bootstrap myself. :-( Installation terminated. . } # check if we're connected to some host, using inet_aton sub _connected_to { my $site = shift; return ( ( _load('Socket') and Socket::inet_aton($site) ) or _prompt( qq( *** Your host cannot resolve the domain name '$site', which probably means the Internet connections are unavailable. ==> Should we try to install the required module(s) anyway?), 'n' ) =~ /^[Yy]/ ); } # check if a directory is writable; may create it on demand sub _can_write { my $path = shift; mkdir( $path, 0755 ) unless -e $path; return 1 if -w $path; print << "."; *** You are not allowed to write to the directory '$path'; the installation may fail due to insufficient permissions. . if ( eval '$>' and lc(`sudo -V`) =~ /version/ and _prompt( qq( ==> Should we try to re-execute the autoinstall process with 'sudo'?), ((-t STDIN) ? 'y' : 'n') ) =~ /^[Yy]/ ) { # try to bootstrap ourselves from sudo print << "."; *** Trying to re-execute the autoinstall process with 'sudo'... . my $missing = join( ',', @Missing ); my $config = join( ',', UNIVERSAL::isa( $Config, 'HASH' ) ? %{$Config} : @{$Config} ) if $Config; return unless system( 'sudo', $^X, $0, "--config=$config", "--installdeps=$missing" ); print << "."; *** The 'sudo' command exited with error! Resuming... . } return _prompt( qq( ==> Should we try to install the required module(s) anyway?), 'n' ) =~ /^[Yy]/; } # load a module and return the version it reports sub _load { my $mod = pop; # method/function doesn't matter my $file = $mod; $file =~ s|::|/|g; $file .= '.pm'; local $@; return eval { require $file; $mod->VERSION } || ( $@ ? undef: 0 ); } # report version without loading a module sub _version_of { my $mod = pop; # method/function doesn't matter my $file = $mod; $file =~ s|::|/|g; $file .= '.pm'; foreach my $dir ( @INC ) { next if ref $dir; my $path = File::Spec->catfile($dir, $file); next unless -e $path; require ExtUtils::MM_Unix; return ExtUtils::MM_Unix->parse_version($path); } return undef; } # Load CPAN.pm and it's configuration sub _load_cpan { return if $CPAN::VERSION and $CPAN::Config and not @_; require CPAN; # CPAN-1.82+ adds CPAN::Config::AUTOLOAD to redirect to # CPAN::HandleConfig->load. CPAN reports that the redirection # is deprecated in a warning printed at the user. # CPAN-1.81 expects CPAN::HandleConfig->load, does not have # $CPAN::HandleConfig::VERSION but cannot handle # CPAN::Config->load # Which "versions expect CPAN::Config->load? if ( $CPAN::HandleConfig::VERSION || CPAN::HandleConfig->can('load') ) { # Newer versions of CPAN have a HandleConfig module CPAN::HandleConfig->load; } else { # Older versions had the load method in Config directly CPAN::Config->load; } } # compare two versions, either use Sort::Versions or plain comparison # return values same as <=> sub _version_cmp { my ( $cur, $min ) = @_; return -1 unless defined $cur; # if 0 keep comparing return 1 unless $min; $cur =~ s/\s+$//; # check for version numbers that are not in decimal format if ( ref($cur) or ref($min) or $cur =~ /v|\..*\./ or $min =~ /v|\..*\./ ) { if ( ( $version::VERSION or defined( _load('version') )) and version->can('new') ) { # use version.pm if it is installed. return version->new($cur) <=> version->new($min); } elsif ( $Sort::Versions::VERSION or defined( _load('Sort::Versions') ) ) { # use Sort::Versions as the sorting algorithm for a.b.c versions return Sort::Versions::versioncmp( $cur, $min ); } warn "Cannot reliably compare non-decimal formatted versions.\n" . "Please install version.pm or Sort::Versions.\n"; } # plain comparison local $^W = 0; # shuts off 'not numeric' bugs return $cur <=> $min; } # nothing; this usage is deprecated. sub main::PREREQ_PM { return {}; } sub _make_args { my %args = @_; $args{PREREQ_PM} = { %{ $args{PREREQ_PM} || {} }, @Existing, @Missing } if $UnderCPAN or $TestOnly; if ( $args{EXE_FILES} and -e 'MANIFEST' ) { require ExtUtils::Manifest; my $manifest = ExtUtils::Manifest::maniread('MANIFEST'); $args{EXE_FILES} = [ grep { exists $manifest->{$_} } @{ $args{EXE_FILES} } ]; } $args{test}{TESTS} ||= 't/*.t'; $args{test}{TESTS} = join( ' ', grep { !exists( $DisabledTests{$_} ) } map { glob($_) } split( /\s+/, $args{test}{TESTS} ) ); my $missing = join( ',', @Missing ); my $config = join( ',', UNIVERSAL::isa( $Config, 'HASH' ) ? %{$Config} : @{$Config} ) if $Config; $PostambleActions = ( ($missing and not $UnderCPAN) ? "\$(PERL) $0 --config=$config --installdeps=$missing" : "\$(NOECHO) \$(NOOP)" ); my $deps_list = join( ',', @Missing, @Existing ); $PostambleActionsUpgradeDeps = "\$(PERL) $0 --config=$config --upgradedeps=$deps_list"; my $config_notest = join( ',', (UNIVERSAL::isa( $Config, 'HASH' ) ? %{$Config} : @{$Config}), 'notest', 1 ) if $Config; $PostambleActionsNoTest = ( ($missing and not $UnderCPAN) ? "\$(PERL) $0 --config=$config_notest --installdeps=$missing" : "\$(NOECHO) \$(NOOP)" ); $PostambleActionsUpgradeDepsNoTest = "\$(PERL) $0 --config=$config_notest --upgradedeps=$deps_list"; $PostambleActionsListDeps = '@$(PERL) -le "print for @ARGV" ' . join(' ', map $Missing[$_], grep $_ % 2 == 0, 0..$#Missing); my @all = (@Missing, @Existing); $PostambleActionsListAllDeps = '@$(PERL) -le "print for @ARGV" ' . join(' ', map $all[$_], grep $_ % 2 == 0, 0..$#all); return %args; } # a wrapper to ExtUtils::MakeMaker::WriteMakefile sub Write { require Carp; Carp::croak "WriteMakefile: Need even number of args" if @_ % 2; if ($CheckOnly) { print << "."; *** Makefile not written in check-only mode. . return; } my %args = _make_args(@_); no strict 'refs'; $PostambleUsed = 0; local *MY::postamble = \&postamble unless defined &MY::postamble; ExtUtils::MakeMaker::WriteMakefile(%args); print << "." unless $PostambleUsed; *** WARNING: Makefile written with customized MY::postamble() without including contents from Module::AutoInstall::postamble() -- auto installation features disabled. Please contact the author. . return 1; } sub postamble { $PostambleUsed = 1; my $fragment; $fragment .= <<"AUTO_INSTALL" if !$InstallDepsTarget; config :: installdeps \t\$(NOECHO) \$(NOOP) AUTO_INSTALL $fragment .= <<"END_MAKE"; checkdeps :: \t\$(PERL) $0 --checkdeps installdeps :: \t$PostambleActions installdeps_notest :: \t$PostambleActionsNoTest upgradedeps :: \t$PostambleActionsUpgradeDeps upgradedeps_notest :: \t$PostambleActionsUpgradeDepsNoTest listdeps :: \t$PostambleActionsListDeps listalldeps :: \t$PostambleActionsListAllDeps END_MAKE return $fragment; } 1; __END__ #line 1197 Text-Trac-0.18/inc/Module/Install/000755 000765 000024 00000000000 12510314520 017107 5ustar00gaborstaff000000 000000 Text-Trac-0.18/inc/Module/Install.pm000644 000765 000024 00000030217 12510314450 017452 0ustar00gaborstaff000000 000000 #line 1 package Module::Install; # For any maintainers: # The load order for Module::Install is a bit magic. # It goes something like this... # # IF ( host has Module::Install installed, creating author mode ) { # 1. Makefile.PL calls "use inc::Module::Install" # 2. $INC{inc/Module/Install.pm} set to installed version of inc::Module::Install # 3. The installed version of inc::Module::Install loads # 4. inc::Module::Install calls "require Module::Install" # 5. The ./inc/ version of Module::Install loads # } ELSE { # 1. Makefile.PL calls "use inc::Module::Install" # 2. $INC{inc/Module/Install.pm} set to ./inc/ version of Module::Install # 3. The ./inc/ version of Module::Install loads # } use 5.006; use strict 'vars'; use Cwd (); use File::Find (); use File::Path (); use vars qw{$VERSION $MAIN}; BEGIN { # All Module::Install core packages now require synchronised versions. # This will be used to ensure we don't accidentally load old or # different versions of modules. # This is not enforced yet, but will be some time in the next few # releases once we can make sure it won't clash with custom # Module::Install extensions. $VERSION = '1.14'; # Storage for the pseudo-singleton $MAIN = undef; *inc::Module::Install::VERSION = *VERSION; @inc::Module::Install::ISA = __PACKAGE__; } sub import { my $class = shift; my $self = $class->new(@_); my $who = $self->_caller; #------------------------------------------------------------- # all of the following checks should be included in import(), # to allow "eval 'require Module::Install; 1' to test # installation of Module::Install. (RT #51267) #------------------------------------------------------------- # Whether or not inc::Module::Install is actually loaded, the # $INC{inc/Module/Install.pm} is what will still get set as long as # the caller loaded module this in the documented manner. # If not set, the caller may NOT have loaded the bundled version, and thus # they may not have a MI version that works with the Makefile.PL. This would # result in false errors or unexpected behaviour. And we don't want that. my $file = join( '/', 'inc', split /::/, __PACKAGE__ ) . '.pm'; unless ( $INC{$file} ) { die <<"END_DIE" } Please invoke ${\__PACKAGE__} with: use inc::${\__PACKAGE__}; not: use ${\__PACKAGE__}; END_DIE # This reportedly fixes a rare Win32 UTC file time issue, but # as this is a non-cross-platform XS module not in the core, # we shouldn't really depend on it. See RT #24194 for detail. # (Also, this module only supports Perl 5.6 and above). eval "use Win32::UTCFileTime" if $^O eq 'MSWin32' && $] >= 5.006; # If the script that is loading Module::Install is from the future, # then make will detect this and cause it to re-run over and over # again. This is bad. Rather than taking action to touch it (which # is unreliable on some platforms and requires write permissions) # for now we should catch this and refuse to run. if ( -f $0 ) { my $s = (stat($0))[9]; # If the modification time is only slightly in the future, # sleep briefly to remove the problem. my $a = $s - time; if ( $a > 0 and $a < 5 ) { sleep 5 } # Too far in the future, throw an error. my $t = time; if ( $s > $t ) { die <<"END_DIE" } Your installer $0 has a modification time in the future ($s > $t). This is known to create infinite loops in make. Please correct this, then run $0 again. END_DIE } # Build.PL was formerly supported, but no longer is due to excessive # difficulty in implementing every single feature twice. if ( $0 =~ /Build.PL$/i ) { die <<"END_DIE" } Module::Install no longer supports Build.PL. It was impossible to maintain duel backends, and has been deprecated. Please remove all Build.PL files and only use the Makefile.PL installer. END_DIE #------------------------------------------------------------- # To save some more typing in Module::Install installers, every... # use inc::Module::Install # ...also acts as an implicit use strict. $^H |= strict::bits(qw(refs subs vars)); #------------------------------------------------------------- unless ( -f $self->{file} ) { foreach my $key (keys %INC) { delete $INC{$key} if $key =~ /Module\/Install/; } local $^W; require "$self->{path}/$self->{dispatch}.pm"; File::Path::mkpath("$self->{prefix}/$self->{author}"); $self->{admin} = "$self->{name}::$self->{dispatch}"->new( _top => $self ); $self->{admin}->init; @_ = ($class, _self => $self); goto &{"$self->{name}::import"}; } local $^W; *{"${who}::AUTOLOAD"} = $self->autoload; $self->preload; # Unregister loader and worker packages so subdirs can use them again delete $INC{'inc/Module/Install.pm'}; delete $INC{'Module/Install.pm'}; # Save to the singleton $MAIN = $self; return 1; } sub autoload { my $self = shift; my $who = $self->_caller; my $cwd = Cwd::getcwd(); my $sym = "${who}::AUTOLOAD"; $sym->{$cwd} = sub { my $pwd = Cwd::getcwd(); if ( my $code = $sym->{$pwd} ) { # Delegate back to parent dirs goto &$code unless $cwd eq $pwd; } unless ($$sym =~ s/([^:]+)$//) { # XXX: it looks like we can't retrieve the missing function # via $$sym (usually $main::AUTOLOAD) in this case. # I'm still wondering if we should slurp Makefile.PL to # get some context or not ... my ($package, $file, $line) = caller; die <<"EOT"; Unknown function is found at $file line $line. Execution of $file aborted due to runtime errors. If you're a contributor to a project, you may need to install some Module::Install extensions from CPAN (or other repository). If you're a user of a module, please contact the author. EOT } my $method = $1; if ( uc($method) eq $method ) { # Do nothing return; } elsif ( $method =~ /^_/ and $self->can($method) ) { # Dispatch to the root M:I class return $self->$method(@_); } # Dispatch to the appropriate plugin unshift @_, ( $self, $1 ); goto &{$self->can('call')}; }; } sub preload { my $self = shift; unless ( $self->{extensions} ) { $self->load_extensions( "$self->{prefix}/$self->{path}", $self ); } my @exts = @{$self->{extensions}}; unless ( @exts ) { @exts = $self->{admin}->load_all_extensions; } my %seen; foreach my $obj ( @exts ) { while (my ($method, $glob) = each %{ref($obj) . '::'}) { next unless $obj->can($method); next if $method =~ /^_/; next if $method eq uc($method); $seen{$method}++; } } my $who = $self->_caller; foreach my $name ( sort keys %seen ) { local $^W; *{"${who}::$name"} = sub { ${"${who}::AUTOLOAD"} = "${who}::$name"; goto &{"${who}::AUTOLOAD"}; }; } } sub new { my ($class, %args) = @_; delete $INC{'FindBin.pm'}; { # to suppress the redefine warning local $SIG{__WARN__} = sub {}; require FindBin; } # ignore the prefix on extension modules built from top level. my $base_path = Cwd::abs_path($FindBin::Bin); unless ( Cwd::abs_path(Cwd::getcwd()) eq $base_path ) { delete $args{prefix}; } return $args{_self} if $args{_self}; $args{dispatch} ||= 'Admin'; $args{prefix} ||= 'inc'; $args{author} ||= ($^O eq 'VMS' ? '_author' : '.author'); $args{bundle} ||= 'inc/BUNDLES'; $args{base} ||= $base_path; $class =~ s/^\Q$args{prefix}\E:://; $args{name} ||= $class; $args{version} ||= $class->VERSION; unless ( $args{path} ) { $args{path} = $args{name}; $args{path} =~ s!::!/!g; } $args{file} ||= "$args{base}/$args{prefix}/$args{path}.pm"; $args{wrote} = 0; bless( \%args, $class ); } sub call { my ($self, $method) = @_; my $obj = $self->load($method) or return; splice(@_, 0, 2, $obj); goto &{$obj->can($method)}; } sub load { my ($self, $method) = @_; $self->load_extensions( "$self->{prefix}/$self->{path}", $self ) unless $self->{extensions}; foreach my $obj (@{$self->{extensions}}) { return $obj if $obj->can($method); } my $admin = $self->{admin} or die <<"END_DIE"; The '$method' method does not exist in the '$self->{prefix}' path! Please remove the '$self->{prefix}' directory and run $0 again to load it. END_DIE my $obj = $admin->load($method, 1); push @{$self->{extensions}}, $obj; $obj; } sub load_extensions { my ($self, $path, $top) = @_; my $should_reload = 0; unless ( grep { ! ref $_ and lc $_ eq lc $self->{prefix} } @INC ) { unshift @INC, $self->{prefix}; $should_reload = 1; } foreach my $rv ( $self->find_extensions($path) ) { my ($file, $pkg) = @{$rv}; next if $self->{pathnames}{$pkg}; local $@; my $new = eval { local $^W; require $file; $pkg->can('new') }; unless ( $new ) { warn $@ if $@; next; } $self->{pathnames}{$pkg} = $should_reload ? delete $INC{$file} : $INC{$file}; push @{$self->{extensions}}, &{$new}($pkg, _top => $top ); } $self->{extensions} ||= []; } sub find_extensions { my ($self, $path) = @_; my @found; File::Find::find( sub { my $file = $File::Find::name; return unless $file =~ m!^\Q$path\E/(.+)\.pm\Z!is; my $subpath = $1; return if lc($subpath) eq lc($self->{dispatch}); $file = "$self->{path}/$subpath.pm"; my $pkg = "$self->{name}::$subpath"; $pkg =~ s!/!::!g; # If we have a mixed-case package name, assume case has been preserved # correctly. Otherwise, root through the file to locate the case-preserved # version of the package name. if ( $subpath eq lc($subpath) || $subpath eq uc($subpath) ) { my $content = Module::Install::_read($subpath . '.pm'); my $in_pod = 0; foreach ( split /\n/, $content ) { $in_pod = 1 if /^=\w/; $in_pod = 0 if /^=cut/; next if ($in_pod || /^=cut/); # skip pod text next if /^\s*#/; # and comments if ( m/^\s*package\s+($pkg)\s*;/i ) { $pkg = $1; last; } } } push @found, [ $file, $pkg ]; }, $path ) if -d $path; @found; } ##################################################################### # Common Utility Functions sub _caller { my $depth = 0; my $call = caller($depth); while ( $call eq __PACKAGE__ ) { $depth++; $call = caller($depth); } return $call; } # Done in evals to avoid confusing Perl::MinimumVersion eval( $] >= 5.006 ? <<'END_NEW' : <<'END_OLD' ); die $@ if $@; sub _read { local *FH; open( FH, '<', $_[0] ) or die "open($_[0]): $!"; binmode FH; my $string = do { local $/; }; close FH or die "close($_[0]): $!"; return $string; } END_NEW sub _read { local *FH; open( FH, "< $_[0]" ) or die "open($_[0]): $!"; binmode FH; my $string = do { local $/; }; close FH or die "close($_[0]): $!"; return $string; } END_OLD sub _readperl { my $string = Module::Install::_read($_[0]); $string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg; $string =~ s/(\n)\n*__(?:DATA|END)__\b.*\z/$1/s; $string =~ s/\n\n=\w+.+?\n\n=cut\b.+?\n+/\n\n/sg; return $string; } sub _readpod { my $string = Module::Install::_read($_[0]); $string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg; return $string if $_[0] =~ /\.pod\z/; $string =~ s/(^|\n=cut\b.+?\n+)[^=\s].+?\n(\n=\w+|\z)/$1$2/sg; $string =~ s/\n*=pod\b[^\n]*\n+/\n\n/sg; $string =~ s/\n*=cut\b[^\n]*\n+/\n\n/sg; $string =~ s/^\n+//s; return $string; } # Done in evals to avoid confusing Perl::MinimumVersion eval( $] >= 5.006 ? <<'END_NEW' : <<'END_OLD' ); die $@ if $@; sub _write { local *FH; open( FH, '>', $_[0] ) or die "open($_[0]): $!"; binmode FH; foreach ( 1 .. $#_ ) { print FH $_[$_] or die "print($_[0]): $!"; } close FH or die "close($_[0]): $!"; } END_NEW sub _write { local *FH; open( FH, "> $_[0]" ) or die "open($_[0]): $!"; binmode FH; foreach ( 1 .. $#_ ) { print FH $_[$_] or die "print($_[0]): $!"; } close FH or die "close($_[0]): $!"; } END_OLD # _version is for processing module versions (eg, 1.03_05) not # Perl versions (eg, 5.8.1). sub _version { my $s = shift || 0; my $d =()= $s =~ /(\.)/g; if ( $d >= 2 ) { # Normalise multipart versions $s =~ s/(\.)(\d{1,3})/sprintf("$1%03d",$2)/eg; } $s =~ s/^(\d+)\.?//; my $l = $1 || 0; my @v = map { $_ . '0' x (3 - length $_) } $s =~ /(\d{1,3})\D?/g; $l = $l . '.' . join '', @v if @v; return $l + 0; } sub _cmp { _version($_[1]) <=> _version($_[2]); } # Cloned from Params::Util::_CLASS sub _CLASS { ( defined $_[0] and ! ref $_[0] and $_[0] =~ m/^[^\W\d]\w*(?:::\w+)*\z/s ) ? $_[0] : undef; } 1; # Copyright 2008 - 2012 Adam Kennedy. Text-Trac-0.18/inc/Module/Install/AutoInstall.pm000644 000765 000024 00000004162 12510314451 021712 0ustar00gaborstaff000000 000000 #line 1 package Module::Install::AutoInstall; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub AutoInstall { $_[0] } sub run { my $self = shift; $self->auto_install_now(@_); } sub write { my $self = shift; $self->auto_install(@_); } sub auto_install { my $self = shift; return if $self->{done}++; # Flatten array of arrays into a single array my @core = map @$_, map @$_, grep ref, $self->build_requires, $self->requires; my @config = @_; # We'll need Module::AutoInstall $self->include('Module::AutoInstall'); require Module::AutoInstall; my @features_require = Module::AutoInstall->import( (@config ? (-config => \@config) : ()), (@core ? (-core => \@core) : ()), $self->features, ); my %seen; my @requires = map @$_, map @$_, grep ref, $self->requires; while (my ($mod, $ver) = splice(@requires, 0, 2)) { $seen{$mod}{$ver}++; } my @build_requires = map @$_, map @$_, grep ref, $self->build_requires; while (my ($mod, $ver) = splice(@build_requires, 0, 2)) { $seen{$mod}{$ver}++; } my @configure_requires = map @$_, map @$_, grep ref, $self->configure_requires; while (my ($mod, $ver) = splice(@configure_requires, 0, 2)) { $seen{$mod}{$ver}++; } my @deduped; while (my ($mod, $ver) = splice(@features_require, 0, 2)) { push @deduped, $mod => $ver unless $seen{$mod}{$ver}++; } $self->requires(@deduped); $self->makemaker_args( Module::AutoInstall::_make_args() ); my $class = ref($self); $self->postamble( "# --- $class section:\n" . Module::AutoInstall::postamble() ); } sub installdeps_target { my ($self, @args) = @_; $self->include('Module::AutoInstall'); require Module::AutoInstall; Module::AutoInstall::_installdeps_target(1); $self->auto_install(@args); } sub auto_install_now { my $self = shift; $self->auto_install(@_); Module::AutoInstall::do_install(); } 1; Text-Trac-0.18/inc/Module/Install/Base.pm000644 000765 000024 00000002147 12510314451 020326 0ustar00gaborstaff000000 000000 #line 1 package Module::Install::Base; use strict 'vars'; use vars qw{$VERSION}; BEGIN { $VERSION = '1.14'; } # Suspend handler for "redefined" warnings BEGIN { my $w = $SIG{__WARN__}; $SIG{__WARN__} = sub { $w }; } #line 42 sub new { my $class = shift; unless ( defined &{"${class}::call"} ) { *{"${class}::call"} = sub { shift->_top->call(@_) }; } unless ( defined &{"${class}::load"} ) { *{"${class}::load"} = sub { shift->_top->load(@_) }; } bless { @_ }, $class; } #line 61 sub AUTOLOAD { local $@; my $func = eval { shift->_top->autoload } or return; goto &$func; } #line 75 sub _top { $_[0]->{_top}; } #line 90 sub admin { $_[0]->_top->{admin} or Module::Install::Base::FakeAdmin->new; } #line 106 sub is_admin { ! $_[0]->admin->isa('Module::Install::Base::FakeAdmin'); } sub DESTROY {} package Module::Install::Base::FakeAdmin; use vars qw{$VERSION}; BEGIN { $VERSION = $Module::Install::Base::VERSION; } my $fake; sub new { $fake ||= bless(\@_, $_[0]); } sub AUTOLOAD {} sub DESTROY {} # Restore warning handler BEGIN { $SIG{__WARN__} = $SIG{__WARN__}->(); } 1; #line 159 Text-Trac-0.18/inc/Module/Install/Can.pm000644 000765 000024 00000006157 12510314451 020162 0ustar00gaborstaff000000 000000 #line 1 package Module::Install::Can; use strict; use Config (); use ExtUtils::MakeMaker (); use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } # check if we can load some module ### Upgrade this to not have to load the module if possible sub can_use { my ($self, $mod, $ver) = @_; $mod =~ s{::|\\}{/}g; $mod .= '.pm' unless $mod =~ /\.pm$/i; my $pkg = $mod; $pkg =~ s{/}{::}g; $pkg =~ s{\.pm$}{}i; local $@; eval { require $mod; $pkg->VERSION($ver || 0); 1 }; } # Check if we can run some command sub can_run { my ($self, $cmd) = @_; my $_cmd = $cmd; return $_cmd if (-x $_cmd or $_cmd = MM->maybe_command($_cmd)); for my $dir ((split /$Config::Config{path_sep}/, $ENV{PATH}), '.') { next if $dir eq ''; require File::Spec; my $abs = File::Spec->catfile($dir, $cmd); return $abs if (-x $abs or $abs = MM->maybe_command($abs)); } return; } # Can our C compiler environment build XS files sub can_xs { my $self = shift; # Ensure we have the CBuilder module $self->configure_requires( 'ExtUtils::CBuilder' => 0.27 ); # Do we have the configure_requires checker? local $@; eval "require ExtUtils::CBuilder;"; if ( $@ ) { # They don't obey configure_requires, so it is # someone old and delicate. Try to avoid hurting # them by falling back to an older simpler test. return $self->can_cc(); } # Do we have a working C compiler my $builder = ExtUtils::CBuilder->new( quiet => 1, ); unless ( $builder->have_compiler ) { # No working C compiler return 0; } # Write a C file representative of what XS becomes require File::Temp; my ( $FH, $tmpfile ) = File::Temp::tempfile( "compilexs-XXXXX", SUFFIX => '.c', ); binmode $FH; print $FH <<'END_C'; #include "EXTERN.h" #include "perl.h" #include "XSUB.h" int main(int argc, char **argv) { return 0; } int boot_sanexs() { return 1; } END_C close $FH; # Can the C compiler access the same headers XS does my @libs = (); my $object = undef; eval { local $^W = 0; $object = $builder->compile( source => $tmpfile, ); @libs = $builder->link( objects => $object, module_name => 'sanexs', ); }; my $result = $@ ? 0 : 1; # Clean up all the build files foreach ( $tmpfile, $object, @libs ) { next unless defined $_; 1 while unlink; } return $result; } # Can we locate a (the) C compiler sub can_cc { my $self = shift; my @chunks = split(/ /, $Config::Config{cc}) or return; # $Config{cc} may contain args; try to find out the program part while (@chunks) { return $self->can_run("@chunks") || (pop(@chunks), next); } return; } # Fix Cygwin bug on maybe_command(); if ( $^O eq 'cygwin' ) { require ExtUtils::MM_Cygwin; require ExtUtils::MM_Win32; if ( ! defined(&ExtUtils::MM_Cygwin::maybe_command) ) { *ExtUtils::MM_Cygwin::maybe_command = sub { my ($self, $file) = @_; if ($file =~ m{^/cygdrive/}i and ExtUtils::MM_Win32->can('maybe_command')) { ExtUtils::MM_Win32->maybe_command($file); } else { ExtUtils::MM_Unix->maybe_command($file); } } } } 1; __END__ #line 236 Text-Trac-0.18/inc/Module/Install/Fetch.pm000644 000765 000024 00000004627 12510314451 020512 0ustar00gaborstaff000000 000000 #line 1 package Module::Install::Fetch; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub get_file { my ($self, %args) = @_; my ($scheme, $host, $path, $file) = $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return; if ( $scheme eq 'http' and ! eval { require LWP::Simple; 1 } ) { $args{url} = $args{ftp_url} or (warn("LWP support unavailable!\n"), return); ($scheme, $host, $path, $file) = $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return; } $|++; print "Fetching '$file' from $host... "; unless (eval { require Socket; Socket::inet_aton($host) }) { warn "'$host' resolve failed!\n"; return; } return unless $scheme eq 'ftp' or $scheme eq 'http'; require Cwd; my $dir = Cwd::getcwd(); chdir $args{local_dir} or return if exists $args{local_dir}; if (eval { require LWP::Simple; 1 }) { LWP::Simple::mirror($args{url}, $file); } elsif (eval { require Net::FTP; 1 }) { eval { # use Net::FTP to get past firewall my $ftp = Net::FTP->new($host, Passive => 1, Timeout => 600); $ftp->login("anonymous", 'anonymous@example.com'); $ftp->cwd($path); $ftp->binary; $ftp->get($file) or (warn("$!\n"), return); $ftp->quit; } } elsif (my $ftp = $self->can_run('ftp')) { eval { # no Net::FTP, fallback to ftp.exe require FileHandle; my $fh = FileHandle->new; local $SIG{CHLD} = 'IGNORE'; unless ($fh->open("|$ftp -n")) { warn "Couldn't open ftp: $!\n"; chdir $dir; return; } my @dialog = split(/\n/, <<"END_FTP"); open $host user anonymous anonymous\@example.com cd $path binary get $file $file quit END_FTP foreach (@dialog) { $fh->print("$_\n") } $fh->close; } } else { warn "No working 'ftp' program available!\n"; chdir $dir; return; } unless (-f $file) { warn "Fetching failed: $@\n"; chdir $dir; return; } return if exists $args{size} and -s $file != $args{size}; system($args{run}) if exists $args{run}; unlink($file) if $args{remove}; print(((!exists $args{check_for} or -e $args{check_for}) ? "done!" : "failed! ($!)"), "\n"); chdir $dir; return !$?; } 1; Text-Trac-0.18/inc/Module/Install/Include.pm000644 000765 000024 00000001015 12510314451 021030 0ustar00gaborstaff000000 000000 #line 1 package Module::Install::Include; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub include { shift()->admin->include(@_); } sub include_deps { shift()->admin->include_deps(@_); } sub auto_include { shift()->admin->auto_include(@_); } sub auto_include_deps { shift()->admin->auto_include_deps(@_); } sub auto_include_dependent_dists { shift()->admin->auto_include_dependent_dists(@_); } 1; Text-Trac-0.18/inc/Module/Install/Makefile.pm000644 000765 000024 00000027437 12510314451 021202 0ustar00gaborstaff000000 000000 #line 1 package Module::Install::Makefile; use strict 'vars'; use ExtUtils::MakeMaker (); use Module::Install::Base (); use Fcntl qw/:flock :seek/; use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub Makefile { $_[0] } my %seen = (); sub prompt { shift; # Infinite loop protection my @c = caller(); if ( ++$seen{"$c[1]|$c[2]|$_[0]"} > 3 ) { die "Caught an potential prompt infinite loop ($c[1]|$c[2]|$_[0])"; } # In automated testing or non-interactive session, always use defaults if ( ($ENV{AUTOMATED_TESTING} or -! -t STDIN) and ! $ENV{PERL_MM_USE_DEFAULT} ) { local $ENV{PERL_MM_USE_DEFAULT} = 1; goto &ExtUtils::MakeMaker::prompt; } else { goto &ExtUtils::MakeMaker::prompt; } } # Store a cleaned up version of the MakeMaker version, # since we need to behave differently in a variety of # ways based on the MM version. my $makemaker = eval $ExtUtils::MakeMaker::VERSION; # If we are passed a param, do a "newer than" comparison. # Otherwise, just return the MakeMaker version. sub makemaker { ( @_ < 2 or $makemaker >= eval($_[1]) ) ? $makemaker : 0 } # Ripped from ExtUtils::MakeMaker 6.56, and slightly modified # as we only need to know here whether the attribute is an array # or a hash or something else (which may or may not be appendable). my %makemaker_argtype = ( C => 'ARRAY', CONFIG => 'ARRAY', # CONFIGURE => 'CODE', # ignore DIR => 'ARRAY', DL_FUNCS => 'HASH', DL_VARS => 'ARRAY', EXCLUDE_EXT => 'ARRAY', EXE_FILES => 'ARRAY', FUNCLIST => 'ARRAY', H => 'ARRAY', IMPORTS => 'HASH', INCLUDE_EXT => 'ARRAY', LIBS => 'ARRAY', # ignore '' MAN1PODS => 'HASH', MAN3PODS => 'HASH', META_ADD => 'HASH', META_MERGE => 'HASH', PL_FILES => 'HASH', PM => 'HASH', PMLIBDIRS => 'ARRAY', PMLIBPARENTDIRS => 'ARRAY', PREREQ_PM => 'HASH', CONFIGURE_REQUIRES => 'HASH', SKIP => 'ARRAY', TYPEMAPS => 'ARRAY', XS => 'HASH', # VERSION => ['version',''], # ignore # _KEEP_AFTER_FLUSH => '', clean => 'HASH', depend => 'HASH', dist => 'HASH', dynamic_lib=> 'HASH', linkext => 'HASH', macro => 'HASH', postamble => 'HASH', realclean => 'HASH', test => 'HASH', tool_autosplit => 'HASH', # special cases where you can use makemaker_append CCFLAGS => 'APPENDABLE', DEFINE => 'APPENDABLE', INC => 'APPENDABLE', LDDLFLAGS => 'APPENDABLE', LDFROM => 'APPENDABLE', ); sub makemaker_args { my ($self, %new_args) = @_; my $args = ( $self->{makemaker_args} ||= {} ); foreach my $key (keys %new_args) { if ($makemaker_argtype{$key}) { if ($makemaker_argtype{$key} eq 'ARRAY') { $args->{$key} = [] unless defined $args->{$key}; unless (ref $args->{$key} eq 'ARRAY') { $args->{$key} = [$args->{$key}] } push @{$args->{$key}}, ref $new_args{$key} eq 'ARRAY' ? @{$new_args{$key}} : $new_args{$key}; } elsif ($makemaker_argtype{$key} eq 'HASH') { $args->{$key} = {} unless defined $args->{$key}; foreach my $skey (keys %{ $new_args{$key} }) { $args->{$key}{$skey} = $new_args{$key}{$skey}; } } elsif ($makemaker_argtype{$key} eq 'APPENDABLE') { $self->makemaker_append($key => $new_args{$key}); } } else { if (defined $args->{$key}) { warn qq{MakeMaker attribute "$key" is overriden; use "makemaker_append" to append values\n}; } $args->{$key} = $new_args{$key}; } } return $args; } # For mm args that take multiple space-separated args, # append an argument to the current list. sub makemaker_append { my $self = shift; my $name = shift; my $args = $self->makemaker_args; $args->{$name} = defined $args->{$name} ? join( ' ', $args->{$name}, @_ ) : join( ' ', @_ ); } sub build_subdirs { my $self = shift; my $subdirs = $self->makemaker_args->{DIR} ||= []; for my $subdir (@_) { push @$subdirs, $subdir; } } sub clean_files { my $self = shift; my $clean = $self->makemaker_args->{clean} ||= {}; %$clean = ( %$clean, FILES => join ' ', grep { length $_ } ($clean->{FILES} || (), @_), ); } sub realclean_files { my $self = shift; my $realclean = $self->makemaker_args->{realclean} ||= {}; %$realclean = ( %$realclean, FILES => join ' ', grep { length $_ } ($realclean->{FILES} || (), @_), ); } sub libs { my $self = shift; my $libs = ref $_[0] ? shift : [ shift ]; $self->makemaker_args( LIBS => $libs ); } sub inc { my $self = shift; $self->makemaker_args( INC => shift ); } sub _wanted_t { } sub tests_recursive { my $self = shift; my $dir = shift || 't'; unless ( -d $dir ) { die "tests_recursive dir '$dir' does not exist"; } my %tests = map { $_ => 1 } split / /, ($self->tests || ''); require File::Find; File::Find::find( sub { /\.t$/ and -f $_ and $tests{"$File::Find::dir/*.t"} = 1 }, $dir ); $self->tests( join ' ', sort keys %tests ); } sub write { my $self = shift; die "&Makefile->write() takes no arguments\n" if @_; # Check the current Perl version my $perl_version = $self->perl_version; if ( $perl_version ) { eval "use $perl_version; 1" or die "ERROR: perl: Version $] is installed, " . "but we need version >= $perl_version"; } # Make sure we have a new enough MakeMaker require ExtUtils::MakeMaker; if ( $perl_version and $self->_cmp($perl_version, '5.006') >= 0 ) { # This previous attempted to inherit the version of # ExtUtils::MakeMaker in use by the module author, but this # was found to be untenable as some authors build releases # using future dev versions of EU:MM that nobody else has. # Instead, #toolchain suggests we use 6.59 which is the most # stable version on CPAN at time of writing and is, to quote # ribasushi, "not terminally fucked, > and tested enough". # TODO: We will now need to maintain this over time to push # the version up as new versions are released. $self->build_requires( 'ExtUtils::MakeMaker' => 6.59 ); $self->configure_requires( 'ExtUtils::MakeMaker' => 6.59 ); } else { # Allow legacy-compatibility with 5.005 by depending on the # most recent EU:MM that supported 5.005. $self->build_requires( 'ExtUtils::MakeMaker' => 6.36 ); $self->configure_requires( 'ExtUtils::MakeMaker' => 6.36 ); } # Generate the MakeMaker params my $args = $self->makemaker_args; $args->{DISTNAME} = $self->name; $args->{NAME} = $self->module_name || $self->name; $args->{NAME} =~ s/-/::/g; $args->{VERSION} = $self->version or die <<'EOT'; ERROR: Can't determine distribution version. Please specify it explicitly via 'version' in Makefile.PL, or set a valid $VERSION in a module, and provide its file path via 'version_from' (or 'all_from' if you prefer) in Makefile.PL. EOT if ( $self->tests ) { my @tests = split ' ', $self->tests; my %seen; $args->{test} = { TESTS => (join ' ', grep {!$seen{$_}++} @tests), }; } elsif ( $Module::Install::ExtraTests::use_extratests ) { # Module::Install::ExtraTests doesn't set $self->tests and does its own tests via harness. # So, just ignore our xt tests here. } elsif ( -d 'xt' and ($Module::Install::AUTHOR or $ENV{RELEASE_TESTING}) ) { $args->{test} = { TESTS => join( ' ', map { "$_/*.t" } grep { -d $_ } qw{ t xt } ), }; } if ( $] >= 5.005 ) { $args->{ABSTRACT} = $self->abstract; $args->{AUTHOR} = join ', ', @{$self->author || []}; } if ( $self->makemaker(6.10) ) { $args->{NO_META} = 1; #$args->{NO_MYMETA} = 1; } if ( $self->makemaker(6.17) and $self->sign ) { $args->{SIGN} = 1; } unless ( $self->is_admin ) { delete $args->{SIGN}; } if ( $self->makemaker(6.31) and $self->license ) { $args->{LICENSE} = $self->license; } my $prereq = ($args->{PREREQ_PM} ||= {}); %$prereq = ( %$prereq, map { @$_ } # flatten [module => version] map { @$_ } grep $_, ($self->requires) ); # Remove any reference to perl, PREREQ_PM doesn't support it delete $args->{PREREQ_PM}->{perl}; # Merge both kinds of requires into BUILD_REQUIRES my $build_prereq = ($args->{BUILD_REQUIRES} ||= {}); %$build_prereq = ( %$build_prereq, map { @$_ } # flatten [module => version] map { @$_ } grep $_, ($self->configure_requires, $self->build_requires) ); # Remove any reference to perl, BUILD_REQUIRES doesn't support it delete $args->{BUILD_REQUIRES}->{perl}; # Delete bundled dists from prereq_pm, add it to Makefile DIR my $subdirs = ($args->{DIR} || []); if ($self->bundles) { my %processed; foreach my $bundle (@{ $self->bundles }) { my ($mod_name, $dist_dir) = @$bundle; delete $prereq->{$mod_name}; $dist_dir = File::Basename::basename($dist_dir); # dir for building this module if (not exists $processed{$dist_dir}) { if (-d $dist_dir) { # List as sub-directory to be processed by make push @$subdirs, $dist_dir; } # Else do nothing: the module is already present on the system $processed{$dist_dir} = undef; } } } unless ( $self->makemaker('6.55_03') ) { %$prereq = (%$prereq,%$build_prereq); delete $args->{BUILD_REQUIRES}; } if ( my $perl_version = $self->perl_version ) { eval "use $perl_version; 1" or die "ERROR: perl: Version $] is installed, " . "but we need version >= $perl_version"; if ( $self->makemaker(6.48) ) { $args->{MIN_PERL_VERSION} = $perl_version; } } if ($self->installdirs) { warn qq{old INSTALLDIRS (probably set by makemaker_args) is overriden by installdirs\n} if $args->{INSTALLDIRS}; $args->{INSTALLDIRS} = $self->installdirs; } my %args = map { ( $_ => $args->{$_} ) } grep {defined($args->{$_} ) } keys %$args; my $user_preop = delete $args{dist}->{PREOP}; if ( my $preop = $self->admin->preop($user_preop) ) { foreach my $key ( keys %$preop ) { $args{dist}->{$key} = $preop->{$key}; } } my $mm = ExtUtils::MakeMaker::WriteMakefile(%args); $self->fix_up_makefile($mm->{FIRST_MAKEFILE} || 'Makefile'); } sub fix_up_makefile { my $self = shift; my $makefile_name = shift; my $top_class = ref($self->_top) || ''; my $top_version = $self->_top->VERSION || ''; my $preamble = $self->preamble ? "# Preamble by $top_class $top_version\n" . $self->preamble : ''; my $postamble = "# Postamble by $top_class $top_version\n" . ($self->postamble || ''); local *MAKEFILE; open MAKEFILE, "+< $makefile_name" or die "fix_up_makefile: Couldn't open $makefile_name: $!"; eval { flock MAKEFILE, LOCK_EX }; my $makefile = do { local $/; }; $makefile =~ s/\b(test_harness\(\$\(TEST_VERBOSE\), )/$1'inc', /; $makefile =~ s/( -I\$\(INST_ARCHLIB\))/ -Iinc$1/g; $makefile =~ s/( "-I\$\(INST_LIB\)")/ "-Iinc"$1/g; $makefile =~ s/^(FULLPERL = .*)/$1 "-Iinc"/m; $makefile =~ s/^(PERL = .*)/$1 "-Iinc"/m; # Module::Install will never be used to build the Core Perl # Sometimes PERL_LIB and PERL_ARCHLIB get written anyway, which breaks # PREFIX/PERL5LIB, and thus, install_share. Blank them if they exist $makefile =~ s/^PERL_LIB = .+/PERL_LIB =/m; #$makefile =~ s/^PERL_ARCHLIB = .+/PERL_ARCHLIB =/m; # Perl 5.005 mentions PERL_LIB explicitly, so we have to remove that as well. $makefile =~ s/(\"?)-I\$\(PERL_LIB\)\1//g; # XXX - This is currently unused; not sure if it breaks other MM-users # $makefile =~ s/^pm_to_blib\s+:\s+/pm_to_blib :: /mg; seek MAKEFILE, 0, SEEK_SET; truncate MAKEFILE, 0; print MAKEFILE "$preamble$makefile$postamble" or die $!; close MAKEFILE or die $!; 1; } sub preamble { my ($self, $text) = @_; $self->{preamble} = $text . $self->{preamble} if defined $text; $self->{preamble}; } sub postamble { my ($self, $text) = @_; $self->{postamble} ||= $self->admin->postamble; $self->{postamble} .= $text if defined $text; $self->{postamble} } 1; __END__ #line 544 Text-Trac-0.18/inc/Module/Install/Metadata.pm000644 000765 000024 00000043302 12510314451 021172 0ustar00gaborstaff000000 000000 #line 1 package Module::Install::Metadata; use strict 'vars'; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } my @boolean_keys = qw{ sign }; my @scalar_keys = qw{ name module_name abstract version distribution_type tests installdirs }; my @tuple_keys = qw{ configure_requires build_requires requires recommends bundles resources }; my @resource_keys = qw{ homepage bugtracker repository }; my @array_keys = qw{ keywords author }; *authors = \&author; sub Meta { shift } sub Meta_BooleanKeys { @boolean_keys } sub Meta_ScalarKeys { @scalar_keys } sub Meta_TupleKeys { @tuple_keys } sub Meta_ResourceKeys { @resource_keys } sub Meta_ArrayKeys { @array_keys } foreach my $key ( @boolean_keys ) { *$key = sub { my $self = shift; if ( defined wantarray and not @_ ) { return $self->{values}->{$key}; } $self->{values}->{$key} = ( @_ ? $_[0] : 1 ); return $self; }; } foreach my $key ( @scalar_keys ) { *$key = sub { my $self = shift; return $self->{values}->{$key} if defined wantarray and !@_; $self->{values}->{$key} = shift; return $self; }; } foreach my $key ( @array_keys ) { *$key = sub { my $self = shift; return $self->{values}->{$key} if defined wantarray and !@_; $self->{values}->{$key} ||= []; push @{$self->{values}->{$key}}, @_; return $self; }; } foreach my $key ( @resource_keys ) { *$key = sub { my $self = shift; unless ( @_ ) { return () unless $self->{values}->{resources}; return map { $_->[1] } grep { $_->[0] eq $key } @{ $self->{values}->{resources} }; } return $self->{values}->{resources}->{$key} unless @_; my $uri = shift or die( "Did not provide a value to $key()" ); $self->resources( $key => $uri ); return 1; }; } foreach my $key ( grep { $_ ne "resources" } @tuple_keys) { *$key = sub { my $self = shift; return $self->{values}->{$key} unless @_; my @added; while ( @_ ) { my $module = shift or last; my $version = shift || 0; push @added, [ $module, $version ]; } push @{ $self->{values}->{$key} }, @added; return map {@$_} @added; }; } # Resource handling my %lc_resource = map { $_ => 1 } qw{ homepage license bugtracker repository }; sub resources { my $self = shift; while ( @_ ) { my $name = shift or last; my $value = shift or next; if ( $name eq lc $name and ! $lc_resource{$name} ) { die("Unsupported reserved lowercase resource '$name'"); } $self->{values}->{resources} ||= []; push @{ $self->{values}->{resources} }, [ $name, $value ]; } $self->{values}->{resources}; } # Aliases for build_requires that will have alternative # meanings in some future version of META.yml. sub test_requires { shift->build_requires(@_) } sub install_requires { shift->build_requires(@_) } # Aliases for installdirs options sub install_as_core { $_[0]->installdirs('perl') } sub install_as_cpan { $_[0]->installdirs('site') } sub install_as_site { $_[0]->installdirs('site') } sub install_as_vendor { $_[0]->installdirs('vendor') } sub dynamic_config { my $self = shift; my $value = @_ ? shift : 1; if ( $self->{values}->{dynamic_config} ) { # Once dynamic we never change to static, for safety return 0; } $self->{values}->{dynamic_config} = $value ? 1 : 0; return 1; } # Convenience command sub static_config { shift->dynamic_config(0); } sub perl_version { my $self = shift; return $self->{values}->{perl_version} unless @_; my $version = shift or die( "Did not provide a value to perl_version()" ); # Normalize the version $version = $self->_perl_version($version); # We don't support the really old versions unless ( $version >= 5.005 ) { die "Module::Install only supports 5.005 or newer (use ExtUtils::MakeMaker)\n"; } $self->{values}->{perl_version} = $version; } sub all_from { my ( $self, $file ) = @_; unless ( defined($file) ) { my $name = $self->name or die( "all_from called with no args without setting name() first" ); $file = join('/', 'lib', split(/-/, $name)) . '.pm'; $file =~ s{.*/}{} unless -e $file; unless ( -e $file ) { die("all_from cannot find $file from $name"); } } unless ( -f $file ) { die("The path '$file' does not exist, or is not a file"); } $self->{values}{all_from} = $file; # Some methods pull from POD instead of code. # If there is a matching .pod, use that instead my $pod = $file; $pod =~ s/\.pm$/.pod/i; $pod = $file unless -e $pod; # Pull the different values $self->name_from($file) unless $self->name; $self->version_from($file) unless $self->version; $self->perl_version_from($file) unless $self->perl_version; $self->author_from($pod) unless @{$self->author || []}; $self->license_from($pod) unless $self->license; $self->abstract_from($pod) unless $self->abstract; return 1; } sub provides { my $self = shift; my $provides = ( $self->{values}->{provides} ||= {} ); %$provides = (%$provides, @_) if @_; return $provides; } sub auto_provides { my $self = shift; return $self unless $self->is_admin; unless (-e 'MANIFEST') { warn "Cannot deduce auto_provides without a MANIFEST, skipping\n"; return $self; } # Avoid spurious warnings as we are not checking manifest here. local $SIG{__WARN__} = sub {1}; require ExtUtils::Manifest; local *ExtUtils::Manifest::manicheck = sub { return }; require Module::Build; my $build = Module::Build->new( dist_name => $self->name, dist_version => $self->version, license => $self->license, ); $self->provides( %{ $build->find_dist_packages || {} } ); } sub feature { my $self = shift; my $name = shift; my $features = ( $self->{values}->{features} ||= [] ); my $mods; if ( @_ == 1 and ref( $_[0] ) ) { # The user used ->feature like ->features by passing in the second # argument as a reference. Accomodate for that. $mods = $_[0]; } else { $mods = \@_; } my $count = 0; push @$features, ( $name => [ map { ref($_) ? ( ref($_) eq 'HASH' ) ? %$_ : @$_ : $_ } @$mods ] ); return @$features; } sub features { my $self = shift; while ( my ( $name, $mods ) = splice( @_, 0, 2 ) ) { $self->feature( $name, @$mods ); } return $self->{values}->{features} ? @{ $self->{values}->{features} } : (); } sub no_index { my $self = shift; my $type = shift; push @{ $self->{values}->{no_index}->{$type} }, @_ if $type; return $self->{values}->{no_index}; } sub read { my $self = shift; $self->include_deps( 'YAML::Tiny', 0 ); require YAML::Tiny; my $data = YAML::Tiny::LoadFile('META.yml'); # Call methods explicitly in case user has already set some values. while ( my ( $key, $value ) = each %$data ) { next unless $self->can($key); if ( ref $value eq 'HASH' ) { while ( my ( $module, $version ) = each %$value ) { $self->can($key)->($self, $module => $version ); } } else { $self->can($key)->($self, $value); } } return $self; } sub write { my $self = shift; return $self unless $self->is_admin; $self->admin->write_meta; return $self; } sub version_from { require ExtUtils::MM_Unix; my ( $self, $file ) = @_; $self->version( ExtUtils::MM_Unix->parse_version($file) ); # for version integrity check $self->makemaker_args( VERSION_FROM => $file ); } sub abstract_from { require ExtUtils::MM_Unix; my ( $self, $file ) = @_; $self->abstract( bless( { DISTNAME => $self->name }, 'ExtUtils::MM_Unix' )->parse_abstract($file) ); } # Add both distribution and module name sub name_from { my ($self, $file) = @_; if ( Module::Install::_read($file) =~ m/ ^ \s* package \s* ([\w:]+) [\s|;]* /ixms ) { my ($name, $module_name) = ($1, $1); $name =~ s{::}{-}g; $self->name($name); unless ( $self->module_name ) { $self->module_name($module_name); } } else { die("Cannot determine name from $file\n"); } } sub _extract_perl_version { if ( $_[0] =~ m/ ^\s* (?:use|require) \s* v? ([\d_\.]+) \s* ; /ixms ) { my $perl_version = $1; $perl_version =~ s{_}{}g; return $perl_version; } else { return; } } sub perl_version_from { my $self = shift; my $perl_version=_extract_perl_version(Module::Install::_read($_[0])); if ($perl_version) { $self->perl_version($perl_version); } else { warn "Cannot determine perl version info from $_[0]\n"; return; } } sub author_from { my $self = shift; my $content = Module::Install::_read($_[0]); if ($content =~ m/ =head \d \s+ (?:authors?)\b \s* ([^\n]*) | =head \d \s+ (?:licen[cs]e|licensing|copyright|legal)\b \s* .*? copyright .*? \d\d\d[\d.]+ \s* (?:\bby\b)? \s* ([^\n]*) /ixms) { my $author = $1 || $2; # XXX: ugly but should work anyway... if (eval "require Pod::Escapes; 1") { # Pod::Escapes has a mapping table. # It's in core of perl >= 5.9.3, and should be installed # as one of the Pod::Simple's prereqs, which is a prereq # of Pod::Text 3.x (see also below). $author =~ s{ E<( (\d+) | ([A-Za-z]+) )> } { defined $2 ? chr($2) : defined $Pod::Escapes::Name2character_number{$1} ? chr($Pod::Escapes::Name2character_number{$1}) : do { warn "Unknown escape: E<$1>"; "E<$1>"; }; }gex; } elsif (eval "require Pod::Text; 1" && $Pod::Text::VERSION < 3) { # Pod::Text < 3.0 has yet another mapping table, # though the table name of 2.x and 1.x are different. # (1.x is in core of Perl < 5.6, 2.x is in core of # Perl < 5.9.3) my $mapping = ($Pod::Text::VERSION < 2) ? \%Pod::Text::HTML_Escapes : \%Pod::Text::ESCAPES; $author =~ s{ E<( (\d+) | ([A-Za-z]+) )> } { defined $2 ? chr($2) : defined $mapping->{$1} ? $mapping->{$1} : do { warn "Unknown escape: E<$1>"; "E<$1>"; }; }gex; } else { $author =~ s{E}{<}g; $author =~ s{E}{>}g; } $self->author($author); } else { warn "Cannot determine author info from $_[0]\n"; } } #Stolen from M::B my %license_urls = ( perl => 'http://dev.perl.org/licenses/', apache => 'http://apache.org/licenses/LICENSE-2.0', apache_1_1 => 'http://apache.org/licenses/LICENSE-1.1', artistic => 'http://opensource.org/licenses/artistic-license.php', artistic_2 => 'http://opensource.org/licenses/artistic-license-2.0.php', lgpl => 'http://opensource.org/licenses/lgpl-license.php', lgpl2 => 'http://opensource.org/licenses/lgpl-2.1.php', lgpl3 => 'http://opensource.org/licenses/lgpl-3.0.html', bsd => 'http://opensource.org/licenses/bsd-license.php', gpl => 'http://opensource.org/licenses/gpl-license.php', gpl2 => 'http://opensource.org/licenses/gpl-2.0.php', gpl3 => 'http://opensource.org/licenses/gpl-3.0.html', mit => 'http://opensource.org/licenses/mit-license.php', mozilla => 'http://opensource.org/licenses/mozilla1.1.php', open_source => undef, unrestricted => undef, restrictive => undef, unknown => undef, ); sub license { my $self = shift; return $self->{values}->{license} unless @_; my $license = shift or die( 'Did not provide a value to license()' ); $license = __extract_license($license) || lc $license; $self->{values}->{license} = $license; # Automatically fill in license URLs if ( $license_urls{$license} ) { $self->resources( license => $license_urls{$license} ); } return 1; } sub _extract_license { my $pod = shift; my $matched; return __extract_license( ($matched) = $pod =~ m/ (=head \d \s+ L(?i:ICEN[CS]E|ICENSING)\b.*?) (=head \d.*|=cut.*|)\z /xms ) || __extract_license( ($matched) = $pod =~ m/ (=head \d \s+ (?:C(?i:OPYRIGHTS?)|L(?i:EGAL))\b.*?) (=head \d.*|=cut.*|)\z /xms ); } sub __extract_license { my $license_text = shift or return; my @phrases = ( '(?:under )?the same (?:terms|license) as (?:perl|the perl (?:\d )?programming language)' => 'perl', 1, '(?:under )?the terms of (?:perl|the perl programming language) itself' => 'perl', 1, 'Artistic and GPL' => 'perl', 1, 'GNU general public license' => 'gpl', 1, 'GNU public license' => 'gpl', 1, 'GNU lesser general public license' => 'lgpl', 1, 'GNU lesser public license' => 'lgpl', 1, 'GNU library general public license' => 'lgpl', 1, 'GNU library public license' => 'lgpl', 1, 'GNU Free Documentation license' => 'unrestricted', 1, 'GNU Affero General Public License' => 'open_source', 1, '(?:Free)?BSD license' => 'bsd', 1, 'Artistic license 2\.0' => 'artistic_2', 1, 'Artistic license' => 'artistic', 1, 'Apache (?:Software )?license' => 'apache', 1, 'GPL' => 'gpl', 1, 'LGPL' => 'lgpl', 1, 'BSD' => 'bsd', 1, 'Artistic' => 'artistic', 1, 'MIT' => 'mit', 1, 'Mozilla Public License' => 'mozilla', 1, 'Q Public License' => 'open_source', 1, 'OpenSSL License' => 'unrestricted', 1, 'SSLeay License' => 'unrestricted', 1, 'zlib License' => 'open_source', 1, 'proprietary' => 'proprietary', 0, ); while ( my ($pattern, $license, $osi) = splice(@phrases, 0, 3) ) { $pattern =~ s#\s+#\\s+#gs; if ( $license_text =~ /\b$pattern\b/i ) { return $license; } } return ''; } sub license_from { my $self = shift; if (my $license=_extract_license(Module::Install::_read($_[0]))) { $self->license($license); } else { warn "Cannot determine license info from $_[0]\n"; return 'unknown'; } } sub _extract_bugtracker { my @links = $_[0] =~ m#L<( https?\Q://rt.cpan.org/\E[^>]+| https?\Q://github.com/\E[\w_]+/[\w_]+/issues| https?\Q://code.google.com/p/\E[\w_\-]+/issues/list )>#gx; my %links; @links{@links}=(); @links=keys %links; return @links; } sub bugtracker_from { my $self = shift; my $content = Module::Install::_read($_[0]); my @links = _extract_bugtracker($content); unless ( @links ) { warn "Cannot determine bugtracker info from $_[0]\n"; return 0; } if ( @links > 1 ) { warn "Found more than one bugtracker link in $_[0]\n"; return 0; } # Set the bugtracker bugtracker( $links[0] ); return 1; } sub requires_from { my $self = shift; my $content = Module::Install::_readperl($_[0]); my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+(v?[\d\.]+)/mg; while ( @requires ) { my $module = shift @requires; my $version = shift @requires; $self->requires( $module => $version ); } } sub test_requires_from { my $self = shift; my $content = Module::Install::_readperl($_[0]); my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+([\d\.]+)/mg; while ( @requires ) { my $module = shift @requires; my $version = shift @requires; $self->test_requires( $module => $version ); } } # Convert triple-part versions (eg, 5.6.1 or 5.8.9) to # numbers (eg, 5.006001 or 5.008009). # Also, convert double-part versions (eg, 5.8) sub _perl_version { my $v = $_[-1]; $v =~ s/^([1-9])\.([1-9]\d?\d?)$/sprintf("%d.%03d",$1,$2)/e; $v =~ s/^([1-9])\.([1-9]\d?\d?)\.(0|[1-9]\d?\d?)$/sprintf("%d.%03d%03d",$1,$2,$3 || 0)/e; $v =~ s/(\.\d\d\d)000$/$1/; $v =~ s/_.+$//; if ( ref($v) ) { # Numify $v = $v + 0; } return $v; } sub add_metadata { my $self = shift; my %hash = @_; for my $key (keys %hash) { warn "add_metadata: $key is not prefixed with 'x_'.\n" . "Use appopriate function to add non-private metadata.\n" unless $key =~ /^x_/; $self->{values}->{$key} = $hash{$key}; } } ###################################################################### # MYMETA Support sub WriteMyMeta { die "WriteMyMeta has been deprecated"; } sub write_mymeta_yaml { my $self = shift; # We need YAML::Tiny to write the MYMETA.yml file unless ( eval { require YAML::Tiny; 1; } ) { return 1; } # Generate the data my $meta = $self->_write_mymeta_data or return 1; # Save as the MYMETA.yml file print "Writing MYMETA.yml\n"; YAML::Tiny::DumpFile('MYMETA.yml', $meta); } sub write_mymeta_json { my $self = shift; # We need JSON to write the MYMETA.json file unless ( eval { require JSON; 1; } ) { return 1; } # Generate the data my $meta = $self->_write_mymeta_data or return 1; # Save as the MYMETA.yml file print "Writing MYMETA.json\n"; Module::Install::_write( 'MYMETA.json', JSON->new->pretty(1)->canonical->encode($meta), ); } sub _write_mymeta_data { my $self = shift; # If there's no existing META.yml there is nothing we can do return undef unless -f 'META.yml'; # We need Parse::CPAN::Meta to load the file unless ( eval { require Parse::CPAN::Meta; 1; } ) { return undef; } # Merge the perl version into the dependencies my $val = $self->Meta->{values}; my $perl = delete $val->{perl_version}; if ( $perl ) { $val->{requires} ||= []; my $requires = $val->{requires}; # Canonize to three-dot version after Perl 5.6 if ( $perl >= 5.006 ) { $perl =~ s{^(\d+)\.(\d\d\d)(\d*)}{join('.', $1, int($2||0), int($3||0))}e } unshift @$requires, [ perl => $perl ]; } # Load the advisory META.yml file my @yaml = Parse::CPAN::Meta::LoadFile('META.yml'); my $meta = $yaml[0]; # Overwrite the non-configure dependency hashes delete $meta->{requires}; delete $meta->{build_requires}; delete $meta->{recommends}; if ( exists $val->{requires} ) { $meta->{requires} = { map { @$_ } @{ $val->{requires} } }; } if ( exists $val->{build_requires} ) { $meta->{build_requires} = { map { @$_ } @{ $val->{build_requires} } }; } return $meta; } 1; Text-Trac-0.18/inc/Module/Install/Scripts.pm000644 000765 000024 00000001011 12510314451 021070 0ustar00gaborstaff000000 000000 #line 1 package Module::Install::Scripts; use strict 'vars'; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub install_script { my $self = shift; my $args = $self->makemaker_args; my $exe = $args->{EXE_FILES} ||= []; foreach ( @_ ) { if ( -f $_ ) { push @$exe, $_; } elsif ( -d 'script' and -f "script/$_" ) { push @$exe, "script/$_"; } else { die("Cannot find script '$_'"); } } } 1; Text-Trac-0.18/inc/Module/Install/Win32.pm000644 000765 000024 00000003403 12510314451 020352 0ustar00gaborstaff000000 000000 #line 1 package Module::Install::Win32; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } # determine if the user needs nmake, and download it if needed sub check_nmake { my $self = shift; $self->load('can_run'); $self->load('get_file'); require Config; return unless ( $^O eq 'MSWin32' and $Config::Config{make} and $Config::Config{make} =~ /^nmake\b/i and ! $self->can_run('nmake') ); print "The required 'nmake' executable not found, fetching it...\n"; require File::Basename; my $rv = $self->get_file( url => 'http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe', ftp_url => 'ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe', local_dir => File::Basename::dirname($^X), size => 51928, run => 'Nmake15.exe /o > nul', check_for => 'Nmake.exe', remove => 1, ); die <<'END_MESSAGE' unless $rv; ------------------------------------------------------------------------------- Since you are using Microsoft Windows, you will need the 'nmake' utility before installation. It's available at: http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe or ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe Please download the file manually, save it to a directory in %PATH% (e.g. C:\WINDOWS\COMMAND\), then launch the MS-DOS command line shell, "cd" to that directory, and run "Nmake15.exe" from there; that will create the 'nmake.exe' file needed by this module. You may then resume the installation process described in README. ------------------------------------------------------------------------------- END_MESSAGE } 1; Text-Trac-0.18/inc/Module/Install/WriteAll.pm000644 000765 000024 00000002376 12510314451 021203 0ustar00gaborstaff000000 000000 #line 1 package Module::Install::WriteAll; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = qw{Module::Install::Base}; $ISCORE = 1; } sub WriteAll { my $self = shift; my %args = ( meta => 1, sign => 0, inline => 0, check_nmake => 1, @_, ); $self->sign(1) if $args{sign}; $self->admin->WriteAll(%args) if $self->is_admin; $self->check_nmake if $args{check_nmake}; unless ( $self->makemaker_args->{PL_FILES} ) { # XXX: This still may be a bit over-defensive... unless ($self->makemaker(6.25)) { $self->makemaker_args( PL_FILES => {} ) if -f 'Build.PL'; } } # Until ExtUtils::MakeMaker support MYMETA.yml, make sure # we clean it up properly ourself. $self->realclean_files('MYMETA.yml'); if ( $args{inline} ) { $self->Inline->write; } else { $self->Makefile->write; } # The Makefile write process adds a couple of dependencies, # so write the META.yml files after the Makefile. if ( $args{meta} ) { $self->Meta->write; } # Experimental support for MYMETA if ( $ENV{X_MYMETA} ) { if ( $ENV{X_MYMETA} eq 'JSON' ) { $self->Meta->write_mymeta_json; } else { $self->Meta->write_mymeta_yaml; } } return 1; } 1;