hakyll-4.5.2.0: A static website compiler library

Safe HaskellNone
LanguageHaskell98

Hakyll.Core.Identifier.Pattern

Contents

Description

As Identifier is used to specify a single item, a Pattern is used to specify a list of items.

In most cases, globs are used for patterns.

A very simple pattern of such a pattern is "foo/bar". This pattern will only match the exact foo/bar identifier.

To match more than one identifier, there are different captures that one can use:

  • "*": matches at most one element of an identifier;
  • "**": matches one or more elements of an identifier.

Some examples:

  • "foo/*" will match "foo/bar" and "foo/foo", but not "foo/bar/qux";
  • "**" will match any identifier;
  • "foo/**" will match "foo/bar" and "foo/bar/qux", but not "bar/foo";
  • "foo/*.html" will match all HTML files in the "foo/" directory.

The capture function allows the user to get access to the elements captured by the capture elements in the pattern.

Synopsis

The pattern type

data Pattern Source

Type that allows matching on identifiers

Creating patterns

fromGlob :: String -> Pattern Source

Parse a pattern from a string

fromList :: [Identifier] -> Pattern Source

Create a Pattern from a list of Identifiers it should match.

Warning: use this carefully with hasNoVersion and hasVersion. The Identifiers in the list already have versions assigned, and the pattern will then only match the intersection of both versions.

A more concrete example,

fromList ["foo.markdown"] .&&. hasVersion "pdf"

will not match anything! The "foo.markdown" Identifier has no version assigned, so the LHS of .&&. will only match this Identifier with no version. The RHS only matches Identifiers with version set to "pdf" -- hence, this pattern matches nothing.

The correct way to use this is:

fromList $ map (setVersion $ Just "pdf") ["foo.markdown"]

fromRegex :: String -> Pattern Source

Create a Pattern from a regex

Example:

regex "^foo/[^x]*$

fromVersion :: Maybe String -> Pattern Source

Create a pattern which matches all items with the given version.

hasVersion :: String -> Pattern Source

Specify a version, e.g.

"foo/*.markdown" .&&. hasVersion "pdf"

hasNoVersion :: Pattern Source

Match only if the identifier has no version set, e.g.

"foo/*.markdown" .&&. hasNoVersion

Composing patterns

(.&&.) :: Pattern -> Pattern -> Pattern infixr 3 Source

&& for patterns: the given identifier must match both subterms

(.||.) :: Pattern -> Pattern -> Pattern infixr 2 Source

|| for patterns: the given identifier must match any subterm

complement :: Pattern -> Pattern Source

Inverts a pattern, e.g.

complement "foo/bar.html"

will match anything except "foo/bar.html"

Applying patterns

matches :: Pattern -> Identifier -> Bool Source

Check if an identifier matches a pattern

filterMatches :: Pattern -> [Identifier] -> [Identifier] Source

Given a list of identifiers, retain only those who match the given pattern

Capturing strings

capture :: Pattern -> Identifier -> Maybe [String] Source

Match a glob against a pattern, generating a list of captures

fromCapture :: Pattern -> String -> Identifier Source

Create an identifier from a pattern by filling in the captures with a given string

Example:

fromCapture (fromGlob "tags/*") "foo"

Result:

"tags/foo"

fromCaptures :: Pattern -> [String] -> Identifier Source

Create an identifier from a pattern by filling in the captures with the given list of strings