mirror of
https://github.com/dillonkearns/elm-pages-v3-beta.git
synced 2024-12-27 05:44:17 +03:00
Remove some hardcoding.
This commit is contained in:
parent
493f8d3634
commit
3983c06006
@ -1,4 +1,10 @@
|
||||
const globby = require("globby")
|
||||
const path = require("path")
|
||||
|
||||
|
||||
function generateTemplateModuleConnector(staticRoutes) {
|
||||
const templates = globby.sync(["src/Template/*.elm"], {}).map(file => path.basename(file, '.elm'))
|
||||
|
||||
return `module TemplateDemultiplexer exposing (..)
|
||||
|
||||
import Browser
|
||||
@ -13,11 +19,7 @@ import Pages.PagePath exposing (PagePath)
|
||||
import Pages.Platform
|
||||
import Pages.StaticHttp as StaticHttp
|
||||
import SiteConfig
|
||||
import Template.BlogIndex
|
||||
import Template.BlogPost
|
||||
import Template.Documentation
|
||||
import Template.Page
|
||||
import Template.Showcase
|
||||
${templates.map(name => `import Template.${name}`).join("\n")}
|
||||
|
||||
|
||||
type alias Model =
|
||||
|
0
tests/src/Template/BlogIndex.elm
Normal file
0
tests/src/Template/BlogIndex.elm
Normal file
202
tests/src/Template/BlogPost.elm
Normal file
202
tests/src/Template/BlogPost.elm
Normal file
@ -0,0 +1,202 @@
|
||||
module Template.BlogPost exposing (Model, Msg, decoder, template)
|
||||
|
||||
import Data.Author as Author exposing (Author)
|
||||
import Date exposing (Date)
|
||||
import Element exposing (Element)
|
||||
import Element.Font as Font
|
||||
import Element.Region
|
||||
import GlobalMetadata
|
||||
import Head
|
||||
import Head.Seo as Seo
|
||||
import Json.Decode as Decode
|
||||
import List.Extra
|
||||
import OptimizedDecoder as D
|
||||
import Pages
|
||||
import Pages.ImagePath as ImagePath exposing (ImagePath)
|
||||
import Pages.PagePath as PagePath exposing (PagePath)
|
||||
import Pages.StaticHttp as StaticHttp
|
||||
import Palette
|
||||
import Secrets
|
||||
import SiteConfig
|
||||
import StructuredData
|
||||
import Template
|
||||
import Template.Metadata exposing (BlogPost)
|
||||
import TemplateDocument exposing (TemplateDocument)
|
||||
|
||||
|
||||
type Model
|
||||
= Model
|
||||
|
||||
|
||||
type Msg
|
||||
= Msg
|
||||
|
||||
|
||||
template : TemplateDocument BlogPost StaticData Model Msg
|
||||
template =
|
||||
Template.template
|
||||
{ view = view
|
||||
, head = head
|
||||
, staticData = staticData
|
||||
, init = init
|
||||
, update = update
|
||||
}
|
||||
|
||||
|
||||
decoder : Decode.Decoder BlogPost
|
||||
decoder =
|
||||
Decode.map6 BlogPost
|
||||
(Decode.field "title" Decode.string)
|
||||
(Decode.field "description" Decode.string)
|
||||
(Decode.field "published"
|
||||
(Decode.string
|
||||
|> Decode.andThen
|
||||
(\isoString ->
|
||||
case Date.fromIsoString isoString of
|
||||
Ok date ->
|
||||
Decode.succeed date
|
||||
|
||||
Err error ->
|
||||
Decode.fail error
|
||||
)
|
||||
)
|
||||
)
|
||||
(Decode.field "author" Author.decoder)
|
||||
(Decode.field "image" imageDecoder)
|
||||
(Decode.field "draft" Decode.bool
|
||||
|> Decode.maybe
|
||||
|> Decode.map (Maybe.withDefault False)
|
||||
)
|
||||
|
||||
|
||||
imageDecoder : Decode.Decoder (ImagePath Pages.PathKey)
|
||||
imageDecoder =
|
||||
Decode.string
|
||||
|> Decode.andThen
|
||||
(\imageAssetPath ->
|
||||
case findMatchingImage imageAssetPath of
|
||||
Nothing ->
|
||||
Decode.fail "Couldn't find image."
|
||||
|
||||
Just imagePath ->
|
||||
Decode.succeed imagePath
|
||||
)
|
||||
|
||||
|
||||
findMatchingImage : String -> Maybe (ImagePath Pages.PathKey)
|
||||
findMatchingImage imageAssetPath =
|
||||
List.Extra.find
|
||||
(\image -> ImagePath.toString image == imageAssetPath)
|
||||
Pages.allImages
|
||||
|
||||
|
||||
init : BlogPost -> ( Model, Cmd Msg )
|
||||
init metadata =
|
||||
( Model, Cmd.none )
|
||||
|
||||
|
||||
update : BlogPost -> Msg -> Model -> ( Model, Cmd Msg )
|
||||
update metadata msg model =
|
||||
( Model, Cmd.none )
|
||||
|
||||
|
||||
staticData : a -> StaticHttp.Request StaticData
|
||||
staticData siteMetadata =
|
||||
StaticHttp.get (Secrets.succeed "https://api.github.com/repos/dillonkearns/elm-pages")
|
||||
(D.field "stargazers_count" D.int)
|
||||
|
||||
|
||||
type alias StaticData =
|
||||
Int
|
||||
|
||||
|
||||
view : List ( PagePath Pages.PathKey, GlobalMetadata.Metadata ) -> StaticData -> Model -> BlogPost -> ( a, List (Element msg) ) -> { title : String, body : Element msg }
|
||||
view allMetadata static model blogPost rendered =
|
||||
{ title = blogPost.title
|
||||
, body =
|
||||
Element.column [ Element.width Element.fill ]
|
||||
[ Element.column
|
||||
[ Element.padding 30
|
||||
, Element.spacing 40
|
||||
, Element.Region.mainContent
|
||||
, Element.width (Element.fill |> Element.maximum 800)
|
||||
, Element.centerX
|
||||
]
|
||||
(Element.column [ Element.spacing 10 ]
|
||||
[ Element.row [ Element.spacing 10 ]
|
||||
[ Author.view [] blogPost.author
|
||||
, Element.column [ Element.spacing 10, Element.width Element.fill ]
|
||||
[ Element.paragraph [ Font.bold, Font.size 24 ]
|
||||
[ Element.text blogPost.author.name
|
||||
]
|
||||
, Element.paragraph [ Font.size 16 ]
|
||||
[ Element.text blogPost.author.bio ]
|
||||
]
|
||||
]
|
||||
]
|
||||
:: (publishedDateView blogPost |> Element.el [ Font.size 16, Font.color (Element.rgba255 0 0 0 0.6) ])
|
||||
:: Palette.blogHeading blogPost.title
|
||||
:: articleImageView blogPost.image
|
||||
:: Tuple.second rendered
|
||||
)
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
head : StaticData -> PagePath.PagePath Pages.PathKey -> BlogPost -> List (Head.Tag Pages.PathKey)
|
||||
head static currentPath meta =
|
||||
Head.structuredData
|
||||
(StructuredData.article
|
||||
{ title = meta.title
|
||||
, description = meta.description
|
||||
, author = StructuredData.person { name = meta.author.name }
|
||||
, publisher = StructuredData.person { name = "Dillon Kearns" }
|
||||
, url = SiteConfig.canonicalUrl ++ "/" ++ PagePath.toString currentPath
|
||||
, imageUrl = SiteConfig.canonicalUrl ++ "/" ++ ImagePath.toString meta.image
|
||||
, datePublished = Date.toIsoString meta.published
|
||||
, mainEntityOfPage =
|
||||
StructuredData.softwareSourceCode
|
||||
{ codeRepositoryUrl = "https://github.com/dillonkearns/elm-pages"
|
||||
, description = "A statically typed site generator for Elm."
|
||||
, author = "Dillon Kearns"
|
||||
, programmingLanguage = StructuredData.elmLang
|
||||
}
|
||||
}
|
||||
)
|
||||
:: (Seo.summaryLarge
|
||||
{ canonicalUrlOverride = Nothing
|
||||
, siteName = "elm-pages"
|
||||
, image =
|
||||
{ url = meta.image
|
||||
, alt = meta.description
|
||||
, dimensions = Nothing
|
||||
, mimeType = Nothing
|
||||
}
|
||||
, description = meta.description
|
||||
, locale = Nothing
|
||||
, title = meta.title
|
||||
}
|
||||
|> Seo.article
|
||||
{ tags = []
|
||||
, section = Nothing
|
||||
, publishedTime = Just (Date.toIsoString meta.published)
|
||||
, modifiedTime = Nothing
|
||||
, expirationTime = Nothing
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
publishedDateView : { a | published : Date.Date } -> Element msg
|
||||
publishedDateView metadata =
|
||||
Element.text
|
||||
(metadata.published
|
||||
|> Date.format "MMMM ddd, yyyy"
|
||||
)
|
||||
|
||||
|
||||
articleImageView : ImagePath Pages.PathKey -> Element msg
|
||||
articleImageView articleImage =
|
||||
Element.image [ Element.width Element.fill ]
|
||||
{ src = ImagePath.toString articleImage
|
||||
, description = "Article cover photo"
|
||||
}
|
0
tests/src/Template/Documentation.elm
Normal file
0
tests/src/Template/Documentation.elm
Normal file
1
tests/src/Template/Page.elm
Normal file
1
tests/src/Template/Page.elm
Normal file
@ -0,0 +1 @@
|
||||
module Main exposing (..)
|
1
tests/src/Template/Showcase.elm
Normal file
1
tests/src/Template/Showcase.elm
Normal file
@ -0,0 +1 @@
|
||||
module Main exposing (..)
|
Loading…
Reference in New Issue
Block a user