hakyll-4.2.2.0: A static website compiler library

Safe HaskellNone

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 -> PatternSource

Parse a pattern from a string

fromList :: [Identifier] -> PatternSource

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 -> PatternSource

Create a Pattern from a regex

Example:

 regex "^foo/[^x]*$

fromVersion :: Maybe String -> PatternSource

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

hasVersion :: String -> PatternSource

Specify a version, e.g.

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

hasNoVersion :: PatternSource

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

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

Composing patterns

(.&&.) :: Pattern -> Pattern -> PatternSource

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

(.||.) :: Pattern -> Pattern -> PatternSource

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

complement :: Pattern -> PatternSource

Inverts a pattern, e.g.

 complement "foo/bar.html"

will match anything except "foo/bar.html"

Applying patterns

matches :: Pattern -> Identifier -> BoolSource

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 -> IdentifierSource

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

Example:

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

Result:

 "tags/foo"

fromCaptures :: Pattern -> [String] -> IdentifierSource

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