App-LinkSite

 view release on metacpan or  search on metacpan

lib/App/LinkSite/Site.pm  view on Meta::CPAN

=head1 NAME

App::LinkSite::Site

=head1 SYNOPIS

(You probably want to just look at the L<linksite> application.)

=head1 DESCRIPTION

A class to model a link site (part of App::LinkSite).

=cut

use Feature::Compat::Class;

class App::LinkSite::Site {
  our $VERSION = '0.1.1';
  use strict;
  use warnings;
  no if $] >= 5.038, 'warnings', 'experimental::class';

  use JSON;

  field $name :reader :param;
  field $handle :reader :param;
  field $image :reader :param;
  field $desc :reader :param;
  field $og_image :reader :param;
  field $site_url :reader :param;
  field $text_color :reader :param = undef;
  field $background_color :reader :param = undef;

  field $socials :reader :param = [];
  field $links :reader :param = [];
  field $sections :reader :param = [];

=head1 METHODS

=head2 has_sections

Returns true if the site has any non-empty sections.

=cut

  method has_sections {
    return scalar(grep { $_->has_links } $self->sections->@*) > 0;
  }

=head2 all_links

Returns all links from both the links array and all sections.

=cut

  method all_links {
    my @all_links = $self->links->@*;
    for my $section ($self->sections->@*) {
      push @all_links, $section->links->@*;
    }
    return @all_links;
  }

=head2 json_ld

Returns a JSON/LD fragment for this web site.

=cut

  method json_ld {
    my $json = {
      '@context' => 'https://schema.org',
      '@type' => 'WebPage',
      name => "Links page for $name ($handle)",
  mainEntity => {
        '@context' => 'https://schema.org',
        '@type' => 'Person',
        name => $self->name,
  image => $self->image,
        sameAs => [ map { $_->mk_social_link } $self->socials->@* ],
  },
  relatedLink => [ map { $_->link } $self->all_links ],
  };

    return JSON->new->pretty->encode($json);
  }
}

1;

=head1 AUTHOR



( run in 0.550 second using v1.01-cache-2.11-cpan-d8267643d1d )