Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/kentnl/ppix-documentname
Utility to extract a name from a PPI Document
https://github.com/kentnl/ppix-documentname
perl
Last synced: 4 days ago
JSON representation
Utility to extract a name from a PPI Document
- Host: GitHub
- URL: https://github.com/kentnl/ppix-documentname
- Owner: kentnl
- License: other
- Created: 2015-02-07T11:04:11.000Z (almost 10 years ago)
- Default Branch: master
- Last Pushed: 2017-03-06T05:06:15.000Z (over 7 years ago)
- Last Synced: 2023-04-16T05:55:57.025Z (over 1 year ago)
- Topics: perl
- Language: Perl
- Size: 104 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.mkdn
- Changelog: Changes
- License: LICENSE
Awesome Lists containing this project
README
# NAME
PPIx::DocumentName - Utility to extract a name from a PPI Document
# VERSION
version 0.001004
# DESCRIPTION
This module contains a few utilities for extracting a "name" out of an arbitrary Perl file.
Typically, this is the `module` name, in the form:
package Foo
However, it also supports extraction of an override statement in the form:
# PODNAME: OverrideName::Goes::Here
Which may be more applicable for documents that lack a `package` statement, or the `package`
statement may be "wrong", but they still need the document parsed under the guise of having a name
( for purposes such as POD )# USAGE
The recommended approach is simply:
use PPIx::DocumentName;
# Get a PPI Document Somehow
return PPIx::DocumentName->extract( $ppi_document );# METHODS
## extract
my $docname = PPIx::DocumentName->extract( $ppi_document );
This will first attempt to extract a name via the `PODNAME: ` comment notation,
and then fall back to using a `package Package::Name` statement.`$ppi_document` is ideally a `PPI::Document`, but will be auto-up-cast if it is
any of the parameters `PPI::Document->new()` understands.## extract\_via\_statement
my $docname = PPIx::DocumentName->extract_via_statement( $ppi_document );
This only extract `package Package::Name` statement based document names.
`$ppi_document` is ideally a `PPI::Document`, but will be auto-up-cast if it is
any of the parameters `PPI::Document->new()` understands.## extract\_via\_comment
my $docname = PPIx::DocumentName->extract_via_comment( $ppi_document );
This will only extract `PODNAME: ` comment based document names.
`$ppi_document` is ideally a `PPI::Document`, but will be auto-up-cast if it is
any of the parameters `PPI::Document->new()` understands.# ALTERNATIVE NAMES
Other things I could have called this
- `PPIx::PodName` - But it isn't, because it doesn't extract from `POD`, only returns data that may be useful **FOR**
`POD`
- `PPIx::ModuleName` - But it kinda isn't either, because its more generic than that and is tailored to extracting
"a name" out of any PPI Document, and they're _NOT_ all modules.# SIMILAR MODULES
Modules that are perceptibly similar to this ones tasks ( but are subtly different in important ways ) are as follows:
- [`Module::Metadata`](https://metacpan.org/pod/Module::Metadata) - Module::Metadata does a bunch of things this module explicitly doesn't
want or need to do, and it lacks a bunch of features this module needs.Module::Metadata is predominantly concerned with extracting _ALL_ name spaces and _ALL_ versions from a module for the
purposes of indexing and indexing related tasks. This also means it has a notion of "hideable" name spaces with the purpose
of hiding them from `CPAN`.Due to being core as well, it is not able to use `PPI` for its features, so the above concerns mean it is also mostly
based on careful regex parsing, which can easily be false tripped on miscellaneous in document content.Whereas `PPIx::DocumentName` only cares about the _first_ name of a given class, and it cares much more about nested
strings being ignored intentionally. It also has a motive to show names _even_ for documents that won't be indexed
( And `Module::Metadata` has no short term plans on exposing hidden document names ).`PPIx::DocumentName` also has special logic for the `PODNAME: ` declaration, and may eventually support other
mechanisms for extracting a name from "a document", which will be not in `Module::Metadata`'s collection of desired
use-cases.- [`Module::Extract::Namespaces`](https://metacpan.org/pod/Module::Extract::Namespaces) - This is probably closer to
`PPIx::DocumentName`'s requirements, using `PPI` to extract content.Most of `Module::Extract::Namespaces`'s code seems to be glue for legacy versions of `PPI` and the remaining
code is for loading modules from `@INC` ( Which we don't need ), or special casing IO ( Which is also not necessary,
as this module assumes you're moderately acquainted with `PPI` and can do IO yourself )`Module::Extract::Namespaces` also obliterates document comments, which of course stands in the way of our auxiliary
requirements re `PODNAME: ` declarations.It will also not be flexible enough to support other name extraction features we may eventually add.
And like `Module::Metadata`, it also focuses on extracting _many_ `package` declarations where this module prefers
to extract only the _first_.# ACKNOWLEDGEMENTS
The bulk of this logic was extrapolated from [`Pod::Weaver::Section::Name`](https://metacpan.org/pod/Pod::Weaver::Section::Name)
and a related role, [`Pod::Weaver::Role::StringFromComment`](https://metacpan.org/pod/Pod::Weaver::Role::StringFromComment).Thanks to [`RJBS`](cpan:///author/RJBS) for the initial implementation and [`DROLSKY`](cpan:///author/DROLSKY) for some of the improvement patches.
# AUTHOR
Kent Fredric
# COPYRIGHT AND LICENSE
This software is copyright (c) 2017 by Kent Fredric .
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.