Skip to content

Commit 099469b

Browse files
committed
Open Graph Protocol metadata for version pages
Renders OGP metadata for package documentation pages which could be used to enable prettier rendering of Elm package links when shared at social sites, chat rooms and forums. For example `elm/http` would have following metadata section: ```html <meta property="og:site_name" content="Elm Packages"> <meta property="og:title" content="elm/http 1.0.0"> <meta property="og:image" content="https://package.elm-lang.org/assets/elm_logo.svg"> <meta property="og:description" content="Make HTTP requests"> ``` Could resolve #236.
1 parent a8b9f08 commit 099469b

File tree

3 files changed

+75
-10
lines changed

3 files changed

+75
-10
lines changed

assets/elm_logo.svg

Lines changed: 39 additions & 0 deletions
Loading

src/backend/Main.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -187,15 +187,16 @@ serveVersion memory author project maybeVersion info =
187187
Nothing ->
188188
S.pass
189189

190-
Just (Memory.Summary versions _ _) ->
190+
Just (Memory.Summary versions maybeDetails _) ->
191191
case verifyVersion maybeVersion versions of
192192
Nothing ->
193193
S.pass
194194

195195
Just version ->
196196
case info of
197197
Readme ->
198-
ServeFile.version name version Nothing
198+
ServeFile.version name version Nothing $
199+
maybe Nothing (Just . fst) maybeDetails
199200

200201
Module asset ->
201202
serveVersionHelp name version asset
@@ -220,7 +221,7 @@ serveVersionHelp name version asset =
220221
_ ->
221222
case Module.fromHyphenPath asset of
222223
Just moduleName ->
223-
ServeFile.version name version (Just moduleName)
224+
ServeFile.version name version (Just moduleName) Nothing
224225

225226
Nothing ->
226227
S.pass

src/backend/ServeFile.hs

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import qualified Elm.Package as Pkg
2828

2929
misc :: B.Builder -> Snap ()
3030
misc title =
31-
makeHtml title mempty
31+
makeHtml title mempty (makeOgpMetadata title Nothing)
3232

3333

3434

@@ -37,15 +37,18 @@ misc title =
3737

3838
project :: Pkg.Name -> Snap ()
3939
project pkg =
40-
makeHtml (B.stringUtf8 (Pkg.toString pkg)) mempty
40+
let
41+
title = (B.stringUtf8 (Pkg.toString pkg))
42+
in
43+
makeHtml title mempty (makeOgpMetadata title Nothing)
4144

4245

4346

4447
-- VERSION
4548

4649

47-
version :: Pkg.Name -> Pkg.Version -> Maybe Module.Raw -> Snap ()
48-
version pkg@(Pkg.Name _ prjct) vsn maybeName =
50+
version :: Pkg.Name -> Pkg.Version -> Maybe Module.Raw -> Maybe Text.Text -> Snap ()
51+
version pkg@(Pkg.Name _ prjct) vsn maybeName maybeDescription =
4952
let
5053
versionString =
5154
Pkg.versionToString vsn
@@ -56,8 +59,14 @@ version pkg@(Pkg.Name _ prjct) vsn maybeName =
5659
title =
5760
maybe "" (++" - ") maybeStringName
5861
++ Text.unpack prjct ++ " " ++ versionString
62+
63+
ogpTitle =
64+
maybe "" (++" - ") maybeStringName
65+
++ Pkg.toString pkg ++ " " ++ versionString
66+
5967
in
6068
makeHtml (B.stringUtf8 title) (makeCanonicalLink pkg maybeName)
69+
(makeOgpMetadata (B.stringUtf8 ogpTitle) maybeDescription)
6170

6271

6372

@@ -106,19 +115,35 @@ renames =
106115
(,)
107116

108117

118+
-- OGP METADATA
119+
120+
makeOgpMetadata :: B.Builder -> Maybe Text.Text -> B.Builder
121+
makeOgpMetadata title maybeDescription =
122+
let
123+
description =
124+
maybe "" (B.stringUtf8 . Text.unpack . \d ->
125+
[r|<meta property="og:description" content="|] <> d <> [r|">|]
126+
) maybeDescription
127+
in
128+
[r|<meta property="og:type" content="website">
129+
<meta property="og:site_name" content="Elm Packages">
130+
<meta property="og:title" content="|] <> title <> [r|">
131+
<meta property="og:image" content="http://localhost:8080/assets/elm_logo.svg">|]
132+
<> description
133+
109134

110135
-- SKELETON
111136

112137

113-
makeHtml :: B.Builder -> B.Builder -> Snap ()
114-
makeHtml title canonicalLink =
138+
makeHtml :: B.Builder -> B.Builder -> B.Builder -> Snap ()
139+
makeHtml title canonicalLink ogpMetadata =
115140
writeBuilder $
116141
[r|<!DOCTYPE HTML>
117142
<html>
118143
<head>
119144
<meta charset="UTF-8">
120145
<link rel="shortcut icon" size="16x16, 32x32, 48x48, 64x64, 128x128, 256x256" href="/assets/favicon.ico">
121-
<title>|] <> title <> [r|</title>|] <> canonicalLink <> [r|
146+
<title>|] <> title <> [r|</title>|] <> canonicalLink <> ogpMetadata <> [r|
122147
<link rel="stylesheet" href="/assets/highlight/styles/default.css?|] <> uniqueToken <> [r|">
123148
<link rel="stylesheet" href="/assets/style.css?|] <> uniqueToken <> [r|">
124149
<script src="/assets/highlight/highlight.pack.js?|] <> uniqueToken <> [r|"></script>

0 commit comments

Comments
 (0)