├── .nojekyll
├── .gitattributes
├── src
├── Reactor.elm
├── TeachingMaterial.elm
└── Main.elm
├── elm-tooling.json
├── script_map_svg2elm.sh
├── .gitignore
├── script_build_elmjs.sh
├── .github
├── dependabot.yml
└── workflows
│ └── validateTeachingMaterialTable.yml
├── script_teachingmaterial_yml2elm.sh
├── tests
└── Tests.elm
├── index.html
├── LICENSE
├── elm.json
├── multiselect.css
├── README.md
└── data
└── teachingmaterial.yml
/.nojekyll:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.map binary
--------------------------------------------------------------------------------
/src/Reactor.elm:
--------------------------------------------------------------------------------
1 | module Reactor exposing (main)
2 |
3 | import Main
4 |
5 | main = Main.reactor
--------------------------------------------------------------------------------
/elm-tooling.json:
--------------------------------------------------------------------------------
1 | {
2 | "tools": {
3 | "elm": "0.19.1",
4 | "elm-test-rs": "3.0.0"
5 | }
6 | }
--------------------------------------------------------------------------------
/script_map_svg2elm.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # svg map to elm code
4 | # https://github.com/pinata-llc/svg2elm
5 | svg2elm --module MapOfComputionalArchaeology data/comparchmap.svg > src/MapOfComputionalArchaeology.elm
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # elm-package generated files
2 | elm-stuff
3 | # elm-repl generated files
4 | repl-temp-*
5 |
6 | # rendered, intermediate data products
7 | src/TeachingMaterialData.elm
8 | src/TeachingMaterialEdges.elm
9 | elm.js
--------------------------------------------------------------------------------
/script_build_elmjs.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | elm make src/Main.elm --optimize --output=elm.js
4 | uglifyjs elm.js --compress 'pure_funcs=[F2,F3,F4,F5,F6,F7,F8,F9,A2,A3,A4,A5,A6,A7,A8,A9],pure_getters,keep_fargs=false,unsafe_comps,unsafe' | uglifyjs --mangle --output elm.min.js
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | # Set update schedule for GitHub Actions
2 |
3 | version: 2
4 | updates:
5 |
6 | - package-ecosystem: "github-actions"
7 | directory: "/"
8 | schedule:
9 | # Check for updates to GitHub Actions every month
10 | interval: "monthly"
--------------------------------------------------------------------------------
/script_teachingmaterial_yml2elm.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # teaching material yml to elm code
4 | cp data/teachingmaterial.yml src/TeachingMaterialData.elm
5 | prepent1='module TeachingMaterialData exposing (teachingMaterialString)
6 | \n
7 | \nteachingMaterialString : String
8 | \nteachingMaterialString = """'
9 | echo -en $prepent1 | cat - src/TeachingMaterialData.elm > temp && mv temp src/TeachingMaterialData.elm
10 | echo '"""' >> src/TeachingMaterialData.elm
11 |
--------------------------------------------------------------------------------
/tests/Tests.elm:
--------------------------------------------------------------------------------
1 | module Tests exposing (..)
2 |
3 | import TeachingMaterial exposing (parseTeachingResources)
4 | import TeachingMaterialData exposing (teachingMaterialString)
5 |
6 | import Expect
7 | import Test exposing (Test, describe, test)
8 |
9 | suite : Test
10 | suite =
11 | describe "Pseudo-test for teaching material list validation"
12 | [ test "if the .yml file can be parsed" <|
13 | \_ ->
14 | let res = parseTeachingResources teachingMaterialString
15 | in Expect.ok res
16 | ]
17 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Computational archaeology teaching material list
7 |
8 |
9 |
10 |
11 |
12 |
13 |
19 |
20 |
--------------------------------------------------------------------------------
/.github/workflows/validateTeachingMaterialTable.yml:
--------------------------------------------------------------------------------
1 | name: validate data/teachingmaterial.yml
2 |
3 | # Trigger the workflow on push or pull request, but only for the main branch
4 | on:
5 | pull_request:
6 | push:
7 | branches: [main]
8 |
9 | jobs:
10 | validate:
11 | name: validate file
12 | runs-on: ubuntu-latest
13 | steps:
14 |
15 | - name: Clone repo
16 | uses: actions/checkout@v5
17 |
18 | - name: Install elm and elm-test-rs as defined in elm-tooling.json
19 | uses: mpizenberg/elm-tooling-action@v1.7
20 |
21 | - name: Create module TeachingMaterialData with teachingMaterialString
22 | run: ./script_teachingmaterial_yml2elm.sh
23 |
24 | - name: Try parsing teachingMaterialString by running the pseudo-test
25 | run: elm-test-rs
26 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 SSLA - Scientific Scripting Languages in Archaeology
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/elm.json:
--------------------------------------------------------------------------------
1 | {
2 | "type": "application",
3 | "source-directories": [
4 | "src"
5 | ],
6 | "elm-version": "0.19.1",
7 | "dependencies": {
8 | "direct": {
9 | "MaybeJustJames/yaml": "2.1.5",
10 | "NoRedInk/elm-simple-fuzzy": "1.0.3",
11 | "billstclair/elm-sortable-table": "1.2.1",
12 | "elm/browser": "1.0.2",
13 | "elm/core": "1.0.5",
14 | "elm/file": "1.0.5",
15 | "elm/html": "1.0.0",
16 | "elm/http": "2.0.0",
17 | "elm/svg": "1.0.1",
18 | "elm/virtual-dom": "1.0.3",
19 | "elm-community/maybe-extra": "5.3.0",
20 | "lattyware/elm-fontawesome": "6.0.0",
21 | "rundis/elm-bootstrap": "5.2.0",
22 | "sporto/elm-select": "6.0.1",
23 | "terezka/elm-charts": "4.0.0"
24 | },
25 | "indirect": {
26 | "K-Adam/elm-dom": "1.0.0",
27 | "avh4/elm-color": "1.0.0",
28 | "danhandrea/elm-time-extra": "1.1.0",
29 | "elm/bytes": "1.0.8",
30 | "elm/json": "1.1.3",
31 | "elm/parser": "1.1.0",
32 | "elm/regex": "1.0.0",
33 | "elm/time": "1.0.0",
34 | "elm/url": "1.0.0",
35 | "justinmimbs/date": "4.0.1",
36 | "justinmimbs/time-extra": "1.1.1",
37 | "myrho/elm-round": "1.0.4",
38 | "ryan-haskell/date-format": "1.0.0",
39 | "terezka/intervals": "2.0.2"
40 | }
41 | },
42 | "test-dependencies": {
43 | "direct": {
44 | "elm-explorations/test": "2.2.0"
45 | },
46 | "indirect": {
47 | "debois/elm-dom": "1.3.0",
48 | "elm/random": "1.0.0"
49 | }
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/multiselect.css:
--------------------------------------------------------------------------------
1 | /* https://raw.githubusercontent.com/sporto/elm-select/6.0.1/src/styles.css */
2 |
3 | .elm-select-input-wrapper {
4 | display: flex;
5 | position: relative;
6 | overflow: hidden;
7 | background-color:white;
8 | padding: 6px 8px;
9 | }
10 |
11 | .elm-select-input {
12 | flex: 1;
13 | outline: none;
14 | border: none;
15 | }
16 |
17 | .elm-select-clear {
18 | cursor: pointer;
19 | height: 1rem;
20 | line-height: 1rem;
21 | margin-top: -0.5rem;
22 | position: absolute;
23 | right: 0.25rem;
24 | top: 50%;
25 | }
26 |
27 | .elm-select-multi-input-item-container {
28 | display: flex;
29 | flex-direction: row;
30 | align-items: center;
31 | justify-content: center;
32 | }
33 |
34 | .elm-select-multi-input-item {
35 | display: flex;
36 | border-width: 1px;
37 | background-color: #E3E5E8;
38 | border-radius: 4px;
39 | margin-right: 4px;
40 | padding: 2px 8px;
41 | }
42 |
43 | .elm-select-multi-input-item-text {
44 | text-overflow: ellipsis;
45 | }
46 |
47 | .elm-select-multi-input-item-remove {
48 | display: flex;
49 | align-items: center;
50 | justify-content: center;
51 | }
52 |
53 | .elm-select-multi-item-remove {
54 | cursor: pointer;
55 | padding-top: 1px;
56 | line-height: 0px;
57 | }
58 |
59 | /* Menu */
60 |
61 | .elm-select-menu {
62 | position: relative;
63 | }
64 |
65 | .elm-select-menu {
66 | position: absolute;
67 | z-index: 1;
68 | background-color: white;
69 | min-width: 8rem;
70 | border: 1px solid #e9e9e9;
71 | max-height: 20rem;
72 | overflow-y: scroll;
73 | }
74 |
75 | .elm-select-menu-item {
76 | padding: 8px 4px;
77 | }
78 |
79 | .elm-select-menu-item-selectable {
80 | cursor: pointer;
81 | }
82 |
83 | .elm-select-menu-item-selectable:hover {
84 | background-color: #e9e9e9;
85 | }
86 |
87 | /* Underline */
88 |
89 | .elm-select-input-underline-wrapper {
90 | position: relative;
91 | }
92 |
93 | .elm-select-input-underline:before,
94 | .elm-select-input-underline:after {
95 | content: '';
96 | height: 2px;
97 | width: 0;
98 | position: absolute;
99 | background: #03a9f4;
100 | -webkit-transition: 0.2s ease all;
101 | -moz-transition: 0.2s ease all;
102 | -o-transition: 0.2s ease all;
103 | transition: 0.2s ease all;
104 | }
105 |
106 | .elm-select-input-underline:before {
107 | left: 50%;
108 | }
109 |
110 | .elm-select-input-underline:after {
111 | right: 50%;
112 | }
113 |
114 | .elm-select:focus-within .elm-select-input-underline:before,
115 | .elm-select:focus-within .elm-select-input-underline:after {
116 | width: 50%;
117 | }
118 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # MapofComputationalArchaeology
2 |
3 | This repo stores code and data for a small web app to list teaching material in the field of Computational Archaeology: https://sslarch.github.io/MapofComputationalArchaeology
4 |
5 | The teaching material table is stored in `data/teachingmaterial.yml` and the web app queries it directly from the main branch on GitHub. **To add new material or modify the existing entries, just edit this file and submit a pull request with your changes.** The file will then be structurally validated by a GitHub action and can be merged if it is sound.
6 |
7 | ## Developer notes
8 |
9 | This web app was written in [Elm](https://elm-lang.org). See the `src` directory for the code and look [here](https://guide.elm-lang.org/install/elm.html) for instructions on how to run and test it locally with `elm reactor`.
10 |
11 | ### Deploying the app
12 |
13 | To prepare the app for deployment on GitHub run `script_build_elmjs.sh`, which will transpile the Elm code in `src` to a single, large `.js` file, and then reduce its size with [uglifyjs](https://github.com/mishoo/UglifyJS) to produce the minified script `elm.min.js`. This file stores the entire app. The `index.html` file finally calls this script. This is what GitHub detects and shows as the website.
14 |
15 | ### Validating `data/teachingmaterial.yml`
16 |
17 | To allow for convenient, yet safe editing of the input data in `data/teachingmaterial.yml` an automatic GitHub action workflow runs upon every push to the main branch. This workflow is specified in `.github/workflows/validateTeachingMaterialTable.yml` and involves the following main steps:
18 |
19 | 1. The Elm compiler and the testing tool elm-test-rs are installed as specified in `elm-tooling.json`.
20 | 2. The script `script_teachingmaterial_yml2elm.sh` is run to create a module `src/TeachingMaterialData.elm` with a string-representation of the table.
21 | 3. elm-test-rs triggers the pseudo-test in `tests/Tests.elm`, which runs the parsing code in `src/TeachingMaterial.elm` on the string-representation in `src/TeachingMaterialData.elm`.
22 |
23 | If the parsing fails in any way, then the GitHub action will fail, reporting the specific parsing issue. If it does not fail, then the new version of `data/teachingmaterial.yml` can be read by the app and is safe to merge.
24 |
25 | ### Changing the fantasy map
26 |
27 | The original version of the base map (`data/Archaeologia.map`) was created with this [Fantasy-Map-Generator](https://azgaar.github.io/Fantasy-Map-Generator) and can theoretically still be edited with it. The derived file `data/comparchmap.svg` replaced it, though, for all means and purposes, as several manual steps have to be performed to wrangle the output of the map generator into a .svg file usable with the elm-charts library (simplifying layers, merging objects, replacing labels). Ideally future changes should be performed on the .svg file only. Only for more complex changes (coastlines) it may be necessary to go back to the .map file.
28 |
29 | If the `data/comparchmap.svg` is changed then it has to be transformed to Elm code by running `script_map_svg2elm.sh`. Elm can not read the .svg file on the fly. Instead the drawing has to be converted to Elm code with the [svg2elm](https://github.com/pinata-llc/svg2elm) tool which directly creates a dedicated Elm module (`src/MapOfComputionalArchaeology.elm`) for it. This takes a minute, because the .svg file is fairly large.
30 |
--------------------------------------------------------------------------------
/src/TeachingMaterial.elm:
--------------------------------------------------------------------------------
1 | module TeachingMaterial exposing (
2 | TeachingResource, Difficulty (..),
3 | makeDummyResource, difficultyToString, parseTeachingResources)
4 |
5 | import Yaml.Decode as Decode exposing (Decoder)
6 | import String exposing (split, trim)
7 |
8 | type alias TeachingResource =
9 | { id : String
10 | , source : List String
11 | , x : Float
12 | , y : Float
13 | , name : String
14 | , author : List String
15 | , year : String
16 | , topic : String
17 | , language : String
18 | , programmingLanguage : List String
19 | , tools : List String
20 | , levelOfDifficulty : Difficulty
21 | , description : String
22 | , materialType : String
23 | , tags : List String
24 | , tagsOpenArchaeo : List String
25 | , link : String
26 | , citation : String
27 | }
28 |
29 | type Difficulty =
30 | Beginner
31 | | Intermediate
32 | | Advanced
33 |
34 | difficultyFromString : String -> Result String Difficulty
35 | difficultyFromString s = case s of
36 | "beginner" -> Ok Beginner
37 | "intermediate" -> Ok Intermediate
38 | "advanced" -> Ok Advanced
39 | _ -> Err "invalid difficulty string"
40 |
41 | difficultyToString : Difficulty -> String
42 | difficultyToString d = case d of
43 | Beginner -> "beginner"
44 | Intermediate -> "intermediate"
45 | Advanced -> "advanced"
46 |
47 | makeDummyResource : Float -> Float -> TeachingResource
48 | makeDummyResource x y = {
49 | id = ""
50 | , source = []
51 | , x = x
52 | , y = y
53 | , name = ""
54 | , author = []
55 | , year = ""
56 | , topic = ""
57 | , language = ""
58 | , programmingLanguage = []
59 | , tools = []
60 | , levelOfDifficulty = Beginner
61 | , description = ""
62 | , materialType = ""
63 | , tags = []
64 | , tagsOpenArchaeo = []
65 | , link = ""
66 | , citation = ""
67 | }
68 |
69 | decodeTeachingResource : Decoder TeachingResource
70 | decodeTeachingResource =
71 | let decodeStringList = Decode.map (List.map trim) <| Decode.map (\s -> split "," s) Decode.string
72 | decodeStringListLower = decodeStringList |> Decode.map (List.map String.toLower)
73 | decodeDifficulty = Decode.string |>
74 | Decode.andThen (\value -> Decode.fromResult (difficultyFromString value))
75 | in Decode.succeed TeachingResource
76 | |> Decode.andMap (Decode.field "ID" Decode.string)
77 | |> Decode.andMap (Decode.field "Source" decodeStringList)
78 | |> Decode.andMap (Decode.field "X_map" Decode.float)
79 | |> Decode.andMap (Decode.field "Y_map" Decode.float)
80 | |> Decode.andMap (Decode.field "Name" Decode.string)
81 | |> Decode.andMap (Decode.field "Author" decodeStringList)
82 | |> Decode.andMap (Decode.field "Year" Decode.string)
83 | |> Decode.andMap (Decode.field "Topic" Decode.string)
84 | |> Decode.andMap (Decode.field "Language" Decode.string)
85 | |> Decode.andMap (Decode.field "Programming_language" decodeStringListLower)
86 | |> Decode.andMap (Decode.field "Tools" decodeStringList)
87 | |> Decode.andMap (Decode.field "Level_of_difficulty" decodeDifficulty)
88 | |> Decode.andMap (Decode.field "Description" Decode.string)
89 | |> Decode.andMap (Decode.field "Material_type" Decode.string)
90 | |> Decode.andMap (Decode.field "Tags" decodeStringListLower)
91 | |> Decode.andMap (Decode.field "Tags_openarchaeo" decodeStringList)
92 | |> Decode.andMap (Decode.field "Link" Decode.string)
93 | |> Decode.andMap (Decode.field "Citation" Decode.string)
94 |
95 | parseTeachingResources : String -> Result String (List TeachingResource)
96 | parseTeachingResources teachingMaterialString =
97 | case Decode.fromString (Decode.list decodeTeachingResource) teachingMaterialString of
98 | Err e -> Err (Decode.errorToString e)
99 | Ok x -> Ok x
100 |
--------------------------------------------------------------------------------
/src/Main.elm:
--------------------------------------------------------------------------------
1 | module Main exposing (..)
2 |
3 | import MapOfComputionalArchaeology exposing (comparchmap)
4 | import TeachingMaterial exposing (
5 | TeachingResource, Difficulty (..),
6 | makeDummyResource, difficultyToString, parseTeachingResources)
7 |
8 | import Bootstrap.Alert as Alert
9 | import Bootstrap.Button as Button
10 | import Bootstrap.CDN as CDN
11 | import Bootstrap.Grid as Grid
12 | import Bootstrap.Grid.Col as Col
13 | import Bootstrap.Grid.Row as Row
14 | import Bootstrap.Modal as Modal
15 | import Bootstrap.Utilities.Spacing as Spacing
16 | import Browser
17 | import Browser.Events as E
18 | import Browser.Navigation as Navigation
19 | import Chart as C
20 | import Chart.Attributes as CA
21 | import Chart.Events as CE
22 | import Chart.Item as CI
23 | import Chart.Svg as CS
24 | import FontAwesome as Icon exposing (Icon)
25 | import FontAwesome.Solid as Icon
26 | import FontAwesome.Styles as Icon
27 | import Html as H exposing (Html, a, br, button, div, h1, input, p, span, text)
28 | import Html.Attributes as HA exposing (href, placeholder, style)
29 | import Html.Events as HE exposing (onInput)
30 | import Http as Http
31 | import List exposing (map, concat, sort, any, member)
32 | import Maybe.Extra exposing (values)
33 | import Select as Select
34 | import Simple.Fuzzy as SF
35 | import Svg as S
36 | import Svg.Attributes as SA
37 | import Table exposing (defaultCustomizations)
38 | import Task
39 | import VirtualDom exposing (attribute)
40 |
41 | -- MAIN
42 |
43 | -- for the test environment with elm-reactor (open Reactor.elm!)
44 | reactor =
45 | Browser.element
46 | { init = \() -> init 500 []
47 | , update = update
48 | , view = view True -- devel mode = True
49 | , subscriptions = subscriptions
50 | }
51 |
52 | -- for production and deployment
53 | main =
54 | Browser.element
55 | { init = \wW -> init wW []
56 | , update = update
57 | , view = view False -- devel mode = False
58 | , subscriptions = subscriptions
59 | }
60 |
61 | -- MODEL
62 |
63 | type alias Model = {
64 | windowWidth : Int
65 | -- table and data
66 | , elements : List TeachingResource
67 | , tableState : Table.State
68 | , multiQueryContent : List String
69 | , multiQuery : QueryModel
70 | -- map
71 | , center : CS.Point
72 | , dragging : Dragging
73 | , percentage : Float
74 | , hovering : Maybe CE.Point
75 | , closestPoint : List (CI.One TeachingResource CI.Dot)
76 | -- modal
77 | , modalVisibility : Modal.Visibility
78 | , selectedElement : Maybe TeachingResource
79 | -- welcome
80 | , welcomeVisibility : Modal.Visibility
81 | -- error
82 | , errorVisibility : Modal.Visibility
83 | , errorMessage : String
84 | }
85 |
86 | type alias QueryModel =
87 | { id : String
88 | , available : List String
89 | , itemToLabel : String -> String
90 | , selected : List String
91 | , selectState : Select.State
92 | , selectConfig : Select.Config (MultiQueryMsg String) String
93 | }
94 |
95 | type MultiQueryMsg item
96 | = NoOp
97 | | OnSelect (Maybe item)
98 | | OnRemoveItem item
99 | | SelectMsg (Select.Msg item)
100 |
101 | type Dragging =
102 | CouldStillBeClick CS.Point
103 | | ForSureDragging CS.Point
104 | | None
105 |
106 | -- INIT
107 |
108 | init : Int -> List TeachingResource -> ( Model, Cmd Msg )
109 | init wW resources =
110 | let model = { windowWidth = wW
111 | -- table and data
112 | , elements = resources
113 | , tableState = Table.sortBy "ID" True
114 | , multiQueryContent = [ ]
115 | , multiQuery = {
116 | id = "exampleMulti"
117 | , available = (map .tags resources |> concat) ++ (map .programmingLanguage resources |> concat) |> sort
118 | , itemToLabel = identity
119 | , selected = [ ]
120 | , selectState = Select.init ""
121 | , selectConfig = Select.newConfig
122 | { onSelect = OnSelect
123 | , toLabel = identity
124 | , filter = filter 0 identity
125 | , toMsg = SelectMsg
126 | }
127 | |> Select.withMultiSelection True
128 | |> Select.withCustomInput identity
129 | |> Select.withOnRemoveItem OnRemoveItem
130 | |> Select.withCutoff 12
131 | |> Select.withNotFound "No matches"
132 | |> Select.withPrompt "by title, authors, language or tags"
133 | }
134 | -- map
135 | , center = { x = 100, y = 50 }
136 | , dragging = None
137 | , percentage = 100
138 | , hovering = Nothing
139 | , closestPoint = []
140 | -- modal
141 | , modalVisibility = Modal.hidden
142 | , selectedElement = Nothing
143 | -- welcome
144 | , welcomeVisibility = Modal.shown
145 | -- error
146 | , errorVisibility = Modal.hidden
147 | , errorMessage = ""
148 | }
149 | in ( model, Cmd.none )
150 |
151 | filter : Int -> (a -> String) -> String -> List a -> Maybe (List a)
152 | filter minChars toLabel query items =
153 | if String.length query < minChars then
154 | Nothing
155 | else
156 | items
157 | |> SF.filter toLabel query
158 | |> Just
159 |
160 | -- UPDATE
161 |
162 | type Msg =
163 | SetWindowWidth Int
164 | -- download data
165 | | SendHttpRequest
166 | | DataReceived (Result Http.Error String)
167 | -- table and data
168 | | SetMultiQuery (MultiQueryMsg String)
169 | | ButtonAddToQuery String
170 | | SetTableState Table.State
171 | | ClearFilter
172 | -- map
173 | | OnMouseClick (List (CI.One TeachingResource CI.Dot))
174 | | OnMouseDown CS.Point
175 | | OnMouseMove CS.Point CE.Point (List (CI.One TeachingResource CI.Dot))
176 | | OnMouseUp CS.Point CS.Point
177 | | OnMouseLeave
178 | | OnZoomIn
179 | | OnZoomOut
180 | | OnZoomReset
181 | -- modal
182 | | CloseModal
183 | | ShowModal (Maybe TeachingResource)
184 | -- welcome
185 | | CloseWelcome
186 | -- error
187 | | CloseError
188 | | ShowError String
189 |
190 | update : Msg -> Model -> ( Model, Cmd Msg )
191 | update msg model =
192 | case msg of
193 | SetWindowWidth w ->
194 | ({ model | windowWidth = w }, Cmd.none)
195 | -- download data
196 | SendHttpRequest -> ( model, getTeachingResources )
197 | DataReceived res -> case res of
198 | Err e -> update (ShowError "Failed to download data from GitHub.") model
199 | Ok x ->
200 | case parseTeachingResources x of
201 | Err e -> update (ShowError ("Can't parse data. " ++ e)) model
202 | Ok y -> ({ model | elements = y }, Cmd.none)
203 | -- map
204 | OnMouseClick closestPoint ->
205 | case (List.head (filterClosestPointToRealEntries closestPoint)) of
206 | Nothing -> (model, Cmd.none)
207 | Just x -> update (ShowModal (Just <| CI.getData x)) model
208 | OnMouseDown offset ->
209 | ({ model | dragging = CouldStillBeClick offset }, Cmd.none)
210 | OnMouseMove offset hovering closestPoint ->
211 | case model.dragging of
212 | CouldStillBeClick prevOffset ->
213 | if prevOffset == offset then
214 | ({ model | closestPoint = closestPoint
215 | , hovering = Just hovering }, Cmd.none)
216 | else
217 | ({ model | center = updateCenter model.center prevOffset offset
218 | , dragging = ForSureDragging offset
219 | , closestPoint = closestPoint
220 | , hovering = Just hovering
221 | }, Cmd.none)
222 | ForSureDragging prevOffset ->
223 | ({ model | center = updateCenter model.center prevOffset offset
224 | , dragging = ForSureDragging offset
225 | , closestPoint = closestPoint
226 | , hovering = Just hovering
227 | }, Cmd.none)
228 | None ->
229 | ({ model | closestPoint = closestPoint
230 | , hovering = Just hovering }, Cmd.none)
231 | OnMouseUp offset coord ->
232 | case model.dragging of
233 | CouldStillBeClick prevOffset ->
234 | ({ model | dragging = None }, Cmd.none)
235 | ForSureDragging prevOffset ->
236 | ({ model | center = updateCenter model.center prevOffset offset
237 | , dragging = None
238 | }, Cmd.none)
239 | None ->
240 | (model, Cmd.none)
241 | OnMouseLeave ->
242 | ({ model | dragging = None, closestPoint = [], hovering = Nothing }, Cmd.none)
243 | OnZoomIn ->
244 | ({ model | percentage = model.percentage + 20 }, Cmd.none)
245 | OnZoomOut ->
246 | ({ model | percentage = max 1 (model.percentage - 20) }, Cmd.none)
247 | OnZoomReset ->
248 | ({ model | percentage = 100, center = { x = 100, y = 50 } }, Cmd.none)
249 | -- table and data
250 | SetMultiQuery sub ->
251 | let ( newMultiQuery, subCmd ) = updateMultiQuery sub model.multiQuery
252 | in ({ model | multiQueryContent = newMultiQuery.selected, multiQuery = newMultiQuery }, Cmd.map SetMultiQuery subCmd)
253 | ButtonAddToQuery s ->
254 | let oldMultiQuery = model.multiQuery
255 | newMultiQuery = { oldMultiQuery | selected = oldMultiQuery.selected ++ [s] }
256 | in ({ model |
257 | multiQueryContent = newMultiQuery.selected
258 | , multiQuery = newMultiQuery
259 | }, Cmd.none)
260 | SetTableState newState ->
261 | ({ model | tableState = newState }, Cmd.none)
262 | ClearFilter ->
263 | let oldMultiQuery = model.multiQuery
264 | newMultiQuery = { oldMultiQuery | selected = [ ] }
265 | in ({ model |
266 | multiQueryContent = [ ]
267 | , multiQuery = newMultiQuery
268 | }, Cmd.none)
269 | -- modal
270 | CloseModal ->
271 | ({ model | modalVisibility = Modal.hidden } , Cmd.none)
272 | ShowModal element ->
273 | ({ model | modalVisibility = Modal.shown, selectedElement = element } , Cmd.none)
274 | -- welcome
275 | CloseWelcome ->
276 | ({ model | welcomeVisibility = Modal.hidden }, getTeachingResources)
277 | -- error
278 | CloseError ->
279 | ({ model | errorVisibility = Modal.hidden }, Navigation.reload)
280 | ShowError e ->
281 | ({ model | errorVisibility = Modal.shown, errorMessage = e }, Cmd.none)
282 |
283 | getTeachingResources : Cmd Msg
284 | getTeachingResources =
285 | Http.get {
286 | url = "https://raw.githubusercontent.com/sslarch/MapofComputationalArchaeology/main/data/teachingmaterial.yml"
287 | , expect = Http.expectString DataReceived
288 | }
289 |
290 | updateMultiQuery : MultiQueryMsg String -> QueryModel -> ( QueryModel, Cmd (MultiQueryMsg String) )
291 | updateMultiQuery msg model =
292 | case msg of
293 | OnSelect maybeColor ->
294 | let
295 | selected =
296 | maybeColor
297 | |> Maybe.map (List.singleton >> List.append model.selected)
298 | |> Maybe.withDefault []
299 | in
300 | ( { model | selected = selected }, Cmd.none )
301 | OnRemoveItem colorToRemove ->
302 | let
303 | selected =
304 | List.filter (\curColor -> curColor /= colorToRemove)
305 | model.selected
306 | in
307 | ( { model | selected = selected }, Cmd.none )
308 | SelectMsg subMsg ->
309 | let
310 | ( updated, cmd ) =
311 | Select.update
312 | model.selectConfig
313 | subMsg
314 | model.selectState
315 | in
316 | ( { model | selectState = updated }, cmd )
317 | NoOp ->
318 | ( model, Cmd.none )
319 |
320 | updateCenter : CS.Point -> CS.Point -> CS.Point -> CS.Point
321 | updateCenter center prevOffset offset = {
322 | x = center.x + (prevOffset.x - offset.x)
323 | , y = center.y + (prevOffset.y - offset.y)
324 | }
325 |
326 | -- VIEW
327 |
328 | view : Bool -> Model -> Html Msg
329 | view devel
330 | { windowWidth,
331 | elements,
332 | tableState,
333 | multiQueryContent,
334 | multiQuery,
335 | center,
336 | dragging,
337 | percentage,
338 | hovering,
339 | closestPoint,
340 | modalVisibility,
341 | selectedElement,
342 | welcomeVisibility,
343 | errorVisibility,
344 | errorMessage
345 | } =
346 | let
347 | -- general helper functions and settings
348 | breakWindowWidth : Int
349 | breakWindowWidth = 500 --px
350 | findElementByCoordinates x y =
351 | List.head <| List.filter (\e -> e.x == x && e.y == y) elements
352 | findElementByID i =
353 | List.head <| List.filter (\e -> e.id == i) acceptableResources
354 |
355 | -- search/filter logic
356 | acceptableResources = case multiQueryContent of
357 | [ ] -> elements
358 | _ -> List.filter resourceFilter elements
359 |
360 | resourceFilter : TeachingResource -> Bool
361 | resourceFilter x =
362 | let toLow = String.toLower
363 | matchName = any (\v -> String.contains (toLow v) (toLow x.name)) multiQueryContent
364 | matchAuthor = any (\v -> String.contains (toLow v) (toLow <| String.join "" x.author)) multiQueryContent
365 | matchProg = any (\v -> member v multiQueryContent) x.programmingLanguage
366 | matchTag = any (\v -> member v multiQueryContent) x.tags
367 | in matchName || matchAuthor || matchProg || matchTag
368 |
369 | -- map
370 | mapPlot =
371 | C.chart
372 | -- general settings
373 | [ CA.height 300
374 | , CA.width 600
375 | , CA.range [ CA.zoom percentage, CA.centerAt center.x ]
376 | , CA.domain [ CA.zoom percentage, CA.centerAt center.y ]
377 | , CE.onClick OnMouseClick (CE.getWithin 20 CI.dots)
378 | , CE.onMouseDown OnMouseDown CE.getOffset
379 | , CE.on "mousemove" (CE.map3 OnMouseMove CE.getOffset CE.getCoords (CE.getWithin 20 CI.dots))
380 | , CE.on "mouseup" (CE.map2 OnMouseUp CE.getOffset CE.getCoords)
381 | , CE.onMouseLeave OnMouseLeave
382 | , CA.htmlAttrs
383 | [ HA.style "user-select" "none"
384 | , HA.style "cursor" <|
385 | case (filterClosestPointToRealEntries closestPoint) of
386 | [] -> case dragging of
387 | CouldStillBeClick _ -> "grabbing"
388 | ForSureDragging _ -> "grabbing"
389 | None -> "grab"
390 | _ -> "pointer"
391 | ]
392 | ]
393 | [
394 | -- comment to hide coordinate grid
395 | C.xLabels [ CA.withGrid, CA.amount 10, CA.ints, CA.fontSize 9 ]
396 | , C.yLabels [ CA.withGrid, CA.amount 10, CA.ints, CA.fontSize 9 ]
397 | , C.xTicks [ CA.withGrid, CA.amount 10, CA.ints ]
398 | , C.yTicks [ CA.withGrid, CA.amount 10, CA.ints ]
399 | -- zoom buttons in top right corner
400 | , C.htmlAt .max .max -5 -5
401 | [ HA.style "transform" "translateX(-100%)" ]
402 | [ span
403 | [ HA.style "margin-right" "5px" ]
404 | [ text (String.fromFloat percentage ++ "%") ]
405 | , Button.button
406 | [ Button.attrs [ HE.onClick OnZoomIn, Spacing.ml1 ]
407 | , Button.outlineSecondary
408 | , Button.small
409 | ]
410 | [ text "+" ]
411 | , Button.button
412 | [ Button.attrs [ HE.onClick OnZoomOut, Spacing.ml1 ]
413 | , Button.outlineSecondary
414 | , Button.small
415 | ]
416 | [ text "-" ]
417 | , Button.button
418 | [ Button.attrs [ HE.onClick OnZoomReset, Spacing.ml1 ]
419 | , Button.outlineSecondary
420 | , Button.small
421 | ]
422 | [ text "⨯" ]
423 | ]
424 | -- background map
425 | , C.svgAt (\_ -> 0) (\_ -> 100) 0 0 [ comparchmap [
426 | attribute "width" (String.fromFloat (600 * (percentage / 100)))
427 | , attribute "height" (String.fromFloat (300 * (percentage / 100)))
428 | , attribute "viewBox" ("0 0 2000 1000")
429 | --, attribute "opacity" "0.3" -- make transparent to set coordinates more easily
430 | ] ]
431 | -- invisible dummy data points at the four corners to make the plot scale correctly
432 | , C.series .x [
433 | C.scatter .y
434 | [ CA.opacity 0] ]
435 | (List.map2 makeDummyResource [0, 0, 200, 200] [0, 100, 100, 0])
436 | -- additional elements for each point
437 | , C.each (filterClosestPointToRealEntries closestPoint) <| \p item ->
438 | let curX = CI.getX item
439 | curY = CI.getY item
440 | curElem = findElementByCoordinates curX curY
441 | in [
442 | -- tooltip
443 | C.tooltip item [
444 | CA.offset 0
445 | , CA.background "#fcf9e9"
446 | ] [
447 | HA.style "opacity" "0.8"
448 | ] [
449 | case curElem of
450 | Nothing -> text ""
451 | Just x -> text (x.id ++ ": " ++ x.name)
452 | ]
453 | -- lines to source nodes
454 | , C.withPlane <| \_ ->
455 | case curElem of
456 | Nothing -> []
457 | Just x -> addLinesCurElement x
458 | ]
459 | -- actual data points
460 | , C.series .x [
461 | C.scatter .y
462 | [ CA.size 2
463 | , CA.diamond
464 | , CA.highlight 0.6
465 | , CA.highlightWidth 2
466 | , CA.highlightColor "#292929"
467 | ] |>
468 | C.named "Teaching resource" |>
469 | C.amongst closestPoint (\_ -> [ CA.size 12 ]) |>
470 | -- color by difficulty level
471 | C.variation (\i d -> [
472 | CA.color (case d.levelOfDifficulty of
473 | Beginner -> CA.green
474 | Intermediate -> CA.yellow
475 | Advanced -> CA.red)
476 | ])
477 | ] acceptableResources -- actual input data
478 | -- coord display below plot
479 | , case hovering of
480 | Just coords ->
481 | C.labelAt (CA.percent 96) (CA.percent 2) [CA.fontSize 7]
482 | [ S.text ("x: " ++ String.fromInt (round coords.x))
483 | , S.text (" y: " ++ String.fromInt (round coords.y))
484 | ]
485 | Nothing ->
486 | C.none
487 | ]
488 |
489 | -- plot helper functions
490 | addLinesCurElement : TeachingResource -> List (C.Element data msg)
491 | addLinesCurElement elem =
492 | let curSources = values <| map findElementByID elem.source
493 | in case curSources of
494 | [] -> []
495 | xs -> (map (makeOneLine elem) xs) ++ List.concatMap addLinesCurElement xs
496 |
497 | makeOneLine : TeachingResource -> TeachingResource -> C.Element data msg
498 | makeOneLine elem source =
499 | C.line [ CA.x1 elem.x
500 | , CA.x2 source.x
501 | , CA.y1 elem.y
502 | , CA.y2 source.y
503 | , CA.dashed [ 10, 5 ]
504 | , CA.width 2
505 | , CA.color "white"
506 | ]
507 |
508 | -- table
509 | idColumn : String -> (data -> String) -> Table.Column data Msg
510 | idColumn colName toString =
511 | Table.veryCustomColumn
512 | { name = colName
513 | , viewData = \data -> (\s -> Table.HtmlDetails [] [ span [
514 | style "display" "inline-block"
515 | , style "padding-right" "5px"
516 | , style "font-size" "12px"
517 | , style "font-style" "italic"
518 | , style "transform" "rotate(45deg)"
519 | ] [text s] ]) (toString data)
520 | , sorter = Table.increasingOrDecreasingBy toString
521 | }
522 |
523 | resourceColumn : String -> (data -> String) -> (data -> String) -> (data -> List String) -> Table.Column data Msg
524 | resourceColumn colName getYear getName getAuthors =
525 | Table.veryCustomColumn
526 | { name = colName
527 | , viewData = \data -> (\y n a -> Table.HtmlDetails [] [
528 | div [ style "display" "inline-block", style "padding-right" "5px", style "font-size" "16px" ] [
529 | span [
530 | style "font-weight" "bold"
531 | ] [ text n ],
532 | br [] [] ,
533 | text "by ",
534 | span [
535 | style "font-style" "italic"
536 | ] [ text a ],
537 | text ", ",
538 | span [
539 | style "font-style" "italic"
540 | , style "text-decoration" "underline"
541 | ] [ text y ]
542 | ]
543 | ]) (getYear data) (getName data) (renderAuthors <| getAuthors data)
544 | , sorter = Table.increasingOrDecreasingBy getYear
545 | }
546 |
547 | renderAuthors : List String -> String
548 | renderAuthors ss =
549 | let
550 | firstAuthor = List.head ss
551 | moreThanOneAuthor = List.length ss > 1
552 | in
553 | case firstAuthor of
554 | Nothing -> ""
555 | Just a -> if moreThanOneAuthor then (a ++ " et al.") else a
556 |
557 | viewProgrammingLanguage : List String -> Table.HtmlDetails Msg
558 | viewProgrammingLanguage ss = Table.HtmlDetails [] (map (makeButton "#80b3ffff") ss)
559 |
560 | viewTags : List String -> Table.HtmlDetails Msg
561 | viewTags ss = Table.HtmlDetails [] (map (makeButton "#bfb891ff") ss)
562 |
563 | makeButton : String -> String -> H.Html Msg
564 | makeButton color s = case s of
565 | "" -> H.div [] []
566 | _ -> Button.button
567 | [ Button.attrs [
568 | HE.onClick (ButtonAddToQuery s)
569 | , Spacing.ml1
570 | , style "background-color" color
571 | , style "color" "white"
572 | , style "display" "inline-block"
573 | , style "padding" "1px 4px"
574 | , style "text-align" "center"
575 | , style "border-radius" "5px"
576 | , style "margin" "2px"
577 | , style "font-size" "15px"
578 | ]
579 | , Button.outlineDark
580 | , Button.small
581 | ]
582 | [ text s ]
583 |
584 | stringListColumn : String -> (data -> List String) -> (List String -> Table.HtmlDetails Msg) -> Table.Column data Msg
585 | stringListColumn colName toStringList viewFunction =
586 | Table.veryCustomColumn
587 | { name = colName
588 | , viewData = \data -> viewFunction (toStringList data)
589 | , sorter = Table.unsortable
590 | }
591 |
592 | linkAndModalColumn : String -> (data -> String) -> (data -> String) -> Table.Column data Msg
593 | linkAndModalColumn colName getLink getID =
594 | Table.veryCustomColumn
595 | { name = colName
596 | , viewData = \data -> (\s -> Table.HtmlDetails [] [
597 | div [] [
598 | Button.linkButton [
599 | Button.small, Button.block, Button.outlineSecondary
600 | , Button.attrs [ href s, style "margin-bottom" "-5px", style "width" "40px" ]
601 | ] [ Icon.view Icon.link ]
602 | , Button.button [
603 | Button.small, Button.block, Button.outlineSecondary
604 | , Button.attrs [ HE.onClick <| ShowModal (findElementByID (getID data)), style "margin-bottom" "10px", style "width" "40px" ]
605 | ] [ Icon.view Icon.infoCircle ]
606 | ]
607 | ]) (getLink data)
608 | , sorter = Table.unsortable
609 | }
610 |
611 | tableConfig : Table.Config TeachingResource Msg
612 | tableConfig =
613 | Table.customConfig {
614 | toId = .id
615 | , toMsg = SetTableState
616 | , columns =
617 | if windowWidth < breakWindowWidth then [
618 | idColumn "ID" .id
619 | , resourceColumn "Material" .year .name .author
620 | , linkAndModalColumn "" .link .id
621 | ] else [
622 | idColumn "ID" .id
623 | , resourceColumn "Material" .year .name .author
624 | , stringListColumn "Language" .programmingLanguage viewProgrammingLanguage
625 | , stringListColumn "Tags" .tags viewTags
626 | , linkAndModalColumn "" .link .id
627 | ]
628 | , customizations = { defaultCustomizations | tableAttrs = [ style "width" "100%" ] }
629 | }
630 |
631 | -- modal
632 | oneRow name value =
633 | Grid.row [ ] [
634 | Grid.col [ Col.sm3 ]
635 | [ span [ style "font-weight" "bold" ] [ text name ] ]
636 | , Grid.col [ Col.sm9 ] [ text value ]
637 | ]
638 |
639 | detailsModal =
640 | case selectedElement of
641 | Nothing ->
642 | Modal.config CloseModal
643 | |> Modal.small
644 | |> Modal.hideOnBackdropClick True
645 | |> Modal.h3 [] [ text "Error - this should never happen" ]
646 | |> Modal.view modalVisibility
647 | Just x ->
648 | Modal.config CloseModal
649 | |> Modal.large
650 | |> Modal.hideOnBackdropClick True
651 | |> Modal.scrollableBody True
652 | |> Modal.h3 [] [ text x.id ]
653 | |> Modal.body [] [
654 | Grid.containerFluid [ ] [
655 | oneRow "Name: " x.name
656 | , oneRow "Author: " <| String.join ", " x.author
657 | , oneRow "Year: " x.year
658 | , oneRow "Topic: " x.topic
659 | , oneRow "Description: " x.description
660 | , oneRow "Language: " x.language
661 | , oneRow "Prog. language: " <| String.join ", " x.programmingLanguage
662 | , oneRow "Tools: " <| String.join ", " x.tools
663 | , oneRow "Level: " <| difficultyToString x.levelOfDifficulty
664 | , oneRow "Material type: " x.materialType
665 | , oneRow "Tags: " <| String.join ", " x.tags
666 | , oneRow "Tags OpenArchaeo: " <| String.join ", " x.tagsOpenArchaeo
667 | , oneRow "Link: " x.link
668 | , oneRow "Citation: " x.citation
669 | ]
670 | ]
671 | |> Modal.footer []
672 | [ Button.button
673 | [ Button.outlineSecondary
674 | , Button.attrs [ HE.onClick CloseModal ]
675 | ]
676 | [ text "Close" ]
677 | ]
678 | |> Modal.view modalVisibility
679 |
680 | -- welcome
681 | detailsWelcome =
682 | Modal.config CloseWelcome
683 | |> Modal.large
684 | |> Modal.hideOnBackdropClick True
685 | |> Modal.h4 [] [ text "The didactic map of computational archaeology" ]
686 | |> Modal.body [] [
687 | p [] [ text <| "Computational Archaeology is a wondrous field. "
688 | ++ "To make it a bit easier to explore and navigate, this webapp "
689 | ++ "presents an imaginary map with a collection of teaching material "
690 | ++ "introducing the different domains of computer applications in archaeology."
691 | ],
692 | p [] [ text <| "The interactive map on the top shows the various "
693 | ++ "subfields as landmasses of an imaginary world. "
694 | ++ "Each dot represents a teaching resource (e.g. a blogpost, "
695 | ++ "a video-tutorial or a textbook). The dot color indicates, "
696 | ++ "how advanced and challenging a given unit is:"
697 | ],
698 | p [] [ span [ style "color" "#71C614" ] [ text "Suitable for beginners" ],
699 | text " -> ",
700 | span [ style "color" "#FFCA00" ] [ text "Intermediate" ],
701 | text " -> ",
702 | span [ style "color" "#EF3159" ] [ text "Advanced" ]
703 | ],
704 | p [] [ text <| "You can hover or click on the dots to get more information. "
705 | ++ "Click ",
706 | span [ style "color" "#EF3159" ] [ text "Clear filters" ],
707 | text <| " to reset the list."
708 | ]
709 | ]
710 | |> Modal.footer [] [ span [ style "font-style" "italic" ] [
711 | text "Made by the "
712 | , a [ href "https://sslarch.github.io" ] [ text "SIG for Scripting languages in Archaeology" ]
713 | , text " - see the code on "
714 | , a [ href "https://github.com/sslarch/MapofComputationalArchaeology" ] [ text "GitHub" ]
715 | ] ]
716 | |> Modal.view welcomeVisibility
717 |
718 | -- error
719 | detailsError =
720 | Modal.config CloseError
721 | |> Modal.large
722 | |> Modal.hideOnBackdropClick False
723 | |> Modal.scrollableBody True
724 | |> Modal.h3 [] [ text "Error" ]
725 | |> Modal.body [] [
726 | p [] [ H.pre [] [text errorMessage] ],
727 | p [] [
728 | text "Please report this error on "
729 | , a [ href "https://github.com/sslarch/MapofComputationalArchaeology" ] [ text "GitHub" ]
730 | , text "."
731 | ]
732 | ]
733 | |> Modal.view errorVisibility
734 |
735 | in
736 | -- main layout
737 | div [] [
738 | Grid.container []
739 | ((if devel then [CDN.stylesheet] else []) ++ [ -- stylesheet for production is loaded in index.html
740 | Icon.css -- fontawesome
741 | , Grid.row [] [
742 | Grid.col [ ] [
743 | div [
744 | style "overflow" "hidden"
745 | , style "margin" "auto"
746 | , style "height" "100%"
747 | , style "width" "100%"
748 | ] [ mapPlot ]
749 | ]
750 | ]
751 | , Grid.row [] [
752 | Grid.col [ ] [
753 | br [] []
754 | , div [] [
755 | span [ style "font-size" "30px" ] [ text "The didactic map of computational archaeology" ]
756 | , span [ style "display" "inline-block", style "width" "20px" ] []
757 | , text " a project by the "
758 | , a [ href "https://sslarch.github.io" ] [ text "SIG SSLA" ]
759 | ]
760 | , Alert.simpleDark [] [
761 | Grid.container [] [
762 | Grid.row [ Row.centerMd ] (
763 | [
764 | Grid.col [] [
765 | div [ style "display" "inline-block", style "width" "100%" ] [
766 | Icon.view Icon.filter
767 | , text <| " Filter the list (" ++
768 | (String.fromInt <| List.length acceptableResources) ++
769 | "/" ++
770 | (String.fromInt <| List.length elements) ++
771 | ") "
772 | , Button.button [
773 | Button.attrs [ style "float" "right" ]
774 | , Button.small, Button.outlineDanger
775 | , Button.attrs [ HE.onClick ClearFilter ]
776 | ] [ Icon.view Icon.filterCircleXmark, text " Clear filters" ]
777 | ]
778 | ]
779 | , Grid.colBreak []
780 | , Grid.col []
781 | [ H.map SetMultiQuery (
782 | div [] [
783 | Select.view multiQuery.selectConfig
784 | multiQuery.selectState
785 | multiQuery.available
786 | multiQuery.selected
787 | ])
788 |
789 | ]
790 | ]
791 | )
792 | ]
793 | ]
794 | , Table.view tableConfig tableState acceptableResources
795 | ]
796 | ]
797 | ])
798 | , detailsModal, detailsWelcome, detailsError
799 | ]
800 |
801 | filterClosestPointToRealEntries : List (CI.One TeachingResource CI.Dot) -> List (CI.One TeachingResource CI.Dot)
802 | filterClosestPointToRealEntries x = (List.filter (\y -> (CI.getData y).id /= "") x)
803 |
804 | -- SUBSCRIPTIONS
805 |
806 | subscriptions : model -> Sub Msg
807 | subscriptions _ =
808 | E.onResize (\w h -> SetWindowWidth w)
809 |
--------------------------------------------------------------------------------
/data/teachingmaterial.yml:
--------------------------------------------------------------------------------
1 | - ID: SIG-T0001
2 | Source: ""
3 | X_map: 81
4 | Y_map: 50
5 | Name: 'Tidyverse for archaeologists'
6 | Author: 'Ben Marwick'
7 | Year: '2020'
8 | Topic: 'introduction to the tidyverse of R'
9 | Language: en
10 | Programming_language: Rstats
11 | Tools: RStudio
12 | Level_of_difficulty: beginner
13 | Description: 'Slide deck with an introduction to the tidyverse, example code and tasks.'
14 | Material_type: slides
15 | Tags: 'tidyverse, data import, data wrangling, visualisation, programming'
16 | Tags_openarchaeo: 'Educational resources and practical guides'
17 | Link: 'https://benmarwick.github.io/tidyverse-for-archaeology/tidyverse-for-archaeology.html#1'
18 | Citation: ""
19 | - ID: SIG-T0002
20 | Source: ""
21 | X_map: 79
22 | Y_map: 40
23 | Name: 'Skriptsammlung Statistik für die Archäologie'
24 | Author: 'Sophie Schmidt'
25 | Year: '2020'
26 | Topic: 'basic R introduction, plotting, statistical tests'
27 | Language: de
28 | Programming_language: RStats
29 | Tools: RStudio
30 | Level_of_difficulty: beginner
31 | Description: 'Scripts in md format including code and example tasks.'
32 | Material_type: tutorial
33 | Tags: 'data import, data wrangling, statistical tests, visualisation'
34 | Tags_openarchaeo: 'Educational resources and practical guides, Data management'
35 | Link: 'https://scschmidt.github.io/lehre/'
36 | Citation: ""
37 | - ID: SIG-T0003
38 | Source: ""
39 | X_map: 93
40 | Y_map: 70
41 | Name: 'The Open Digital Archaeology Textbook'
42 | Author: 'Shawn Graham, Neha Gupta, Jolene Smith, Andreas Angourakis, Andrew Reinhard, Kate Ellenberger, Zack Batist, Joel Rivard, Ben Marwick, Michael Carter, Beth Compton, Rob Blades, Cristina Wood, Gary Nobles'
43 | Year: '2018'
44 | Topic: 'introduction to various digital archaeology practices, including project management, database management, data cleaning, visualization, photogrammetry, 3D printing, NLP, among other things'
45 | Language: en
46 | Programming_language: RStats
47 | Tools: 'Open Refine, GitHub, Meshlab, Excel, Jupyter'
48 | Level_of_difficulty: beginner
49 | Description: 'An overview of various tools, methods and workflows commonly applied in digital archaeology, including practical examples demonstrated through well-documented jupyter notebooks.'
50 | Material_type: textbook
51 | Tags: 'data management, 3D methods, visualisation, spatial statistics, data wrangling, LOD'
52 | Tags_openarchaeo: ""
53 | Link: 'https://o-date.github.io/draft/book/'
54 | Citation: ""
55 | - ID: SIG-T0004
56 | Source: ""
57 | X_map: 171
58 | Y_map: 35
59 | Name: '3DHOP integration'
60 | Author: 'Thomas Huet'
61 | Year: '2021'
62 | Topic: Web3d
63 | Language: fr
64 | Programming_language: 'RStats, JavaScript, HTML5'
65 | Tools: 'RStudio, GitHub, 3DHOP, Blender, Meshlab, Meshroom'
66 | Level_of_difficulty: intermediate
67 | Description: 'A multi-paradigm approach (cartography, web3D, etc.) and multi-scalar presentation (macro, meso, micro) of portable tools and ancient iconography with open-source softwares (GitHub, 3DHOP, Blender, R, JavaScript, etc.) for data management within the frame of Linked-Open data (LOD).'
68 | Material_type: tutorial
69 | Tags: '3D methods, data management, archiving, LOD'
70 | Tags_openarchaeo: 'Educational resources and practical guides, 3D modelling, '
71 | Link: 'https://zoometh.github.io/reveal.js/#/5'
72 | Citation: ""
73 | - ID: SIG-T0005
74 | Source: ""
75 | X_map: 45
76 | Y_map: 75
77 | Name: 'Developing R Packages'
78 | Author: 'Sophie Schmidt, Petr Pajdla, Clemens Schmid'
79 | Year: '2021'
80 | Topic: 'R package development'
81 | Language: en
82 | Programming_language: RStats
83 | Tools: RStudio
84 | Level_of_difficulty: advanced
85 | Description: 'Slides and exercises introducing R package development for participants with some scripting experience.'
86 | Material_type: 'slides, exercises'
87 | Tags: 'programming, reproducibility'
88 | Tags_openarchaeo: ""
89 | Link: 'https://github.com/sslarch/caa2021_Rpackage_workshop/'
90 | Citation: ""
91 | - ID: SIG-T0006
92 | Source: ""
93 | X_map: 61
94 | Y_map: 51
95 | Name: Rchaeology.eu
96 | Author: 'Georg Roth'
97 | Year: 'until 2012'
98 | Topic: 'statistical analysis'
99 | Language: de
100 | Programming_language: RStats
101 | Tools: RStudio
102 | Level_of_difficulty: intermediate
103 | Description: 'A collection of blog posts about various quantitative data analysis applications relevant for archaeology.'
104 | Material_type: blog
105 | Tags: 'data analysis, clustering, visualisation'
106 | Tags_openarchaeo: ""
107 | Link: 'http://www.rchaeology.eu/'
108 | Citation: ""
109 | - ID: SIG-T0007
110 | Source: ""
111 | X_map: 46
112 | Y_map: 7
113 | Name: 'LaTeX for thesis writing'
114 | Author: 'Sarah Lang'
115 | Year: '2021'
116 | Topic: 'latex, writing'
117 | Language: en
118 | Programming_language: latex
119 | Tools: 'text editors, Zotero'
120 | Level_of_difficulty: intermediate
121 | Description: "Overview of Latex's capabilities that support thesis writing."
122 | Material_type: blog
123 | Tags: 'markup languages, writing'
124 | Tags_openarchaeo: ""
125 | Link: 'https://latex-ninja.com/2021/06/13/latex-for-thesis-writing/'
126 | Citation: ""
127 | - ID: SIG-T0008
128 | Source: ""
129 | X_map: 16
130 | Y_map: 13
131 | Name: 'LaTeX for Archaeologists: An archaeological catalogue using LaTeX'
132 | Author: 'Sarah Lang'
133 | Year: '2021'
134 | Topic: 'latex, layout, writing'
135 | Language: en
136 | Programming_language: latex
137 | Tools: 'text editors'
138 | Level_of_difficulty: intermediate
139 | Description: 'Guide to using latex to create efficient and good-looking archaeological catalogues.'
140 | Material_type: blog
141 | Tags: 'markup languages, writing'
142 | Tags_openarchaeo: ""
143 | Link: 'https://latex-ninja.com/2020/05/04/latex-for-archaeologists-an-archaeological-catalogue-using-latex/'
144 | Citation: ""
145 | - ID: SIG-T0009
146 | Source: ""
147 | X_map: 33
148 | Y_map: 15
149 | Name: 'Quick guide to scholarly writing in Markdown with Atom'
150 | Author: 'Ben Marwick'
151 | Year: '2019'
152 | Topic: 'writing, digital workflows'
153 | Language: en
154 | Programming_language: 'RStats, Markdown'
155 | Tools: 'RStudio, Atom, pandoc, Zotero, git'
156 | Level_of_difficulty: beginner
157 | Description: 'Guide to scholarly writing using plaintext.'
158 | Material_type: tutorial
159 | Tags: 'markup languages, writing'
160 | Tags_openarchaeo: ""
161 | Link: 'https://github.com/benmarwick/atom-for-scholarly-writing-with-markdown'
162 | Citation: ""
163 | - ID: SIG-T0010
164 | Source: ""
165 | X_map: 74
166 | Y_map: 70
167 | Name: 'Learning to program: Debugging – Where to start?'
168 | Author: 'Sarah Lang'
169 | Year: '2021'
170 | Topic: 'debugging software'
171 | Language: en
172 | Programming_language: 'LaTeX, RStats, Python'
173 | Tools: 'text editors'
174 | Level_of_difficulty: beginner
175 | Description: 'Guide to finding and solving errors in the code.'
176 | Material_type: blog
177 | Tags: 'programming, writing'
178 | Tags_openarchaeo: ""
179 | Link: 'https://latex-ninja.com/2021/05/30/learning-to-program-debugging-where-to-start/'
180 | Citation: ""
181 | - ID: SIG-T0011
182 | Source: ""
183 | X_map: 100
184 | Y_map: 37
185 | Name: 'How to maintain Twitter with little effort as an academic'
186 | Author: 'Sarah Lang'
187 | Year: '2021'
188 | Topic: 'twitter, academic communications'
189 | Language: en
190 | Programming_language: ""
191 | Tools: twitter
192 | Level_of_difficulty: beginner
193 | Description: 'Guide for effective professional and institutional use of twitter'
194 | Material_type: blog
195 | Tags: 'social media, engagement'
196 | Tags_openarchaeo: ""
197 | Link: 'https://latex-ninja.com/2021/11/16/how-to-maintain-twitter-with-little-effort-as-an-academic-the-ninjas-how-to-better-promote-your-content-on-twitter-guide-part-5/'
198 | Citation: ""
199 | - ID: SIG-T0012
200 | Source: ""
201 | X_map: 45
202 | Y_map: 24
203 | Name: 'Digitizing journal articles and grey literature reports'
204 | Author: ADS
205 | Year: ongoing
206 | Topic: 'digital curation, archiving and preservation'
207 | Language: en
208 | Programming_language: ""
209 | Tools: ""
210 | Level_of_difficulty: beginner
211 | Description: 'Explains how to digitise journal articles or grey literature reports with a view to their long term sustainability'
212 | Material_type: tutorial
213 | Tags: 'digitalization, archiving, writing'
214 | Tags_openarchaeo: ""
215 | Link: 'https://archaeologydataservice.ac.uk/advice/scanningGuide.xhtml'
216 | Citation: ""
217 | - ID: SIG-T0013
218 | Source: ""
219 | X_map: 24
220 | Y_map: 25
221 | Name: 'Guides to Good Practice'
222 | Author: ADS
223 | Year: ongoing
224 | Topic: 'digital curation, archiving and preservation'
225 | Language: en
226 | Programming_language: ""
227 | Tools: ""
228 | Level_of_difficulty: beginner
229 | Description: 'Series of guides to various digital curation and preservation practices'
230 | Material_type: tutorial
231 | Tags: 'writing, archiving, project management, data management, archiving'
232 | Tags_openarchaeo: ""
233 | Link: 'https://guides.archaeologydataservice.ac.uk/g2gpwiki/'
234 | Citation: ""
235 | - ID: SIG-T0014
236 | Source: ""
237 | X_map: 67
238 | Y_map: 14
239 | Name: 'OntoMatchGame (formerly CIDOC-CRM Game)'
240 | Author: 'Guillem Anais'
241 | Year: '2024'
242 | Topic: 'ontology learning game'
243 | Language: en
244 | Programming_language: ""
245 | Tools: ""
246 | Level_of_difficulty: beginner
247 | Description: 'A fun way to visualize and play with ontology in relation to real world documentation scenarios. Available as both a physical tabletop card game, and in a rich virtual format too.'
248 | Material_type: game
249 | Tags: 'CIDOC CRM, ontology, archiving'
250 | Tags_openarchaeo: ""
251 | Link: 'https://ontomatchgame.huma-num.fr/'
252 | Citation: 'https://cidoc-crm.org/Resources/onto-match-game'
253 | - ID: SIG-T0015
254 | Source: ""
255 | X_map: 40
256 | Y_map: 43
257 | Name: 'Processing Radiocarbon Data with R'
258 | Author: 'Clemens Schmid, Martin Hinz'
259 | Year: '2018'
260 | Topic: 'radiocarbon data'
261 | Language: en
262 | Programming_language: RStats
263 | Tools: RStudio
264 | Level_of_difficulty: intermediate
265 | Description: 'Instructional resources for processing radiocarbon data'
266 | Material_type: tutorial
267 | Tags: 'C14, bayes, calibration, dating'
268 | Tags_openarchaeo: ""
269 | Link: 'https://github.com/ISAAKiel/r_tutorial_caa_2018'
270 | Citation: ""
271 | - ID: SIG-T0016
272 | Source: ""
273 | X_map: 73
274 | Y_map: 34
275 | Name: 'Analyse und Visualisierung archäologischer Daten mit R'
276 | Author: 'Dirk Seidensticker, Clemens Schmid'
277 | Year: '2016'
278 | Topic: visualisation
279 | Language: de
280 | Programming_language: RStats
281 | Tools: RStudio
282 | Level_of_difficulty: beginner
283 | Description: 'Instructional resources for data visualization'
284 | Material_type: tutorial
285 | Tags: 'data wrangling, visualisation'
286 | Tags_openarchaeo: ""
287 | Link: 'https://github.com/ISAAKiel/R-Tutorial_CAA2016'
288 | Citation: ""
289 | - ID: SIG-T0017
290 | Source: ""
291 | X_map: 85
292 | Y_map: 82
293 | Name: 'Mosaic Summer School 2016'
294 | Author: 'Franziska Faupel, Daniel Knitter'
295 | Year: '2016'
296 | Topic: 'spatial statistics'
297 | Language: en
298 | Programming_language: RStats
299 | Tools: RStudio
300 | Level_of_difficulty: intermediate
301 | Description: 'Reconstructing and modeling spheres of interaction.'
302 | Material_type: workshop
303 | Tags: 'data wrangling, spatial statistics, network analysis, point pattern analysis, R as GIS'
304 | Tags_openarchaeo: ""
305 | Link: 'https://github.com/ISAAKiel/Mosaic'
306 | Citation: ""
307 | - ID: SIG-T0018
308 | Source: ""
309 | X_map: 72
310 | Y_map: 45
311 | Name: 'Statistical Methods for Archaeological Data Analysis (Hinz)'
312 | Author: 'Martin Hinz'
313 | Year: '2021'
314 | Topic: 'basic statistics'
315 | Language: en
316 | Programming_language: RStats
317 | Tools: RStudio
318 | Level_of_difficulty: beginner
319 | Description: 'Course, intro into R, Descriptive stats, NHST, Explorative statistics.'
320 | Material_type: textbook
321 | Tags: 'basic statistics, data import, data wrangling, NHST, visualisation'
322 | Tags_openarchaeo: ""
323 | Link: 'https://martinhinz.github.io/smada2021'
324 | Citation: ""
325 | - ID: SIG-T0019
326 | Source: ""
327 | X_map: 80
328 | Y_map: 90
329 | Name: 'Predictive Mapping in R'
330 | Author: 'Martin Hinz'
331 | Year: '2019'
332 | Topic: 'predictive mapping'
333 | Language: en
334 | Programming_language: RStats
335 | Tools: RStudio
336 | Level_of_difficulty: intermediate
337 | Description: 'Tutorial Workshop given at the International Colloquium on Digital Archaeology in Bern.'
338 | Material_type: 'slides, workshop'
339 | Tags: 'spatial statistics, R as GIS'
340 | Tags_openarchaeo: ""
341 | Link: 'https://martinhinz.github.io/pred_map_tut'
342 | Citation: ""
343 | - ID: SIG-T0020
344 | Source: ""
345 | X_map: 57
346 | Y_map: 33
347 | Name: 'Video tutorials about R for archaeologists'
348 | Author: 'Martin Hinz'
349 | Year: '2012-2019'
350 | Topic: 'basic statistics'
351 | Language: 'en, de'
352 | Programming_language: RStats
353 | Tools: RStudio
354 | Level_of_difficulty: beginner
355 | Description: 'Collected works from different courses.'
356 | Material_type: 'videos, workshop'
357 | Tags: 'basic statistics, data import, data wrangling, visualisation'
358 | Tags_openarchaeo: ""
359 | Link: 'http://vitutr.archaeological.science/'
360 | Citation: ""
361 | - ID: SIG-T0021
362 | Source: ""
363 | X_map: 64
364 | Y_map: 54
365 | Name: 'How To Do Archaeological Science Using R'
366 | Author: 'Ben Marwick'
367 | Year: '2017'
368 | Topic: 'statistical analysis, agent-based modelling, radiocarbon analysis, geospatial analysis'
369 | Language: en
370 | Programming_language: RStats
371 | Tools: RStudio
372 | Level_of_difficulty: intermediate
373 | Description: 'This website is a early draft of an edited volume of contributions to the ‘How To Do Archaeological Science Using R’ forum.'
374 | Material_type: textbook
375 | Tags: 'spatial statistics, ABM, C14, Bayes, R as GIS, predictive modelling'
376 | Tags_openarchaeo: ""
377 | Link: 'https://benmarwick.github.io/How-To-Do-Archaeological-Science-Using-R/'
378 | Citation: ""
379 | - ID: SIG-T0022
380 | Source: ""
381 | X_map: 60
382 | Y_map: 85
383 | Name: 'Tutorial on Classification in Archaeology: Distance Matrices, Clustering Methods and Validation'
384 | Author: 'Sophie Schmidt, Sarah Martini, Robert Staniuk, Carole Quatrelive, Martin Hinz, Oliver Nakoinz, Michael Bilger, Romy Plath, Georg Roth, Julian Laabs'
385 | Year: '2022'
386 | Topic: 'classification and clustering methods'
387 | Language: en
388 | Programming_language: RStats
389 | Tools: RStudio
390 | Level_of_difficulty: intermediate
391 | Description: 'The tutorial offers an introduction into classification in general, distance measures for data on all levels of measurement, hierarchical clustering with different linking methods, k-means clustering, hdbscan clustering and the silhouette validation method. All examples are developed using real life archaeological data from the archdata package. The tutorial aims at archaeologists familiar with the scripting language R, but can be also gainfully read by those who wish to apply the methods in another software.'
392 | Material_type: textbook
393 | Tags: 'clustering, data import, data wrangling, multivariate statistics'
394 | Tags_openarchaeo: ""
395 | Link: 'https://doi.org/10.5281/zenodo.6325372'
396 | Citation: 'Schmidt, Sophie C., Martini, Sarah, Staniuk, Robert, Quatrelivre, Carole, Hinz, Martin, Nakoinz, Oliver, Bilger, Michael, Roth, Georg, & Laabs, Julian. (2022, March 3). Tutorial on Classification in Archaeology: Distance Matrices, Clustering Methods and Validation. Zenodo. https://doi.org/10.5281/zenodo.6325372'
397 | - ID: SIG-T0023
398 | Source: ""
399 | X_map: 119
400 | Y_map: 68
401 | Name: 'Computational Population Genetics'
402 | Author: 'Stephan Schiffels'
403 | Year: '2019'
404 | Topic: 'basic population genetic analysis'
405 | Language: en
406 | Programming_language: 'bash, Python, RStats'
407 | Tools: 'Jupyter Notebooks'
408 | Level_of_difficulty: intermediate
409 | Description: 'This repository contains several Jupyter Notebooks that I have used in the past for teaching various elements of population-genetic data analyses to students with no initial training in population genetics or Unix-based data analysis.'
410 | Material_type: workshop
411 | Tags: 'multivariate statistics, data analysis'
412 | Tags_openarchaeo: ""
413 | Link: 'https://github.com/Schiffels-Popgen/popgen_course'
414 | Citation: ""
415 | - ID: SIG-T0024
416 | Source: ""
417 | X_map: 114
418 | Y_map: 61
419 | Name: '2019 Workshop on Computational Population Genetics'
420 | Author: 'Stephan Schiffels, Choongwon Jeong, Benjamin Peter'
421 | Year: '2019'
422 | Topic: 'basic and more advanced population genetics and archaeogenetics'
423 | Language: en
424 | Programming_language: 'bash, Python'
425 | Tools: 'Jupyter Notebooks'
426 | Level_of_difficulty: advanced
427 | Description: 'An introduction to some of the most important archaeogenetic data/software/methods at the time'
428 | Material_type: workshop
429 | Tags: 'multivariate statistics, data analysis'
430 | Tags_openarchaeo: ""
431 | Link: 'https://comppopgenworkshop2019.readthedocs.io/en/latest/'
432 | Citation: ""
433 | - ID: SIG-T0025
434 | Source: ""
435 | X_map: 134
436 | Y_map: 72
437 | Name: 'A Step-by-Step Guide for Using Agent-Based Modeling in Archaeological Research'
438 | Author: 'Iza Romanowska, Stefani Crabtree, Kathryn Harris, Benjamin Davies'
439 | Year: '2019'
440 | Topic: 'introduction to agent-based modeling with tutorials published as a special section in Advances in Archaeological Practice'
441 | Language: en
442 | Programming_language: NetLogo
443 | Tools: ""
444 | Level_of_difficulty: beginner
445 | Description: 'Tutorials on how to build simple agent-based models for archaeology published as a special section in Advances in Archaeological Practice. Link leads to open preprint.'
446 | Material_type: article
447 | Tags: ABM
448 | Tags_openarchaeo: ""
449 | Link: 'https://www.researchgate.net/publication/333300954_Agent-Based_Modeling_for_Archaeologists_Part_1_of_3 '
450 | Citation: 'Advances in Archaeological Practice , Volume 7 , Issue 2 , May 2019 , pp. 178 – 184. DOI: https://doi.org/10.1017/aap.2019.6'
451 | - ID: SIG-T0026
452 | Source: ""
453 | X_map: 145
454 | Y_map: 87
455 | Name: 'Agent-Based Modeling for Archaeology – Simulating the Complexity of Societies'
456 | Author: 'Iza Romanowska, Colin Wren, Stefani Crabtree'
457 | Year: '2021'
458 | Topic: 'introductory textbook on agent-based modeling'
459 | Language: en
460 | Programming_language: NetLogo
461 | Tools: NetLogo
462 | Level_of_difficulty: intermediate
463 | Description: 'open-access textbook for agent-based modeling in archaeology with lots of tutorials and code examples'
464 | Material_type: textbook
465 | Tags: ABM
466 | Tags_openarchaeo: ""
467 | Link: 'https://santafeinstitute.github.io/ABMA/'
468 | Citation: ""
469 | - ID: SIG-T0027
470 | Source: ""
471 | X_map: 70
472 | Y_map: 51
473 | Name: 'Analyzing archaeological data in R (stat4arch)'
474 | Author: 'Petr Pajdla, Peter Tkáč'
475 | Year: '2020-2022'
476 | Topic: 'slides, syllabus etc. for an uni course on introductory R in archaeology'
477 | Language: 'en, cz, sk'
478 | Programming_language: RStats
479 | Tools: RStudio
480 | Level_of_difficulty: beginner
481 | Description: 'Slides and syllabus for a uni course on R and more. Aiminng at promoting good practice regarding data management and reproducible workflows among the students.'
482 | Material_type: slides
483 | Tags: 'basic statistics, reproducibility, data management'
484 | Tags_openarchaeo: ""
485 | Link: 'https://petrpajdla.github.io/stat4arch/'
486 | Citation: ""
487 | - ID: SIG-T0028
488 | Source: ""
489 | X_map: 65
490 | Y_map: 30
491 | Name: 'CRAN Task View: Archaeological Science'
492 | Author: 'Ben Marwick'
493 | Year: ongoing
494 | Topic: 'comprehensive list of R packages used in archaeology and list of articles, preferably with code and data included'
495 | Language: en
496 | Programming_language: RStats
497 | Tools: ""
498 | Level_of_difficulty: intermediate
499 | Description: 'Includes list of R packages, articles and short introductory how-to guide for beginners.'
500 | Material_type: 'resource list'
501 | Tags: 'reproducibility, data management'
502 | Tags_openarchaeo: ""
503 | Link: 'https://github.com/benmarwick/ctv-archaeology'
504 | Citation: ""
505 | - ID: SIG-T0029
506 | Source: ""
507 | X_map: 35
508 | Y_map: 31
509 | Name: 'Data organization in spreadsheets'
510 | Author: 'Karl Broman'
511 | Year: '2017'
512 | Topic: 'guide on how to organize your data in spreadsheets'
513 | Language: en
514 | Programming_language: ""
515 | Tools: spreadsheets
516 | Level_of_difficulty: beginner
517 | Description: 'Guide with very basic information on how to organize data.'
518 | Material_type: article
519 | Tags: 'data management, archiving, spreadsheets'
520 | Tags_openarchaeo: ""
521 | Link: 'https://kbroman.org/dataorg/'
522 | Citation: 'https://doi.org/10.1080/00031305.2017.1375989'
523 | - ID: SIG-T0030
524 | Source: ""
525 | X_map: 180
526 | Y_map: 47
527 | Name: 'PyQGIS 101'
528 | Author: 'Anita Graser'
529 | Year: '2018'
530 | Topic: 'PyQGIS introduction'
531 | Language: en
532 | Programming_language: Python
533 | Tools: QGIS
534 | Level_of_difficulty: beginner
535 | Description: 'This tutorial aims to help GIS users to get started with Python programming for QGIS 3. In contrast to many tutorials out there, the idea is to not assume any previous programming knowledge.'
536 | Material_type: tutorial
537 | Tags: GIS
538 | Tags_openarchaeo: ""
539 | Link: 'https://anitagraser.com/pyqgis-101-introduction-to-qgis-python-programming-for-non-programmers/'
540 | Citation: ""
541 | - ID: SIG-T0031
542 | Source: ""
543 | X_map: 52
544 | Y_map: 28
545 | Name: 'Cow-culating your data with spreadsheets and R'
546 | Author: 'Paulina F. Przystupa, L. Meghan Dennis'
547 | Year: '2022'
548 | Topic: 'basic data visualization using spreadsheets and R, how to explore bias in data, and creative ways to present data'
549 | Language: en
550 | Programming_language: RStats
551 | Tools: 'spreadsheets, text editor'
552 | Level_of_difficulty: beginner
553 | Description: 'Tutorial about fundamental data processing and analysis practices'
554 | Material_type: tutorial
555 | Tags: 'data literacy, data stories, open data, public engagement, teaching '
556 | Tags_openarchaeo: ""
557 | Link: 'https://doi.org/10.6078/M7ZW1J2X'
558 | Citation: 'Przystupa, Paulina F. and L. Meghan Dennis 2022 Cow-culating your data with spreadsheets and R. The Alexandria Archive Institute. DOI: https://doi.org/10.6078/M73N21HR'
559 | - ID: SIG-T0032
560 | Source: ""
561 | X_map: 42
562 | Y_map: 16
563 | Name: 'Gabbing about Gabii: Going from Notes to Data to Narrative'
564 | Author: 'L. Meghan Dennis, Paulina F. Przystupa'
565 | Year: '2022'
566 | Topic: 'turning site forms into usable and filterable tables; how to turn those data into narratives using different narrative lenses'
567 | Language: en
568 | Programming_language: ""
569 | Tools: 'spreadsheets, text editor'
570 | Level_of_difficulty: beginner
571 | Description: 'Tutorial about digitizing and processing data from paper records'
572 | Material_type: tutorial
573 | Tags: 'data literacy, data stories, digital collections, narrative, open data, teaching'
574 | Tags_openarchaeo: ""
575 | Link: 'https://doi.org/10.6078/M76D5R3Q'
576 | Citation: 'Dennis, L. Meghan and Paulina F. Przystupa 2022 Gabbing about Gabii: Going from Notes to Data to Narrative. The Alexandria Archive Institute. DOI: https://doi.org/10.6078/M7B27SF5'
577 | - ID: SIG-T0033
578 | Source: ""
579 | X_map: 151
580 | Y_map: 92
581 | Name: 'RGBCatastrophe: A Netlogo tool for teaching, learning, and thinking about complexity'
582 | Author: 'Andre Costopoulos'
583 | Year: '2022'
584 | Topic: ""
585 | Language: en
586 | Programming_language: NetLogo
587 | Tools: NetLogo
588 | Level_of_difficulty: beginner
589 | Description: 'Helps students understand the basic insight that a single kind of cause can have a broad range of impacts, depending on the context in which it happens, and the related insight that simple interactions between a few elements can generate complex and unpredictable behaviour. It can help us understand how system state relates to consequences and how rapid and sudden change can take place.'
590 | Material_type: demonstration
591 | Tags: 'agent-based modelling, complexity'
592 | Tags_openarchaeo: ""
593 | Link: 'https://archeothoughts.wordpress.com/2022/05/30/rgbcatastrophe-a-netlogo-tool-for-teaching-learning-and-thinking-about-complexity/'
594 | Citation: ""
595 | - ID: SIG-T0034
596 | Source: SIG-T0038
597 | X_map: 75
598 | Y_map: 55
599 | Name: 'Introduction to R and the Tidyverse'
600 | Author: 'Clemens Schmid'
601 | Year: '2023'
602 | Topic: 'data analysis with R and the tidyverse'
603 | Language: en
604 | Programming_language: RStats
605 | Tools: RStudio
606 | Level_of_difficulty: beginner
607 | Description: 'A book chapter to follow along and learn about basic data analysis with R and the tidyverse.'
608 | Material_type: tutorial
609 | Tags: 'tidyverse, data import, data wrangling, visualisation, programming'
610 | Tags_openarchaeo: ""
611 | Link: 'https://www.spaam-community.org/intro-to-ancient-metagenomics-book/r-tidyverse.html'
612 | Citation: ""
613 | - ID: SIG-T0035
614 | Source: ""
615 | X_map: 177
616 | Y_map: 60
617 | Name: 'GIS in Archaeology'
618 | Author: 'Joe Roe'
619 | Year: '2022'
620 | Topic: 'introduction to use of Geographic Information Systems (GIS) software in archaeology, including basic skills in cartography, geospatial data management, and spatial analysis.'
621 | Language: en
622 | Programming_language: ""
623 | Tools: QGIS
624 | Level_of_difficulty: beginner
625 | Description: 'Online textbook for a course taught at the University of Bern. The course is designed to be delivered in in-person labs, but can probably be worked through independently as well.'
626 | Material_type: textbook
627 | Tags: 'gis, spatial analysis'
628 | Tags_openarchaeo: ""
629 | Link: 'https://gia.joeroe.io'
630 | Citation: ""
631 | - ID: SIG-T0036
632 | Source: ""
633 | X_map: 78
634 | Y_map: 45
635 | Name: 'Statistical Methods for Archaeological Data Analysis (Roe)'
636 | Author: 'Joe Roe'
637 | Year: '2023'
638 | Topic: 'introduction to statistical analysis in archaeology using R.'
639 | Language: en
640 | Programming_language: RStats
641 | Tools: ""
642 | Level_of_difficulty: beginner
643 | Description: 'Online textbook for a course taught at the University of Bern. The course is designed to be delivered in in-person labs, but can probably be worked through independently as well.'
644 | Material_type: textbook
645 | Tags: 'basic statistics, exploratory data analysis, tidyverse, data wrangling, visualisation, programming'
646 | Tags_openarchaeo: ""
647 | Link: 'https://smada.joeroe.io'
648 | Citation: ""
649 | - ID: SIG-T0037
650 | Source: ""
651 | X_map: 90
652 | Y_map: 90
653 | Name: 'Online Companion to Network Science in Archaeology'
654 | Author: 'Matthew A. Peeples, Tom Brughmans'
655 | Year: '2023'
656 | Topic: 'a series of tutorials that outline methods for managing, analyzing, and visualizing network data, primarily using the R programming language'
657 | Language: en
658 | Programming_language: RStats
659 | Tools: RStudio
660 | Level_of_difficulty: beginner
661 | Description: 'The tutorials are designed to complement the text of the associated book (Brughmans and Peeples 2023) but can also stand alone as a guide to implementation of network analyses in R if you have a basic background in network methods and terminology. Although each section of this guide builds upon the previous sections in terms of network concepts and R methods, the sections are each independent in terms of data, examples, and code and can be run out of order if you choose.'
662 | Material_type: tutorial
663 | Tags: 'data wrangling, network analysis, multivariate statistics, spatial statistics'
664 | Tags_openarchaeo: ""
665 | Link: 'https://archnetworks.net/'
666 | Citation: 'Peeples, Matthew A. and Tom Brughmans (2023). Online Companion to Network Science in Archaeology. https://archnetworks.net, Accessed 2023-03-21.'
667 | - ID: SIG-T0038
668 | Source: ""
669 | X_map: 119
670 | Y_map: 58
671 | Name: 'Introduction to Ancient Metagenomics'
672 | Author: 'James A. Fellows Yates, Christina Warinner, Alina Hiß, Arthur Kocher, Clemens Schmid, Irina Velsko, Maxime Borry, Megan Michel, Nikolay Oskolkov, Sebastian Duchene, Thiseas Lamnidis, Aida Andrades Valtueña, Alexander Herbig, Alexander Hübner, Kevin Nota, Robin Warner, Meriam Guellil'
673 | Year: '2023'
674 | Topic: 'introduction to various computational analysis in the field of ancient metagenomics'
675 | Language: en
676 | Programming_language: 'bash, RStats, Python'
677 | Tools: ""
678 | Level_of_difficulty: intermediate
679 | Description: 'This book introduces the main steps of ancient metagenomic bioinformatic workflows, familiarising students with the command line, demonstrating how to process next-generation-sequencing (NGS) data, and showing how to perform de novo metagenomic assembly.'
680 | Material_type: textbook
681 | Tags: 'data analysis, pipelines'
682 | Tags_openarchaeo: ""
683 | Link: 'https://github.com/SPAAM-community/intro-to-ancient-metagenomics-book'
684 | Citation: 'James A. Fellows Yates, Christina Warinner, Alina Hiß, Arthur Kocher, Clemens Schmid, Irina Velsko, Maxime Borry, Megan Michel, Nikolay Oskolkov, Sebastian Duchene, Thiseas Lamnidis, Aida Andrades Valtueña, Alexander Herbig, Alexander Hübner, Kevin Nota, Robin Warner, Meriam Guellil. (2023). Introduction to Ancient Metagenomics (Edition 2023). Zenodo. DOI: 10.5281/zenodo.8027281'
685 | - ID: SIG-T0039
686 | Source: SIG-T0038
687 | X_map: 97
688 | Y_map: 75
689 | Name: 'Introduction to the Command Line'
690 | Author: 'Thiseas C. Lamnidis, Aida Andrades Valtueña '
691 | Year: '2023'
692 | Topic: 'working on the linux command line'
693 | Language: en
694 | Programming_language: bash
695 | Tools: ""
696 | Level_of_difficulty: beginner
697 | Description: 'A book chapter explaining how to navigate, run commands and program in the bash shell.'
698 | Material_type: tutorial
699 | Tags: programming
700 | Tags_openarchaeo: ""
701 | Link: 'https://www.spaam-community.org/intro-to-ancient-metagenomics-book/bare-bones-bash.html'
702 | Citation: ""
703 | - ID: SIG-T0041
704 | Source: SIG-T0038
705 | X_map: 156
706 | Y_map: 87
707 | Name: 'Introduction to Python and Pandas'
708 | Author: 'Robin Warner, Kevin Nota, Maxime Borry '
709 | Year: '2023'
710 | Topic: 'data analysis with python and pandas'
711 | Language: en
712 | Programming_language: Python
713 | Tools: 'Jupyter Notebooks'
714 | Level_of_difficulty: beginner
715 | Description: 'A book chapter introducing data analysis with Python using the Pandas library.'
716 | Material_type: tutorial
717 | Tags: 'data import, data wrangling, visualisation, programming'
718 | Tags_openarchaeo: ""
719 | Link: 'https://www.spaam-community.org/intro-to-ancient-metagenomics-book/python-pandas.html'
720 | Citation: ""
721 | - ID: SIG-T0042
722 | Source: SIG-T0038
723 | X_map: 90
724 | Y_map: 31
725 | Name: 'Introduction to Git(Hub)'
726 | Author: 'Megan Michel, James Fellows Yates '
727 | Year: '2023'
728 | Topic: 'version control with Git and collaborative work on GitHub'
729 | Language: en
730 | Programming_language: ""
731 | Tools: 'Git, GitHub'
732 | Level_of_difficulty: beginner
733 | Description: 'A book chapter to explain Git and GitHub with practical advice on how to set it up.'
734 | Material_type: tutorial
735 | Tags: 'data management, programming'
736 | Tags_openarchaeo: ""
737 | Link: 'https://www.spaam-community.org/intro-to-ancient-metagenomics-book/git-github.html'
738 | Citation: ""
739 | - ID: SIG-T0043
740 | Source: ""
741 | X_map: 50
742 | Y_map: 35
743 | Name: 'Data Analysis and Visualization in R for Archaologists'
744 | Author: 'Alison Clarke, François Michonneau, Auriel Fournier'
745 | Year: '2023'
746 | Topic: 'basic R introduction, data analysis, data visualization'
747 | Language: en
748 | Programming_language: Rstats
749 | Tools: RStudio
750 | Level_of_difficulty: beginner
751 | Description: 'basic concepts, skills, and tools for working with data so that they can get more done in less time, and with less pain. These lessons were designed for those interested in working with archaeology data in R.'
752 | Material_type: tutorial
753 | Tags: 'data wrangling, visualisation, tidyverse'
754 | Tags_openarchaeo: 'Educational resources and practical guides'
755 | Link: 'https://carpentries-incubator.github.io/R-archaeology-lesson/'
756 | Citation: ""
757 | - ID: SIG-T0044
758 | Source: ""
759 | X_map: 169
760 | Y_map: 63
761 | Name: 'Tutorial for the archeoViz application (R package)'
762 | Author: 'Sébastien Plutniak'
763 | Year: '2023'
764 | Topic: 'data analysis, data visualization'
765 | Language: en
766 | Programming_language: ""
767 | Tools: archeoViz
768 | Level_of_difficulty: beginner
769 | Description: 'An introduction to the archeoViz application / R package for statistical and visual exploration of spatial data in archaeology.'
770 | Material_type: tutorial
771 | Tags: 'open data, visualisation, basic statistics, spatial analysis'
772 | Tags_openarchaeo: ""
773 | Link: 'https://archeoviz.hypotheses.org/1043'
774 | Citation: 'Sébastien Plutniak. 2023. Tutorial for the archeoViz application (R package). archeoViz. Data visualization in archaeology. DOI: https://doi.org/10.58079/bd8'
775 | - ID: SIG-T0045
776 | Source: ""
777 | X_map: 29
778 | Y_map: 33
779 | Name: 'Introduction to file formats and archeological data preparation, using the archeoViz application'
780 | Author: 'Sébastien Plutniak'
781 | Year: '2023'
782 | Topic: 'tabular file formats and archeological data preparation'
783 | Language: en
784 | Programming_language: ""
785 | Tools: archeoViz
786 | Level_of_difficulty: beginner
787 | Description: 'An introduction to file formats and archeological data preparation using the archeoViz application.'
788 | Material_type: tutorial
789 | Tags: 'data literacy, data management, spreadsheets, teaching'
790 | Tags_openarchaeo: ""
791 | Link: 'https://archeoviz.hypotheses.org/129'
792 | Citation: 'Sébastien Plutniak. 2023. Introduction to File Formats and Archeological Data Preparation, using the archeoViz Application. archeoViz. Data visualization in archaeology. DOI: https://doi.org/10.58079/bd7i'
793 | - ID: SIG-T0046
794 | Source: ""
795 | X_map: 54
796 | Y_map: 22
797 | Name: 'Introduction to archaeological data curation, description, and edition, using the archeoViz application'
798 | Author: 'Sébastien Plutniak'
799 | Year: '2023'
800 | Topic: 'archaeological data curation, description, and edition'
801 | Language: en
802 | Programming_language: ""
803 | Tools: archeoViz
804 | Level_of_difficulty: intermediate
805 | Description: 'An introduction to archaeological data curation, description, and edition, using the archeoViz application.'
806 | Material_type: tutorial
807 | Tags: 'open data, data management, basic statistics, teaching'
808 | Tags_openarchaeo: ""
809 | Link: 'https://archeoviz.hypotheses.org/158'
810 | Citation: 'Sébastien Plutniak. 2023. Introduction to Archaeological Data Curation, Description, and Edition, using the archeoViz Application. archeoViz. Data visualization in archaeology. DOI: https://doi.org/10.58079/bd7j'
811 | - ID: SIG-T0047
812 | Source: ""
813 | X_map: 68
814 | Y_map: 62
815 | Name: 'Introduction to the R programming language and reproducible science, using the archeoViz application'
816 | Author: 'Sébastien Plutniak'
817 | Year: '2023'
818 | Topic: 'R programming language, reproducible science'
819 | Language: en
820 | Programming_language: Rstats
821 | Tools: Rstudio
822 | Level_of_difficulty: intermediate
823 | Description: 'An introduction to the R programming language and the concepts of reproducible science, using the archeoViz application.'
824 | Material_type: tutorial
825 | Tags: 'programming, reproducibility, teaching'
826 | Tags_openarchaeo: ""
827 | Link: 'https://archeoviz.hypotheses.org/164'
828 | Citation: 'Sébastien Plutniak. 2023. Introduction to the R Programming Language and Reproducible Science, using the archeoViz Application. archeoViz. Data visualization in archaeology. DOI: https://doi.org/10.58079/bd7k'
829 | - ID: SIG-T0048
830 | Source: ""
831 | X_map: 173
832 | Y_map: 65
833 | Name: 'Tutorial: online visualization and graphic exports of archaeological spatial data, using the archeoViz application'
834 | Author: 'Sébastien Plutniak'
835 | Year: '2023'
836 | Topic: 'online visualization and dissemination of archaeological spatial data'
837 | Language: en
838 | Programming_language: ""
839 | Tools: archeoViz
840 | Level_of_difficulty: beginner
841 | Description: 'A tutorial about the online visualization and dissemination of archaeological spatial data, using the archeoViz application.'
842 | Material_type: tutorial
843 | Tags: 'visualisation, spatial analysis, teaching'
844 | Tags_openarchaeo: ""
845 | Link: 'https://archeoviz.hypotheses.org/178'
846 | Citation: 'Sébastien Plutniak. 2023. Tutorial: Online Visualization and Graphic Exports of Archaeological Spatial Data, using the archeoViz Application. archeoViz. Data visualization in archaeology. DOI: https://doi.org/10.58079/bd7l'
847 | - ID: 'SIG-T0049 '
848 | Source: ""
849 | X_map: 76
850 | Y_map: 36
851 | Name: 'Curso de introducción a R para arqueologos/as'
852 | Author: 'María Coto Sarmiento'
853 | Year: '2024'
854 | Topic: 'R programming language'
855 | Language: es
856 | Programming_language: Rstats
857 | Tools: ""
858 | Level_of_difficulty: beginner
859 | Description: 'A basic introduction to R.'
860 | Material_type: tutorial
861 | Tags: 'data wrangling, visualisation'
862 | Tags_openarchaeo: ""
863 | Link: 'https://github.com/Mcotsar/Curso_Intro_R_Arqueologia'
864 | Citation: ""
865 | - ID: SIG-T0050
866 | Source: ""
867 | X_map: 43
868 | Y_map: 34
869 | Name: 'R and Statistics for Archaeologists'
870 | Author: 'Bjørn Peare Bartholdy'
871 | Year: '2024'
872 | Topic: 'data analysis with R and the tidyverse'
873 | Language: en
874 | Programming_language: Rstats
875 | Tools: RStudio
876 | Level_of_difficulty: beginner
877 | Description: 'Materials for an introduction course on R and data analysis with the tidyverse, using archaeological data.'
878 | Material_type: tutorial
879 | Tags: 'tidyverse, data import, data wrangling, visualisation, programming'
880 | Tags_openarchaeo: ""
881 | Link: 'https://rchaeology.github.io/RchaeoStats/'
882 | Citation: 'https://github.com/rchaeology/RchaeoStats'
883 | - ID: SIG-T0051
884 | Source: ""
885 | X_map: 69
886 | Y_map: 56
887 | Name: 'Archaeological Spatial Analysis in R'
888 | Author: 'Michal Michalski'
889 | Year: '2023'
890 | Topic: 'spatial data analysis with R'
891 | Language: en
892 | Programming_language: Rstats
893 | Tools: RStudio
894 | Level_of_difficulty: intermediate
895 | Description: 'A course to introduce students to spatial data processing, analysis and visualization using the R programming language.'
896 | Material_type: tutorial
897 | Tags: 'spatial statistics, GIS, programming, visualisation'
898 | Tags_openarchaeo: ""
899 | Link: 'https://topographos.github.io/asar/'
900 | Citation: 'https://github.com/topographos/asar'
901 | - ID: SIG-T0052
902 | Source: ""
903 | X_map: 58
904 | Y_map: 76
905 | Name: 'Visualisation of lead isotope data'
906 | Author: 'Yiu-Kang Hsu'
907 | Year: '2024'
908 | Topic: 'plotting lead isotope data with R'
909 | Language: en
910 | Programming_language: Rstats
911 | Tools: ""
912 | Level_of_difficulty: intermediate
913 | Description: 'A textbook chapter documenting and explaining some techniques to visualize lead isotope data in R.'
914 | Material_type: tutorial
915 | Tags: 'visualisation, 3D methods, scientific data'
916 | Tags_openarchaeo: ""
917 | Link: 'https://archmetaldbm.github.io/GlobaLID-Edu/visualisation.html'
918 | Citation: 'https://doi.org/10.5281/zenodo.10205820'
919 |
--------------------------------------------------------------------------------