├── .dockerignore
├── .editorconfig
├── .github
├── dependabot.yml
└── workflows
│ └── ci.yml
├── .gitignore
├── .ruby-version
├── CNAME
├── CONTRIBUTING.md
├── Dockerfile
├── Dockerfile.prod
├── Gemfile
├── Gemfile.lock
├── README.md
├── _config.yml
├── _data
└── translations.yml
├── _includes
├── content.html
├── intro
│ └── en.html
├── next-guide.html
├── pager.html
├── search.html
├── svgs
│ ├── _mapping-to-improve-navigation.svg
│ ├── _the-openstreetmap-data-model.svg
│ ├── becoming-a-power-mapper.svg
│ ├── getting-started.svg
│ ├── logo.svg
│ ├── mapping-common-features.svg
│ ├── mapping-to-improve-navigation-01.svg
│ ├── mapping-to-improve-navigation.svg
│ ├── mapping-with-josm.svg
│ ├── sources.svg
│ ├── the-openstreetmap-data-model.svg
│ └── validating-osm.svg
└── translate.html
├── _layouts
├── category.html
├── default.html
├── home.html
└── post.html
├── about-osm-community
├── _posts
│ ├── 0000-01-01-history-of-osm.md
│ ├── 0000-01-02-osm-foundation.md
│ ├── 0000-01-03-local-chapters.md
│ ├── 0000-01-03-working-groups.md
│ ├── 0000-01-04-consumers.md
│ ├── 0000-01-05-osm-news.md
│ ├── 0000-01-06-donate-to-osm.md
│ └── 0000-01-07-get-in-touch.md
└── index.md
├── css
├── base.css
├── base2.css
├── icon.woff
├── opensans-bold.woff
├── opensans-italic.woff
├── opensans-regular.woff
└── site.css
├── docker-compose.override.yml
├── docker-compose.yml
├── en
└── index.html
├── fonts
├── CoreHumanistSans-Regular-webfont.eot
├── CoreHumanistSans-Regular-webfont.svg
├── CoreHumanistSans-Regular-webfont.ttf
├── CoreHumanistSans-Regular-webfont.woff
└── CoreHumanistSans-Regular-webfont.woff2
├── how-to-give-back
├── _posts
│ └── 0000-01-03-how-to-give-back.md
└── index.md
├── images
├── GOPR7567.jpg
├── SOTM_Africa_2017_balcony_group_photo.jpg
├── mapathon_MM.jpg
├── using_osm_taipei.jpg
├── whatisOSM_Civic_Use_DanielXOneilr.jpg
├── whatishistory_14665124541_52ce01db2c_o_KLL.jpg
├── whomakesupOSM_SOTMUS_2015_audience.jpg
└── whyshouldweuseOSM_niccolo_rigacci.jpg
├── index.md
├── js
├── affix.js
├── classie.js
├── clipboard.js
├── lunr-search.js
├── lunr.min.js
└── scrollspy.js
├── package.json
├── test
└── mapping.test.js
├── what-is-openstreetmap
├── _posts
│ └── 0000-01-01-what-is-openstreetmap.md
└── index.md
├── who-is-openstreetmap
├── _posts
│ └── 0000-01-01-osm-community.md
└── index.md
├── why-openstreetmap
├── _posts
│ └── 0000-01-02-why-use-openstreetmap.md
└── index.md
└── working-with-osm-data
├── _posts
├── 0000-01-04-how-good-is-osm.md
├── 0000-01-05-contribute-osm-data.md
├── 0000-01-06-humanitarian-campaign.md
├── 0000-01-07-research-with-osm.md
├── 0000-01-08-find-a-developer.md
└── 0000-01-09-downloading-and-using.md
└── index.md
/.dockerignore:
--------------------------------------------------------------------------------
1 | # Ignore git metadata folder
2 | .git/
3 | .github/
4 |
5 | # Ignore metadata generated by Jekyll
6 | _site/
7 | .sass-cache/
8 | .jekyll-cache/
9 | .jekyll-metadata
10 |
11 | # Ignore folders generated by Bundler
12 | .bundle/
13 | vendor/
14 |
15 | # Ignore docker related files
16 | Dockerfile*
17 | docker-compose.*
18 | .dockerignore
19 | .gitignore
20 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # EditorConfig is awesome: https://EditorConfig.org
2 |
3 | root = true
4 |
5 | [*]
6 | charset = utf-8
7 | indent_style = space
8 | trim_trailing_whitespace = true
9 | insert_final_newline = true
10 | end_of_line = lf
11 | indent_size = 2
12 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | updates:
3 | - package-ecosystem: "bundler"
4 | directory: "/"
5 | schedule:
6 | interval: "weekly"
7 | - package-ecosystem: "github-actions"
8 | directory: "/"
9 | schedule:
10 | interval: "daily"
11 |
--------------------------------------------------------------------------------
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | name: ci
2 |
3 | on:
4 | push:
5 | branches:
6 | - '**'
7 | - '!dependabot/**'
8 | tags:
9 | - 'v*.*.*'
10 | pull_request:
11 | branches:
12 | - 'master'
13 | - 'main'
14 | - 'gh-pages'
15 | schedule:
16 | - cron: '25 3 */7 * *'
17 | workflow_dispatch:
18 |
19 | concurrency:
20 | group: ${{ github.workflow }}-{{ github.head_ref || github.ref }}
21 | cancel-in-progress: true
22 |
23 | jobs:
24 | docker:
25 | runs-on: ubuntu-latest
26 | steps:
27 | - name: Checkout
28 | uses: actions/checkout@v4
29 |
30 | - name: Docker meta
31 | id: meta
32 | uses: docker/metadata-action@v5
33 | with:
34 | images: |
35 | ghcr.io/${{ github.repository }}
36 | tags: |
37 | type=ref,event=branch
38 | type=semver,pattern={{version}}
39 | type=semver,pattern={{major}}.{{minor}}
40 | type=semver,pattern={{major}}
41 | type=raw,value=latest,enable={{is_default_branch}}
42 |
43 | - name: Set up QEMU
44 | uses: docker/setup-qemu-action@v3
45 |
46 | - name: Set up Docker Buildx
47 | uses: docker/setup-buildx-action@v3
48 |
49 | - name: Login to GitHub Container Registry
50 | if: github.event_name != 'pull_request'
51 | uses: docker/login-action@v3
52 | with:
53 | registry: ghcr.io
54 | username: ${{ github.repository_owner }}
55 | password: ${{ secrets.GITHUB_TOKEN }}
56 |
57 | - name: Build and push
58 | uses: docker/build-push-action@v6
59 | with:
60 | context: .
61 | file: Dockerfile.prod
62 | platforms: linux/amd64,linux/arm64
63 | push: ${{ github.event_name != 'pull_request' }}
64 | tags: ${{ steps.meta.outputs.tags }}
65 | labels: ${{ steps.meta.outputs.labels }}
66 | cache-from: type=gha
67 | cache-to: type=gha,mode=max
68 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | _site
2 | node_modules
3 | .DS_Store
4 |
--------------------------------------------------------------------------------
/.ruby-version:
--------------------------------------------------------------------------------
1 | 3.1.3
2 |
--------------------------------------------------------------------------------
/CNAME:
--------------------------------------------------------------------------------
1 | welcome.openstreetmap.org
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 |
2 | The welcome mat is hosted on the `gh-pages` branch of this repo only. Please make pull requests from `gh-pages`.
3 |
4 | Please read through this contributing guide to learn how /welcome-mat is built.
5 |
6 | ## Structure
7 |
8 | ### Categories
9 |
10 | There are several folders in the root, these are categories.
11 |
12 | ```
13 | xxxx/
14 | yyyy/
15 | zzzz/
16 | ```
17 |
18 | To be a category, the folder must have:
19 |
20 | * a lowercase name, replacing spaces with dashes
21 | * an `index.md` file, with the following front matter keys:
22 | - title:
23 | - layout: category
24 | - order: (number to specify order)
25 | * a `_posts/` folder containing post files
26 |
27 | ```
28 | xxxx/
29 | _posts/
30 | index.md
31 | ```
32 |
33 | ### Posts
34 |
35 | Posts are files that live in a category's `_posts/` folder. Posts must have:
36 |
37 | * a lowercase file name following: `0000-01-01-title.md` pattern.
38 | * the following front matter:
39 | - title:
40 |
41 | You can change the date in the file name to specify order.
42 |
43 | ```
44 | xxxx/
45 | _posts/
46 | 0000-01-01-title.md
47 | 0000-01-02-another-title.md
48 | index.md
49 | ```
50 |
51 | To keep us consistent please follow these guidelines:
52 |
53 | * Use headlines for hierarchy. Always start at h2 (`##`) and use headlines in order. h2 and h3 will automatically appear in the table of contents on the right of the page.
54 | * All images should have alternative text to describe the image.
55 | * Link text should be descriptive. Avoid: Click [here](#) for more information.
56 | * Optimize images to keep our pages fast: [ImageOptim](https://imageoptim.com/mac), https://compressor.io/
57 |
58 |
59 | ### Category layout
60 |
61 | Jekyll will automatically change the layout of the category based on the number of posts the category has and if you've enabled sections (more about sections below).
62 |
63 | * If a category only has 1 post, then when you visit the category page, you'll find the content for that post printed out.
64 | * If a category has more than 1 post, then when you visit the category page, you'll find a list of posts with links to visit each post.
65 | * If a category has more than 1 post and uses sections, then when you visit the category page, you'll find a list of posts sorted by section. (See below for instructions on how to set sections up.)
66 |
67 | ### Grouping posts into sections - enabling sections
68 |
69 | You can group posts in a category into section, by:
70 |
71 | 1. Creating a subfolders in `_posts/` and placing each post into the subfolder:
72 | ```
73 | xxxx/
74 | _posts/
75 | aaaa/
76 | 0000-01-01-title.md
77 | 0000-01-02-title.md
78 | bbbb/
79 | 0000-01-01-title.md
80 | 0000-01-02-title.md
81 | cccc/
82 | 0000-01-01-title.md
83 | 0000-01-02-title.md
84 | ```
85 | 2. Adding a list of the folder names in the category's front matter, under a sections key (the folder names must match, but these aren't case sensitive):
86 | ```
87 | sections:
88 | - aaaa
89 | - bbbb
90 | - cccc
91 | ```
92 |
93 | Once you do both steps, Jekyll will automatically group the list of blog posts for that category and display them by section.
94 |
95 |
96 | ### Adding another language
97 |
98 | 1. Create a folder with the language abbreviation. For example, `fr/` for French and `de/` for German.
99 | 2. Update `_config.yml` to add the new language to the `defaults`. Follow the pattern of the English scopes.
100 | 3. Update `translations.yml` and add to each set of words the new translation using the language abbreviation from step 1. If you don't add a translation, it will appear in English.
101 | 4. Add the new language abbreviation and name of language to `languages` in `_config.yml`.
102 |
103 | Follow the patterns mentioned above in creating categories and posts.
104 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM docker.io/ruby:3.1-alpine as build
2 |
3 | # Add Gem build requirements
4 | RUN apk add --no-cache g++ make
5 |
6 | # Create app directory
7 | WORKDIR /app
8 |
9 | # Add Gemfile and Gemfile.lock
10 | ADD Gemfile* /app/
11 |
12 | # Install Gems
13 | RUN gem install bundler -v 2.4.5 \
14 | && bundle config build.nokogiri --use-system-libraries \
15 | && bundle config --global jobs $(nproc) \
16 | && bundle install
17 |
18 | # Copy Site Files
19 | COPY . .
20 |
21 | # Run jekyll serve
22 | CMD ["bundle","exec","jekyll","serve","--host=0.0.0.0","-wl"]
23 |
--------------------------------------------------------------------------------
/Dockerfile.prod:
--------------------------------------------------------------------------------
1 | # This file is used if building for Production environments
2 | # It uses a multi-stage build to run jekyll to populate an nginx container
3 |
4 | FROM docker.io/ruby:3.1 as build
5 |
6 | # Add Gem build requirements
7 | RUN apt-get update && apt-get install -y \
8 | g++ \
9 | make \
10 | && rm -rf /var/lib/apt/lists/*
11 |
12 | # Create app directory
13 | WORKDIR /app
14 |
15 | # Add Gemfile and Gemfile.lock
16 | ADD Gemfile* /app/
17 |
18 | # Install Gems
19 | RUN gem install bundler -v 2.4.5 \
20 | && bundle config build.nokogiri --use-system-libraries \
21 | && bundle config --global jobs $(nproc) \
22 | && bundle config set deployment 'true' \
23 | && bundle config set no-cache 'true' \
24 | && bundle install \
25 | && bundle clean
26 |
27 | # Copy Site Files
28 | COPY . .
29 |
30 | ENV JEKYLL_ENV=production
31 |
32 | # Run jekyll build site
33 | RUN bundle exec jekyll build --verbose
34 |
35 | #-------------------------------------------------
36 | # https://github.com/nginxinc/docker-nginx-unprivileged
37 | FROM ghcr.io/nginxinc/nginx-unprivileged:stable-alpine as webserver
38 |
39 | RUN echo "absolute_redirect off;" >/etc/nginx/conf.d/no-absolute_redirect.conf
40 | RUN echo "gzip_static on; gzip_proxied any;" >/etc/nginx/conf.d/gzip_static.conf
41 | # brotli_static not yet available in standard nginx distribution
42 | # RUN echo "brotli_static on; brotli_proxied any;" >/etc/nginx/conf.d/brotli_static.conf
43 |
44 | # Copy built site from build stage
45 | COPY --from=build /app/_site /usr/share/nginx/html
46 |
47 | # Test configuration during docker build
48 | RUN nginx -t
49 |
50 | # Port the container will listen on
51 | EXPOSE 8080
52 |
--------------------------------------------------------------------------------
/Gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 | gem 'github-pages'
3 | gem 'jekyll-feed'
4 | group :jekyll_plugins do
5 | gem 'jekyll-gzip'
6 | # gem 'jekyll-brotli'
7 | end
8 |
9 | gem "webrick", "~> 1.8"
10 |
--------------------------------------------------------------------------------
/Gemfile.lock:
--------------------------------------------------------------------------------
1 | GEM
2 | remote: https://rubygems.org/
3 | specs:
4 | activesupport (7.2.1)
5 | base64
6 | bigdecimal
7 | concurrent-ruby (~> 1.0, >= 1.3.1)
8 | connection_pool (>= 2.2.5)
9 | drb
10 | i18n (>= 1.6, < 2)
11 | logger (>= 1.4.2)
12 | minitest (>= 5.1)
13 | securerandom (>= 0.3)
14 | tzinfo (~> 2.0, >= 2.0.5)
15 | addressable (2.8.7)
16 | public_suffix (>= 2.0.2, < 7.0)
17 | base64 (0.2.0)
18 | bigdecimal (3.1.8)
19 | coffee-script (2.4.1)
20 | coffee-script-source
21 | execjs
22 | coffee-script-source (1.12.2)
23 | colorator (1.1.0)
24 | commonmarker (0.23.10)
25 | concurrent-ruby (1.3.4)
26 | connection_pool (2.4.1)
27 | csv (3.3.0)
28 | dnsruby (1.72.2)
29 | simpleidn (~> 0.2.1)
30 | drb (2.2.1)
31 | em-websocket (0.5.3)
32 | eventmachine (>= 0.12.9)
33 | http_parser.rb (~> 0)
34 | ethon (0.16.0)
35 | ffi (>= 1.15.0)
36 | eventmachine (1.2.7)
37 | execjs (2.9.1)
38 | faraday (2.10.1)
39 | faraday-net_http (>= 2.0, < 3.2)
40 | logger
41 | faraday-net_http (3.1.1)
42 | net-http
43 | ffi (1.17.0)
44 | forwardable-extended (2.6.0)
45 | gemoji (4.1.0)
46 | github-pages (232)
47 | github-pages-health-check (= 1.18.2)
48 | jekyll (= 3.10.0)
49 | jekyll-avatar (= 0.8.0)
50 | jekyll-coffeescript (= 1.2.2)
51 | jekyll-commonmark-ghpages (= 0.5.1)
52 | jekyll-default-layout (= 0.1.5)
53 | jekyll-feed (= 0.17.0)
54 | jekyll-gist (= 1.5.0)
55 | jekyll-github-metadata (= 2.16.1)
56 | jekyll-include-cache (= 0.2.1)
57 | jekyll-mentions (= 1.6.0)
58 | jekyll-optional-front-matter (= 0.3.2)
59 | jekyll-paginate (= 1.1.0)
60 | jekyll-readme-index (= 0.3.0)
61 | jekyll-redirect-from (= 0.16.0)
62 | jekyll-relative-links (= 0.6.1)
63 | jekyll-remote-theme (= 0.4.3)
64 | jekyll-sass-converter (= 1.5.2)
65 | jekyll-seo-tag (= 2.8.0)
66 | jekyll-sitemap (= 1.4.0)
67 | jekyll-swiss (= 1.0.0)
68 | jekyll-theme-architect (= 0.2.0)
69 | jekyll-theme-cayman (= 0.2.0)
70 | jekyll-theme-dinky (= 0.2.0)
71 | jekyll-theme-hacker (= 0.2.0)
72 | jekyll-theme-leap-day (= 0.2.0)
73 | jekyll-theme-merlot (= 0.2.0)
74 | jekyll-theme-midnight (= 0.2.0)
75 | jekyll-theme-minimal (= 0.2.0)
76 | jekyll-theme-modernist (= 0.2.0)
77 | jekyll-theme-primer (= 0.6.0)
78 | jekyll-theme-slate (= 0.2.0)
79 | jekyll-theme-tactile (= 0.2.0)
80 | jekyll-theme-time-machine (= 0.2.0)
81 | jekyll-titles-from-headings (= 0.5.3)
82 | jemoji (= 0.13.0)
83 | kramdown (= 2.4.0)
84 | kramdown-parser-gfm (= 1.1.0)
85 | liquid (= 4.0.4)
86 | mercenary (~> 0.3)
87 | minima (= 2.5.1)
88 | nokogiri (>= 1.16.2, < 2.0)
89 | rouge (= 3.30.0)
90 | terminal-table (~> 1.4)
91 | webrick (~> 1.8)
92 | github-pages-health-check (1.18.2)
93 | addressable (~> 2.3)
94 | dnsruby (~> 1.60)
95 | octokit (>= 4, < 8)
96 | public_suffix (>= 3.0, < 6.0)
97 | typhoeus (~> 1.3)
98 | html-pipeline (2.14.3)
99 | activesupport (>= 2)
100 | nokogiri (>= 1.4)
101 | http_parser.rb (0.8.0)
102 | i18n (1.14.5)
103 | concurrent-ruby (~> 1.0)
104 | jekyll (3.10.0)
105 | addressable (~> 2.4)
106 | colorator (~> 1.0)
107 | csv (~> 3.0)
108 | em-websocket (~> 0.5)
109 | i18n (>= 0.7, < 2)
110 | jekyll-sass-converter (~> 1.0)
111 | jekyll-watch (~> 2.0)
112 | kramdown (>= 1.17, < 3)
113 | liquid (~> 4.0)
114 | mercenary (~> 0.3.3)
115 | pathutil (~> 0.9)
116 | rouge (>= 1.7, < 4)
117 | safe_yaml (~> 1.0)
118 | webrick (>= 1.0)
119 | jekyll-avatar (0.8.0)
120 | jekyll (>= 3.0, < 5.0)
121 | jekyll-coffeescript (1.2.2)
122 | coffee-script (~> 2.2)
123 | coffee-script-source (~> 1.12)
124 | jekyll-commonmark (1.4.0)
125 | commonmarker (~> 0.22)
126 | jekyll-commonmark-ghpages (0.5.1)
127 | commonmarker (>= 0.23.7, < 1.1.0)
128 | jekyll (>= 3.9, < 4.0)
129 | jekyll-commonmark (~> 1.4.0)
130 | rouge (>= 2.0, < 5.0)
131 | jekyll-default-layout (0.1.5)
132 | jekyll (>= 3.0, < 5.0)
133 | jekyll-feed (0.17.0)
134 | jekyll (>= 3.7, < 5.0)
135 | jekyll-gist (1.5.0)
136 | octokit (~> 4.2)
137 | jekyll-github-metadata (2.16.1)
138 | jekyll (>= 3.4, < 5.0)
139 | octokit (>= 4, < 7, != 4.4.0)
140 | jekyll-gzip (2.5.1)
141 | jekyll (>= 3.0, < 5.0)
142 | jekyll-include-cache (0.2.1)
143 | jekyll (>= 3.7, < 5.0)
144 | jekyll-mentions (1.6.0)
145 | html-pipeline (~> 2.3)
146 | jekyll (>= 3.7, < 5.0)
147 | jekyll-optional-front-matter (0.3.2)
148 | jekyll (>= 3.0, < 5.0)
149 | jekyll-paginate (1.1.0)
150 | jekyll-readme-index (0.3.0)
151 | jekyll (>= 3.0, < 5.0)
152 | jekyll-redirect-from (0.16.0)
153 | jekyll (>= 3.3, < 5.0)
154 | jekyll-relative-links (0.6.1)
155 | jekyll (>= 3.3, < 5.0)
156 | jekyll-remote-theme (0.4.3)
157 | addressable (~> 2.0)
158 | jekyll (>= 3.5, < 5.0)
159 | jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0)
160 | rubyzip (>= 1.3.0, < 3.0)
161 | jekyll-sass-converter (1.5.2)
162 | sass (~> 3.4)
163 | jekyll-seo-tag (2.8.0)
164 | jekyll (>= 3.8, < 5.0)
165 | jekyll-sitemap (1.4.0)
166 | jekyll (>= 3.7, < 5.0)
167 | jekyll-swiss (1.0.0)
168 | jekyll-theme-architect (0.2.0)
169 | jekyll (> 3.5, < 5.0)
170 | jekyll-seo-tag (~> 2.0)
171 | jekyll-theme-cayman (0.2.0)
172 | jekyll (> 3.5, < 5.0)
173 | jekyll-seo-tag (~> 2.0)
174 | jekyll-theme-dinky (0.2.0)
175 | jekyll (> 3.5, < 5.0)
176 | jekyll-seo-tag (~> 2.0)
177 | jekyll-theme-hacker (0.2.0)
178 | jekyll (> 3.5, < 5.0)
179 | jekyll-seo-tag (~> 2.0)
180 | jekyll-theme-leap-day (0.2.0)
181 | jekyll (> 3.5, < 5.0)
182 | jekyll-seo-tag (~> 2.0)
183 | jekyll-theme-merlot (0.2.0)
184 | jekyll (> 3.5, < 5.0)
185 | jekyll-seo-tag (~> 2.0)
186 | jekyll-theme-midnight (0.2.0)
187 | jekyll (> 3.5, < 5.0)
188 | jekyll-seo-tag (~> 2.0)
189 | jekyll-theme-minimal (0.2.0)
190 | jekyll (> 3.5, < 5.0)
191 | jekyll-seo-tag (~> 2.0)
192 | jekyll-theme-modernist (0.2.0)
193 | jekyll (> 3.5, < 5.0)
194 | jekyll-seo-tag (~> 2.0)
195 | jekyll-theme-primer (0.6.0)
196 | jekyll (> 3.5, < 5.0)
197 | jekyll-github-metadata (~> 2.9)
198 | jekyll-seo-tag (~> 2.0)
199 | jekyll-theme-slate (0.2.0)
200 | jekyll (> 3.5, < 5.0)
201 | jekyll-seo-tag (~> 2.0)
202 | jekyll-theme-tactile (0.2.0)
203 | jekyll (> 3.5, < 5.0)
204 | jekyll-seo-tag (~> 2.0)
205 | jekyll-theme-time-machine (0.2.0)
206 | jekyll (> 3.5, < 5.0)
207 | jekyll-seo-tag (~> 2.0)
208 | jekyll-titles-from-headings (0.5.3)
209 | jekyll (>= 3.3, < 5.0)
210 | jekyll-watch (2.2.1)
211 | listen (~> 3.0)
212 | jemoji (0.13.0)
213 | gemoji (>= 3, < 5)
214 | html-pipeline (~> 2.2)
215 | jekyll (>= 3.0, < 5.0)
216 | kramdown (2.4.0)
217 | rexml
218 | kramdown-parser-gfm (1.1.0)
219 | kramdown (~> 2.0)
220 | liquid (4.0.4)
221 | listen (3.9.0)
222 | rb-fsevent (~> 0.10, >= 0.10.3)
223 | rb-inotify (~> 0.9, >= 0.9.10)
224 | logger (1.6.0)
225 | mercenary (0.3.6)
226 | mini_portile2 (2.8.7)
227 | minima (2.5.1)
228 | jekyll (>= 3.5, < 5.0)
229 | jekyll-feed (~> 0.9)
230 | jekyll-seo-tag (~> 2.1)
231 | minitest (5.25.1)
232 | net-http (0.4.1)
233 | uri
234 | nokogiri (1.16.7)
235 | mini_portile2 (~> 2.8.2)
236 | racc (~> 1.4)
237 | octokit (4.25.1)
238 | faraday (>= 1, < 3)
239 | sawyer (~> 0.9)
240 | pathutil (0.16.2)
241 | forwardable-extended (~> 2.6)
242 | public_suffix (5.1.1)
243 | racc (1.8.1)
244 | rb-fsevent (0.11.2)
245 | rb-inotify (0.11.1)
246 | ffi (~> 1.0)
247 | rexml (3.3.6)
248 | strscan
249 | rouge (3.30.0)
250 | rubyzip (2.3.2)
251 | safe_yaml (1.0.5)
252 | sass (3.7.4)
253 | sass-listen (~> 4.0.0)
254 | sass-listen (4.0.0)
255 | rb-fsevent (~> 0.9, >= 0.9.4)
256 | rb-inotify (~> 0.9, >= 0.9.7)
257 | sawyer (0.9.2)
258 | addressable (>= 2.3.5)
259 | faraday (>= 0.17.3, < 3)
260 | securerandom (0.3.1)
261 | simpleidn (0.2.3)
262 | strscan (3.1.0)
263 | terminal-table (1.8.0)
264 | unicode-display_width (~> 1.1, >= 1.1.1)
265 | typhoeus (1.4.1)
266 | ethon (>= 0.9.0)
267 | tzinfo (2.0.6)
268 | concurrent-ruby (~> 1.0)
269 | unicode-display_width (1.8.0)
270 | uri (0.13.0)
271 | webrick (1.8.1)
272 |
273 | PLATFORMS
274 | ruby
275 |
276 | DEPENDENCIES
277 | github-pages
278 | jekyll-feed
279 | jekyll-gzip
280 | webrick (~> 1.8)
281 |
282 | BUNDLED WITH
283 | 2.4.5
284 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | This is the code for the [OpenStreetMap Welcome Mat](https://welcome.openstreetmap.org/) at https://welcome.openstreetmap.org/
2 |
3 | More information on how this came about [here](https://docs.google.com/document/d/18X-GshbZhV88IpeMe_VQkeRqVdbRrbhTXIqc7a3o110/edit#heading=h.8ol3ksmje8od)
4 |
5 | ## Contributing
6 |
7 | Read the [contributing guide](CONTRIBUTING.md) to learn how to add or edit any content.
8 |
9 | ## Build
10 |
11 | This site is built with [Jekyll](https://help.github.com/articles/setting-up-your-github-pages-site-locally-with-jekyll/).
12 |
13 | **Running site locally**
14 |
15 | jekyll serve -b ''
16 |
17 | **Testing site** (if testing for the first time, run `npm install` first);
18 |
19 | npm test
20 |
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | permalink: /:categories/:title/
2 | baseurl:
3 | title: Welcome Mat | OpenStreetMap
4 | markdown: kramdown
5 | kramdown:
6 | input: GFM
7 | exclude:
8 | - package.json
9 | - node_modules
10 | - README.MD
11 | - CONTRIBUTING.md
12 | - test
13 | - Dockerfile*
14 | - docker-compose.*
15 | - Gemfile
16 | - Gemfile.lock
17 | - vendor
18 |
19 | languages:
20 | en: English # abbreviation: Name of native language
21 |
22 | defaults:
23 | - scope:
24 | path: "" # an empty string here means all files in the project
25 | type: "posts"
26 | values:
27 | layout: "post"
28 | # DEFAULT ENGLISH
29 | - scope:
30 | path: ""
31 | type: "pages"
32 | values:
33 | lang: "en"
34 | - scope:
35 | path: ""
36 | type: "posts"
37 | values:
38 | lang: "en"
39 |
40 | plugins:
41 | - jekyll-gzip
42 | # - jekyll-brotli
43 |
--------------------------------------------------------------------------------
/_data/translations.yml:
--------------------------------------------------------------------------------
1 | # Interface translations
2 | # Use this code:
3 | # {% include translate.html swap='guide' lang=page.lang %}
4 | # Replace the value of swap with the English value listed below
5 |
6 | - en: guide
7 | es: guía
8 | jp: ガイド
9 |
10 | - en: Mapping
11 | es: Mapeando
12 | jp: マッピング
13 |
14 | - en: Mapping with
15 | es: Mapeando con
16 | jp: マッピングツール
17 |
18 | - en: back to
19 | es: de regreso
20 | jp: 戻る
21 |
22 | - en: Next
23 | es: Siguiente
24 | jp: 進む
25 |
26 | - en: This is the last guide in this category.
27 | es: Esta es la última guía en esta categoría.
28 | jp: 次の記事はありません
29 |
30 | - en: Mapping guides
31 | es: Guías de mapeo
32 | jp: マッピングガイド
33 |
34 | - en: Search
35 | es: Buscar
36 | jp: 検索
37 |
38 | - en: results for
39 | es: resultados para
40 | jp: 件
41 |
42 | - en: Clear search
43 | es: Limpia la búsqueda
44 | jp: 検索結果をクリア
45 |
46 | - en: Read this guide
47 | es: Lee esta guía
48 | jp: ガイドを表示
49 |
--------------------------------------------------------------------------------
/_includes/content.html:
--------------------------------------------------------------------------------
1 |
2 | {% assign categories = site.pages | where: 'layout', 'category' | sort: 'order' %}
3 | {% for category in categories %}
4 | {% assign thisCategory = page.categories | join: '' %}
5 | {% assign stripCategory = category.dir | downcase | replace:'/','' %}
6 | {% if stripCategory == thisCategory %}
7 | {% assign currentCategoryColor = category.color %}
8 | {% endif %}
9 | {% endfor %}
10 |
11 |
12 |
{{include.title}}
13 | {{include.text}}
14 | {% include next-guide.html %}
15 |
16 |
17 |
--------------------------------------------------------------------------------
/_includes/intro/en.html:
--------------------------------------------------------------------------------
1 |
2 | Welcome Mat for
3 | OpenStreetMap
4 | community and
5 | Foundation .
6 | OpenStreetMap is the free and editable map of the world, created and maintained by a huge international community. Anybody can create an account and start editing on
7 | OpenStreetMap.org within minutes.
8 |
9 |
10 |
11 | These guides are licensed under (CC-by) if you would like to contribute or have any feedback on these, please feel free to raise an issue in this
12 | repository.
13 |
14 |
--------------------------------------------------------------------------------
/_includes/next-guide.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {% assign catSize = include.categories | size %}
4 | {% if catSize > 1 %}
5 | {% assign thisCat = include.categories[1] %}
6 | {% else %}
7 | {% assign thisCat = include.categories | join:'' %}
8 | {% endif %}
9 |
10 |
11 |
12 | {% for category in site.categories %}{% assign catg_name = category.first %}{% assign cur_cat = thisCat | downcase %}{% if catg_name == cur_cat %}{% assign catg_posts = category.last %}{% endif %}{% endfor %}{% for post in catg_posts %}{% if post.title == page.title %}{% unless forloop.last %}{% assign prev = catg_posts[forloop.index] %}{% endunless %}{% endif %}{% assign next = post %}{% endfor %}{% for post in catg_posts %}{% if post.title == page.title %}{% unless forloop.first %}
13 |
14 |
22 | {% endunless %}
23 | {% unless forloop.first == false %}
24 | {% if catg_posts.size > 1 %}
25 |
26 |
27 |
39 |
40 |
41 | {% endif %}
42 | {% endunless %}
43 | {% endif %}{% assign next = post %}{% endfor %}
44 |
--------------------------------------------------------------------------------
/_includes/pager.html:
--------------------------------------------------------------------------------
1 |
2 | {% assign categories = site.pages | where: 'layout', 'category' | sort: 'order' %}
3 | {% for category in categories %}
4 | {% assign thisCategory = page.categories | join: '' %}
5 | {% assign stripCategory = category.dir | downcase | replace:'/','' %}
6 | {% if stripCategory == thisCategory %}
7 | {% assign currentCategory = category.title %}
8 | {% assign currentCategoryLink = category.dir %}
9 | {% assign currentCategoryColor = category.color %}
10 | {% endif %}
11 | {% endfor %}
12 |
13 |
14 |
32 |
--------------------------------------------------------------------------------
/_includes/search.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
22 |
23 |
24 |
25 |
26 |
27 |
28 | {% include translate.html swap='results for' lang=page.lang %} “
29 | ”
30 |
31 | {% include translate.html swap='Clear search' lang=page.lang %}
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/_includes/svgs/_the-openstreetmap-data-model.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
18 |
19 |
20 |
26 |
27 |
33 |
34 |
35 |
43 |
45 |
46 |
47 |
48 |
49 |
51 |
55 |
80 |
83 |
85 |
86 |
87 |
95 |
97 |
98 |
100 |
101 |
103 |
104 |
105 |
106 |
108 |
109 |
110 |
118 |
119 |
120 |
121 |
122 |
123 |
125 |
127 |
129 |
131 |
133 |
135 |
136 |
138 |
140 |
142 |
143 |
145 |
147 |
149 |
151 |
153 |
155 |
157 |
159 |
161 |
163 |
164 |
165 |
167 |
168 |
169 |
171 |
173 |
175 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
190 |
194 |
195 |
203 |
204 |
205 |
208 |
210 |
211 |
212 |
215 |
216 |
217 |
218 |
219 |
220 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
234 |
235 |
236 |
--------------------------------------------------------------------------------
/_includes/svgs/becoming-a-power-mapper.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/_includes/svgs/getting-started.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/_includes/svgs/logo.svg:
--------------------------------------------------------------------------------
1 |
2 | image/svg+xml
--------------------------------------------------------------------------------
/_includes/svgs/mapping-to-improve-navigation-01.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/_includes/svgs/mapping-with-josm.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/_includes/svgs/sources.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/_includes/svgs/the-openstreetmap-data-model.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/_includes/translate.html:
--------------------------------------------------------------------------------
1 | {%- assign set = (site.data.translations | where: 'en',include.swap) %}{% if set %}{% for swap in set %}{% if include.lang != 'en' and swap.[include.lang] %}{{swap.[include.lang]}}{% else %}{{include.swap}}{% endif %}{% endfor %}{% else %}nah{% endif -%}
2 |
--------------------------------------------------------------------------------
/_layouts/category.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: default
3 | ---
4 |
5 |
6 | {% assign category = page.dir | downcase | replace:'/','' %}
7 |
8 | {% assign numPosts = 0 %}
9 | {% for post in site.posts %}
10 | {% assign thisCategory = post.categories | join: '' %}
11 | {% if thisCategory == category %}{% assign numPosts = numPosts | plus: 1 %}{% endif %}{% endfor %}
12 |
13 |
14 |
15 | {% include pager.html %}
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 | {% if page.sections %}
25 |
26 |
27 |
28 |
29 |
30 |
{{page.title}}
31 |
32 | {{content}}
33 |
34 | {% assign numSections = page.sections | size | minus: 1 %}
35 |
36 | {% for i in (0..numSections) %}
37 |
38 |
{{page.sections[i]}}
39 | {% assign section = page.sections[i] | downcase | append: '/' | prepend: '/' %}
40 | {% for post in site.posts reversed %}{% assign thisCategory = post.categories | join: '' %}{% if thisCategory == category and post.path contains section %}
41 |
{{post.title}}
42 | {% endif %}{% endfor %}
43 | {% endfor %}
44 |
45 | {% elsif numPosts > 1 %}
46 |
47 |
48 |
49 |
50 |
51 |
52 |
{{page.title}}
53 |
54 | {{content}}
55 |
56 |
57 | {% for post in site.posts reversed %}{% assign thisCategory = post.categories | join: '' %}{% if thisCategory == category %}
58 | {{post.title}}
59 | {% endif %}{% endfor %}
60 |
61 |
62 | {% else %}
63 |
64 |
65 |
66 |
67 |
68 | {% for post in site.posts reversed %}{% assign thisCategory = post.categories | join: '' %}{% if thisCategory == category %}
69 |
70 | {% include content.html title=page.title text=post.content categories=post.categories %}
71 |
72 | {% endif %}{% endfor %}
73 |
74 | {% endif %}
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
85 |
--------------------------------------------------------------------------------
/_layouts/default.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | {% if page.description %} {% endif %}
11 |
12 | {% if page.title == 'OpenStreetMap' %}{{page.title}} | Welcome Mat{% else %}{{page.title}} | OpenStreetMap{% endif %}
13 |
14 |
15 |
16 | {% if page.date and site.baseurl == '/blog' %}
17 | {% endif %}{% if page.tags %}
18 | {% for tags in page.tags %}
19 | {% endfor %}{% endif %}{% if page.category and page.category !='none' %}
20 | {% endif %}{% if page.author %}
21 | {% endif %}{% if page.excerpt or page.description %}
22 | {% endif %}
23 | {% if page.card %}
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 | {% endif %}
34 | {% if page.video %}
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 | {% elsif page.image %}
44 |
45 |
46 |
47 |
48 |
49 | {% endif %}
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 | {% if site.test %}
61 |
62 | {% endif %}
63 |
64 |
65 | {% if page.head %}{{page.head}}{% endif %}{% if layout.head %}{{layout.head}}{% endif %}
66 |
67 |
68 |
69 |
70 |
71 | {% if page.lang %}{% assign lang = page.lang %}{% endif %}
72 |
73 |
74 |
75 |
OpenStreetMap Welcome Mat
76 | {% assign intro = "intro/" | append: lang | append: ".html" %}{% include {{intro}} %}
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
94 |
95 | {% for lang in site.languages %}
96 | {% if lang[0] != page.lang %}
97 |
{{lang[1]}}
98 | {% endif %}
99 | {% endfor %}
100 |
101 |
102 |
103 |
104 |
{{content}}
105 |
106 |
109 |
110 |
111 |
112 |
140 |
141 |
142 |
--------------------------------------------------------------------------------
/_layouts/home.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: default
3 | class: fill-light
4 | options: full
5 | ---
6 |
7 |
8 | {% if page.lang %}{% assign lang = page.lang %}{% endif %}
9 |
10 |
53 |
--------------------------------------------------------------------------------
/_layouts/post.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: default
3 | ---
4 |
5 |
6 |
7 |
8 |
9 | {% include pager.html %}
10 |
11 | {% include content.html title=page.title text=content categories=page.categories %}
12 |
13 |
14 |
15 |
16 |
17 |
20 |
--------------------------------------------------------------------------------
/about-osm-community/_posts/0000-01-01-history-of-osm.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: What is the history of OSM?
3 | ---
4 |
5 |
6 | OpenStreetMap was founded in the UK in 2004 by Steve Coast, and taken up by a community of map enthusiasts who wanted a free and open source of data. It has since grown to more than 1 million contributors around the world: individual volunteers, map enthusiast, GIS and geography data specialists, companies that use map data, humanitarian organizations, government agencies and more.
7 |
8 | In 2006, the [OpenStreetMap Foundation](about-osm-community/osm-foundation/) was established to encourage the growth, development and distribution of free geospatial data and provide geospatial data for anybody to use and share. In 2012, OpenStreetMap switched to licensing data under the [Open Database License](https://wiki.osmfoundation.org/wiki/Licence).
9 |
--------------------------------------------------------------------------------
/about-osm-community/_posts/0000-01-02-osm-foundation.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: What is the OSM Foundation?
3 | ---
4 |
5 | OpenStreetMap is not a closely governed or managed project; grassroots activities are the core of the movement, and individuals participating in OpenStreetMap enjoy great freedom. The OpenStreetMap Foundation is the nonprofit organization that supports OpenStreetMap and provides the necessary organizational backbone. It is made up of a number of different members and groups.
6 |
7 | * **[OSMF Members](https://wiki.osmfoundation.org/wiki/Membership){:target="_blank"}:** members who have paid dues to join the OpenStreetMap Foundation. They can vote on the OpenStreetMap Foundation Board of Directors and give their opinions on board matters. You can join [here](https://wiki.osmfoundation.org/wiki/Membership){:target="_blank"}.
8 | * **[OSMF Board of Directors](https://wiki.osmfoundation.org/wiki/Officers_%26_Board){:target="_blank"}:** seven members from around the world who serve as the key governance body of the OpenStreetMap Foundation.
9 | * **[Local Chapters](https://wiki.osmfoundation.org/wiki/Local_Chapters){:target="_blank"}:** country-specific organizations that act on behalf of the OpenStreetMap Foundation, organising activities like OpenStreetMap editing projects, events and conferences in their areas. Local Chapters are officially registered nonprofit organizations. Note that many countries do not have an officially chartered Chapter, but still have active editing.
10 | * **[Working Groups]({{site.baseurl}}/about-osm-community/working-groups/):** groups organized by the OpenStreetMap Foundation that handle specific topics like operating the OSM servers, handling data issues, managing legal and licensing issues, running communications about OpenStreetMap, organizing the annual State of the Map conference and much more.
11 | * **[Corporate Members](https://wiki.osmfoundation.org/wiki/Corporate_Members){:target="_blank"}:** corporate supporters of OpenStreetMap who donate different amounts of money to the OpenStreetMap Foundation. Here is more information about [becoming a corporate member](https://wiki.osmfoundation.org/wiki/Join_as_a_corporate_member){:target="_blank"}.
12 | * **[Advisory Board](https://wiki.osmfoundation.org/wiki/Advisory_Board){:target="_blank"}:** a group that serves to advise the OSM Foundation Board of Directors, made up of official Local Chapters and Gold & Platinum Corporate Members
13 |
--------------------------------------------------------------------------------
/about-osm-community/_posts/0000-01-03-local-chapters.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: How are Local Chapters formed?
3 | ---
4 |
5 | Once the community of OpenStreetMap contributors in an area is mature enough to warrant the creation of a national (or regional) organisation, they can set up a formal group and apply to be recognized as a local chapter of the OpenStreetMap Foundation. The sequence is key though - creating a formal group is never the first step for OSM activities in a country. Instead, a formal group should only be set up once there is a certain amount of OSM activities, from a diverse group of people in the country, who can then together found the organisation.
6 |
7 | Local chapters must be nonprofit organisations dedicated to supporting the aims of the OpenStreetMap Foundation and the OpenStreetMap project.
8 |
9 | Generally, a group that applies for local chapter status in a country is expected to represent the OSM community in the whole country, and membership must be available to everyone in the country. For example, a local hackerspace in the capital or a group of students from a university might not be the best-suited groups to form a local chapter because they tend to lack the inclusivity and reach we are looking for. We're also expecting local chapters to have democratic structures so that the OSM community members who join the group can decide in the local chapter's affairs. While it is possible for a local chapter to be part of an existing entity rather than a separate organisation, such a local chapter would have to demonstrate how the OSM community members can make decisions without being unduly controlled by the parent organisation.
10 |
11 | An organisation that applies for local chapter status should be sustainable financially, and should have a track record of OSM-related activities either as an organisation or at least through their founding members. When evaluating a local chapter application, the OSM Foundation will not look at what the chapter is planning to do, but at what they have done already!
12 |
13 | The Local Chapter application process is described [here](https://wiki.osmfoundation.org/wiki/Local_Chapters).
14 |
15 | The OpenStreetMap Foundation is happy to talk to groups who do not yet meet the requirements set out above for a local chapter, and work with them to become a local chapter in the future.
16 |
--------------------------------------------------------------------------------
/about-osm-community/_posts/0000-01-03-working-groups.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Tell me about OSM Foundation Working Groups
3 | ---
4 |
5 | The OSM Foundation Working Groups are volunteers who manage and run various aspects of OpenStreetMap.
6 |
7 | ### Licensing Working Group
8 | * Handling issues relating the the current license for OSM data
9 |
10 | ### Data Working Group
11 | * Resolving issues about copyright violations, data disputes, vandalism, and automated edits beyond the normal means of the community.
12 | * Helping to set policy on data.
13 |
14 | ### Communication Working Group
15 | * Maintaining [blog.openstreetmap.org](https://blog.openstreetmap.org){:target="_blank"} and OpenStreetMap accounts on [Twitter](https://twitter.com/openstreetmap){:target="_blank"} and [Facebook](https://www.facebook.com/OpenStreetMap){:target="_blank"}.
16 | * Making announcements and project news written with the official "voice of the foundation"
17 | * Responding to press contacts.
18 | * Overseeing design and content on [osmfoundation.org](https://wiki.osmfoundation.org){:target="_blank"}
19 |
20 | ### Operations Working Group
21 | * Planning and maintenance of the OSM API and servers.
22 |
23 | ### Engineering Working Group
24 | * Engaging and assisting developers to develop OSM software.
25 |
26 | ### State of the Map Organizing Committee
27 | * Organizing and executing the annual worldwide OpenStreetMap Foundation Conference, "State of the Map"
28 |
29 |
33 |
34 | ### Membership Working Group
35 | * Administering the membership database
36 | * Answering routine membership queries
37 | * Increasing OSMF Membership
38 |
--------------------------------------------------------------------------------
/about-osm-community/_posts/0000-01-04-consumers.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Who uses OpenStreetMap?
3 | ---
4 |
5 | OpenStreetMap is used by people all over the world -- individuals, volunteers, companies, nonprofits, governments, organizations and more. There are many ways to use OpenStreetMap: as a basemap, using the OSM data for routing or navigation, using OSM data for GIS analysis, such as planning or logistics for humanitarian groups, utilities, governments and more.
6 |
7 | Here is a non-exhaustive list of some big organizations that use OpenStreetMap, to give you an idea of the breadth of OSM consumers. There are also many medium and small businesses, individuals and personal projects that use OpenStreetMap. And you can too!
8 |
9 | ## Major Sites
10 |
11 | * Amazon
12 | * Apple
13 | * Baidu Maps
14 | * Facebook
15 | * Microsoft
16 | * [Wikipedia and Wikimedia](https://blog.wikimedia.org/2018/06/28/interactive-maps-now-in-your-language/){:target="_blank"}
17 |
18 | ## Social Sites
19 |
20 | * Foursquare
21 | * Pinterest
22 | * Pokemon Go
23 | * Snapchat
24 |
25 | ## Transport
26 |
27 | * [Air France](https://wiki.openstreetmap.org/wiki/File:Air_France_seatback_map_display.jpg){:target="_blank"}
28 | * [Alaska Airlines](https://twitter.com/openstreetmapes/status/554009623062388736){:target="_blank"}
29 | * [Deutsche Bahn](https://wiki.openstreetmap.org/wiki/File:OpenStreetMap_in_an_IC2_carriage_(DB).jpg){:target="_blank"}
30 | * Grab
31 | * SNCF (French rail agency)
32 | * Uber
33 |
34 | ## Geodata Software and Services
35 |
36 | * CARTO
37 | * Digital Globe
38 | * ESRI
39 | * Garmin
40 | * Mapbox
41 | * Telenav
42 |
43 | ## Government
44 |
45 | * Agence Française de Développement (French Development Agency)
46 | * City of [Belem, Brazil](http://www.kdaberlinda.pa.gov.br/mapa_app/){:target="_blank"}
47 | * City of Jakarta, Indonesia Government
48 | * French Gendarmerie and Police
49 | * Government of Brazil, [Environment Ministry](https://www.ibama.gov.br/siema/){:target="_blank"} and [Planning Ministry](http://www.visualizador.inde.gov.br){:target="_blank"}
50 | * [Government of France National Address Database](https://adresse.data.gouv.fr){:target="_blank"}
51 | * Government of Italy: [President's Office](http://www.governo.it/mappa-del-presidente){:target="_blank"}
52 | * Government of Lesotho
53 | * Government of Lithuania
54 | * Government of Norway public transit agency
55 | * Government of Uruguay Ministry of Social Development
56 | * Indonesian Disaster Management Agency
57 | * [Italian Carabinieri](http://www.carabinieri.it/cittadino/informazioni/dove-siamo){:target="_blank"}
58 | * Krakow, Poland transit agency
59 | * Malaga, Spain transit agency
60 | * New York City, USA Government
61 | * [Police Scotland](http://www.scotland.police.uk/your-community/edinburgh/){:target="_blank"}
62 | * Portland, Oregon, USA transit agency
63 | * Rennes, France transit agency
64 | * Statistics Canada
65 | * Uganda Bureau of Statistics
66 | * US National Park Service
67 | * US State Department, USAID, Peace Corps
68 |
69 | ## Humanitarian Sector
70 | * CartONG
71 | * Clinton Health Access Initiative
72 | * Concern Worldwide
73 | * Gates Foundation
74 | * International Federation of Red Cross and Red Crescent Societies (IFRC), International Committee of Red Cross (ICRC), and National Societies (e.g. American Red Cross, Bangladesh Red Crescent Society, British Red Cross, Canadian Red Cross, Netherlands Red Cross, and more)
75 | * MapAction
76 | * Médecins Sans Frontières/Doctors Without Borders
77 | * Pan American Development Foundation
78 | * United Nations
79 | * World Bank
80 | * See [missingmaps.org](https://www.missingmaps.org){:target="_blank"} for more humanitarian OSM partners
81 |
82 | ## Education
83 | * Cambridge University
84 | * George Washington University
85 | * Heidelberg University
86 | * Texas Tech University
87 | * University of Maryland
88 | * [YouthMappers](https://www.youthmappers.org){:target="_blank"}, an international network of student OpenStreetMap clubs
89 |
90 | ## News and Media
91 |
92 | * BBC
93 | * [Financial Times](https://www.reddit.com/r/dataisbeautiful/comments/9j285h/im_steve_bernard_interactive_design_editor_at_the/e6o3kyz/){:target="_blank"}
94 | * The Guardian
95 | * National Geographic
96 | * New York Times
97 | * US News & World Report
98 | * Wall Street Journal
99 | * Washington Post
100 | * Numerous films and TV shows such as *Blade Runner 2049*
101 |
102 | Plus many many, large, medium and small businesses and organizations around the world!
103 |
104 | To see more examples of uses of OpenStreetMap, see our [weekly featured images](https://wiki.openstreetmap.org/wiki/Featured_images){:target="_blank"}.
105 |
--------------------------------------------------------------------------------
/about-osm-community/_posts/0000-01-05-osm-news.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: What's new with OpenStreetMap?
3 | ---
4 |
5 | There are many ways to find out what’s new with OpenStreetMap. OSM has official social media channels at https://twitter.com/openstreetmap and https://www.facebook.com/OpenStreetMap/ .
6 |
7 | The official blog is at https://blog.openstreetmap.org/.
8 |
9 | There is an independent weekly newsletter at http://www.weeklyosm.eu .
10 |
11 | Google News is frequently updated with articles about OpenStreetMap too.
12 |
13 | Or just try searching the web or social media for OpenStreetMap. There are hundreds of articles and blog posts about OSM.
14 |
--------------------------------------------------------------------------------
/about-osm-community/_posts/0000-01-06-donate-to-osm.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: How can we give money to OpenStreetMap?
3 | ---
4 |
5 | OpenStreetMap is the largest open geographic database in the world, the data infrastructure for multitudes of mapping projects around the globe. A donation to the OpenStreetMap Foundation will cover core operational expenses in supporting the OpenStreetMap project: hardware costs, legal fees, an administrative assistant and other expenses of our working groups and administration.
6 |
7 | OSM runs a lean operation. The OpenStreetMap Foundation relies on revenue from individual and corporate membership dues, profits generated by the annual State of the Map conferences, and donations. We must keep our income sources diversified, as these vary from year to year, but our modest needs stay the same. For this, we need your support.
8 |
9 | There are several ways to financially support the project:
10 |
11 | ## Corporate membership
12 |
13 | If you are part of a company or organization, a great way to support OpenStreetMap financially is by becoming a [Corporate Member](https://wiki.osmfoundation.org/wiki/Membership#Corporate_Members){:target="_blank"} of the OpenStreetMap Foundation.
14 |
15 | Corporate membership tiers start at €500 for the Supporter level and go up to €20,000 or more annually for the Platinum level. Each tier comes with a number of additional benefits. Corporate members of Silver and higher levels have a seat on the [OSMF Advisory Board](https://wiki.osmfoundation.org/wiki/Advisory_Board){:target="_blank"}, which serves to advise the OSMF Board of Directors.
16 |
17 | If you are interested in becoming a Corporate Member or learning more about donating, please get in touch with the OSM Foundation Board of Directors at [board(at)osmfoundation.org](mailto:board@osmfoundation.org)
18 |
19 | ## Donations
20 |
21 | [Donations](https://donate.openstreetmap.org){:target="_blank"} of any amount are also more than welcome. The OpenStreetMap Foundation is a registered non-profit in the United Kingdom.
22 |
23 | ## Local chapters
24 |
25 | If an OSM Local Chapter exists in your jurisdiction, you may also want to consider donating to them directly. Donations to Local Chapters benefit their work supporting the OpenStreetMap project and community at the local level. Donations to Local Chapters may be tax-exempt, depending on local tax law. For details, inquire with the Local Chapter directly. You can find them at the [OSM Wiki](https://wiki.openstreetmap.org/wiki/Foundation/Local_Chapters){:target="_blank"}
26 |
27 | ## Conferences
28 |
29 | There are a variety of OpenStreetMap conferences, and ticket revenues help sustain the community. The annual international OpenStreetMap conference is called [State of the Map](https://stateofthemap.org){:target="_blank"}. There are also many [regional](https://wiki.openstreetmap.org/wiki/State_Of_The_Map#Regional.2Flocal_conferences){:target="_blank"} State of the Map conferences.
30 |
--------------------------------------------------------------------------------
/about-osm-community/_posts/0000-01-07-get-in-touch.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: How to get in touch
3 | ---
4 |
5 | As a decentralized project, there are many different ways to get in touch with the OpenStreetMap community, it depends on what you want to ask about.
6 |
7 | The [Working Groups]({{site.baseurl}}/about-osm-community/working-groups/) may cover your question if it’s about a specific topic such as licensing or press inquiries.
8 |
9 | If you want to talk with the community in a specific country or region, please consult the [OSM Wiki](https://wiki.openstreetmap.org){:target="_blank"}.
10 |
11 | If you need more help with contacting communities, try the [OSM contact channels](https://wiki.openstreetmap.org/wiki/Contact_channels){:target="_blank"} page.
12 |
13 | Here is [more information]({{site.baseurl}}/about-osm-community/donate-to-osm/) about donating to OSM.
14 |
15 | If you are are interested in contributing or donating to OpenStreetMap, or for any other questions, please get in touch with the OSM Foundation Board of Directors at [board(at)osmfoundation.org](mailto:board@osmfoundation.org).
16 |
--------------------------------------------------------------------------------
/about-osm-community/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: About the OpenStreetMap Community
3 | layout: category
4 | order: 11
5 | color: blue
6 | # these section refer to the subfolders in _posts/
7 | # the subfolder names and the section list names must match exactly
8 | # these are not case sensitive
9 | # sections:
10 | # - Mapping
11 | # - JOSM
12 | # - Reference
13 | description: Getting in touch, history, joining and more
14 | image: SOTM_Africa_2017_balcony_group_photo.jpg
15 | image_credit: by Geoffrey Kateregga
16 | ---
17 |
--------------------------------------------------------------------------------
/css/icon.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osmfoundation/welcome-mat/0fb83b82bfcd52f8797e956d57e8dc77dea92903/css/icon.woff
--------------------------------------------------------------------------------
/css/opensans-bold.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osmfoundation/welcome-mat/0fb83b82bfcd52f8797e956d57e8dc77dea92903/css/opensans-bold.woff
--------------------------------------------------------------------------------
/css/opensans-italic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osmfoundation/welcome-mat/0fb83b82bfcd52f8797e956d57e8dc77dea92903/css/opensans-italic.woff
--------------------------------------------------------------------------------
/css/opensans-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osmfoundation/welcome-mat/0fb83b82bfcd52f8797e956d57e8dc77dea92903/css/opensans-regular.woff
--------------------------------------------------------------------------------
/docker-compose.override.yml:
--------------------------------------------------------------------------------
1 | version: '2'
2 |
3 | # NOTE:
4 | # This file automatically overrides (merged with) docker-compose.yml
5 | # It is used for adding features required for local development:
6 | #
7 |
8 | services:
9 |
10 | app:
11 | build:
12 | context: .
13 | dockerfile: Dockerfile
14 | ports:
15 | - 35729:35729
16 | - 4000:4000
17 | volumes:
18 | # Mount in the local directory into container
19 | - .:/app
20 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '2'
2 |
3 | # NOTE:
4 | # THIS IS FOR PRODUCTION BUILDS, see docker-compose.override.yml for additional config used for local dev
5 | # See docker-compose.override.yml which is combined with docker-compose.yml when an explicit docker-compose file is not specified: eg: "docker-compose up"
6 |
7 | # Production build: docker-compose -f docker-compose.yml build
8 | # Dev build: docker-compose build
9 |
10 | services:
11 |
12 | app:
13 | build:
14 | context: .
15 | dockerfile: Dockerfile.prod
16 | ports:
17 | - 8080:8080
18 |
--------------------------------------------------------------------------------
/en/index.html:
--------------------------------------------------------------------------------
1 | ---
2 | ---
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/fonts/CoreHumanistSans-Regular-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osmfoundation/welcome-mat/0fb83b82bfcd52f8797e956d57e8dc77dea92903/fonts/CoreHumanistSans-Regular-webfont.eot
--------------------------------------------------------------------------------
/fonts/CoreHumanistSans-Regular-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osmfoundation/welcome-mat/0fb83b82bfcd52f8797e956d57e8dc77dea92903/fonts/CoreHumanistSans-Regular-webfont.ttf
--------------------------------------------------------------------------------
/fonts/CoreHumanistSans-Regular-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osmfoundation/welcome-mat/0fb83b82bfcd52f8797e956d57e8dc77dea92903/fonts/CoreHumanistSans-Regular-webfont.woff
--------------------------------------------------------------------------------
/fonts/CoreHumanistSans-Regular-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osmfoundation/welcome-mat/0fb83b82bfcd52f8797e956d57e8dc77dea92903/fonts/CoreHumanistSans-Regular-webfont.woff2
--------------------------------------------------------------------------------
/how-to-give-back/_posts/0000-01-03-how-to-give-back.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: How can we give back?
3 | ---
4 |
5 | ## Why should an organization contribute data to OpenStreetMap?
6 |
7 | * Adding data to OSM is quicker and easier than building your own system: you benefit from updates to the software, the ecosystem and collaborative maintenance and improvement of the data
8 | * Allows an organisation to focus on its core data, rather than also maintaining geospatial data
9 | * OSM is a shared platform to contribute and collaborate with others
10 | * Broader social good of contributing to a global map
11 |
12 | Here are some [general guidelines](https://wiki.openstreetmap.org/wiki/How_We_Map){:target="_blank"} for contributing. If you are thinking about importing an existing data set, [read our import guidelines closely](https://wiki.openstreetmap.org/wiki/Import/Guidelines){:target="_blank"} and particularly note [license compatibility](https://wiki.openstreetmap.org/wiki/Import/Guidelines#Step_3_-_License_approval).
13 |
14 | ## What other ways can we contribute?
15 |
16 | * Becoming a member or supporter helps contribute to the sustainability of the project. A [number of companies](https://wiki.osmfoundation.org/wiki/Corporate_Members){:target="_blank"}, for example, are supporters.
17 | * Contributing imagery or other data such as GPS traces or your GIS data can help improve the map for all and provide a means for the community to use that information to collect new data. It is important to release that data under an open license as well
18 | * There’s also a range of supporting open source infrastructure which would benefit from contribution and support from wider community
19 | * There is also a need for advocacy about OpenStreetMap, training, community engagement and more. You can contribute to OpenStreetMap without actually editing the map.
20 | * Participate in the governance and work of OpenStreetMap Foundation through [working groups]({{site.baseurl}}/about-osm-community/working-groups/)
21 |
--------------------------------------------------------------------------------
/how-to-give-back/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: How to give back?
3 | layout: category
4 | order: 3
5 | color: blue
6 | description: How can you or your organization contribute to OSM?
7 | image: mapathon_MM.jpg
8 | image-alt: a group of people editing OpenStreetMap on computers at a mapathon
9 | ---
10 |
--------------------------------------------------------------------------------
/images/GOPR7567.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osmfoundation/welcome-mat/0fb83b82bfcd52f8797e956d57e8dc77dea92903/images/GOPR7567.jpg
--------------------------------------------------------------------------------
/images/SOTM_Africa_2017_balcony_group_photo.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osmfoundation/welcome-mat/0fb83b82bfcd52f8797e956d57e8dc77dea92903/images/SOTM_Africa_2017_balcony_group_photo.jpg
--------------------------------------------------------------------------------
/images/mapathon_MM.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osmfoundation/welcome-mat/0fb83b82bfcd52f8797e956d57e8dc77dea92903/images/mapathon_MM.jpg
--------------------------------------------------------------------------------
/images/using_osm_taipei.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osmfoundation/welcome-mat/0fb83b82bfcd52f8797e956d57e8dc77dea92903/images/using_osm_taipei.jpg
--------------------------------------------------------------------------------
/images/whatisOSM_Civic_Use_DanielXOneilr.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osmfoundation/welcome-mat/0fb83b82bfcd52f8797e956d57e8dc77dea92903/images/whatisOSM_Civic_Use_DanielXOneilr.jpg
--------------------------------------------------------------------------------
/images/whatishistory_14665124541_52ce01db2c_o_KLL.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osmfoundation/welcome-mat/0fb83b82bfcd52f8797e956d57e8dc77dea92903/images/whatishistory_14665124541_52ce01db2c_o_KLL.jpg
--------------------------------------------------------------------------------
/images/whomakesupOSM_SOTMUS_2015_audience.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osmfoundation/welcome-mat/0fb83b82bfcd52f8797e956d57e8dc77dea92903/images/whomakesupOSM_SOTMUS_2015_audience.jpg
--------------------------------------------------------------------------------
/images/whyshouldweuseOSM_niccolo_rigacci.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/osmfoundation/welcome-mat/0fb83b82bfcd52f8797e956d57e8dc77dea92903/images/whyshouldweuseOSM_niccolo_rigacci.jpg
--------------------------------------------------------------------------------
/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: home
3 | title: Welcome Mat | OpenStreetMap
4 | ---
5 |
--------------------------------------------------------------------------------
/js/affix.js:
--------------------------------------------------------------------------------
1 | /* ========================================================================
2 | * Bootstrap: affix.js v3.3.2
3 | * http://getbootstrap.com/javascript/#affix
4 | * ========================================================================
5 | * Copyright 2011-2015 Twitter, Inc.
6 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7 | * ======================================================================== */
8 |
9 |
10 | +function ($) {
11 | 'use strict';
12 |
13 | // AFFIX CLASS DEFINITION
14 | // ======================
15 |
16 | var Affix = function (element, options) {
17 | this.options = $.extend({}, Affix.DEFAULTS, options)
18 |
19 | this.$target = $(this.options.target)
20 | .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
21 | .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
22 |
23 | this.$element = $(element)
24 | this.affixed = null
25 | this.unpin = null
26 | this.pinnedOffset = null
27 |
28 | this.checkPosition()
29 | }
30 |
31 | Affix.VERSION = '3.3.2'
32 |
33 | Affix.RESET = 'affix affix-top affix-bottom'
34 |
35 | Affix.DEFAULTS = {
36 | offset: 0,
37 | target: window
38 | }
39 |
40 | Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
41 | var scrollTop = this.$target.scrollTop()
42 | var position = this.$element.offset()
43 | var targetHeight = this.$target.height()
44 |
45 | if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
46 |
47 | if (this.affixed == 'bottom') {
48 | if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
49 | return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
50 | }
51 |
52 | var initializing = this.affixed == null
53 | var colliderTop = initializing ? scrollTop : position.top
54 | var colliderHeight = initializing ? targetHeight : height
55 |
56 | if (offsetTop != null && scrollTop <= offsetTop) return 'top'
57 | if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
58 |
59 | return false
60 | }
61 |
62 | Affix.prototype.getPinnedOffset = function () {
63 | if (this.pinnedOffset) return this.pinnedOffset
64 | this.$element.removeClass(Affix.RESET).addClass('affix')
65 | var scrollTop = this.$target.scrollTop()
66 | var position = this.$element.offset()
67 | return (this.pinnedOffset = position.top - scrollTop)
68 | }
69 |
70 | Affix.prototype.checkPositionWithEventLoop = function () {
71 | setTimeout($.proxy(this.checkPosition, this), 1)
72 | }
73 |
74 | Affix.prototype.checkPosition = function () {
75 | if (!this.$element.is(':visible')) return
76 |
77 | var height = this.$element.height()
78 | var offset = this.options.offset
79 | var offsetTop = offset.top
80 | var offsetBottom = offset.bottom
81 | var scrollHeight = $('body').height()
82 |
83 | if (typeof offset != 'object') offsetBottom = offsetTop = offset
84 | if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
85 | if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
86 |
87 | var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
88 |
89 | if (this.affixed != affix) {
90 | if (this.unpin != null) this.$element.css('top', '')
91 |
92 | var affixType = 'affix' + (affix ? '-' + affix : '')
93 | var e = $.Event(affixType + '.bs.affix')
94 |
95 | this.$element.trigger(e)
96 |
97 | if (e.isDefaultPrevented()) return
98 |
99 | this.affixed = affix
100 | this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
101 |
102 | this.$element
103 | .removeClass(Affix.RESET)
104 | .addClass(affixType)
105 | .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
106 | }
107 |
108 | if (affix == 'bottom') {
109 | this.$element.offset({
110 | top: scrollHeight - height - offsetBottom
111 | })
112 | }
113 | }
114 |
115 |
116 | // AFFIX PLUGIN DEFINITION
117 | // =======================
118 |
119 | function Plugin(option) {
120 | return this.each(function () {
121 | var $this = $(this)
122 | var data = $this.data('bs.affix')
123 | var options = typeof option == 'object' && option
124 |
125 | if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
126 | if (typeof option == 'string') data[option]()
127 | })
128 | }
129 |
130 | var old = $.fn.affix
131 |
132 | $.fn.affix = Plugin
133 | $.fn.affix.Constructor = Affix
134 |
135 |
136 | // AFFIX NO CONFLICT
137 | // =================
138 |
139 | $.fn.affix.noConflict = function () {
140 | $.fn.affix = old
141 | return this
142 | }
143 |
144 |
145 | // AFFIX DATA-API
146 | // ==============
147 |
148 | $(window).on('load', function () {
149 | $('[data-spy="affix"]').each(function () {
150 | var $spy = $(this)
151 | var data = $spy.data()
152 |
153 | data.offset = data.offset || {}
154 |
155 | if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
156 | if (data.offsetTop != null) data.offset.top = data.offsetTop
157 |
158 | Plugin.call($spy, data)
159 | })
160 | })
161 |
162 | }(jQuery);
--------------------------------------------------------------------------------
/js/classie.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * classie v1.0.1
3 | * class helper functions
4 | * from bonzo https://github.com/ded/bonzo
5 | * MIT license
6 | *
7 | * classie.has( elem, 'my-class' ) -> true/false
8 | * classie.add( elem, 'my-new-class' )
9 | * classie.remove( elem, 'my-unwanted-class' )
10 | * classie.toggle( elem, 'my-class' )
11 | */
12 |
13 | /*jshint browser: true, strict: true, undef: true, unused: true */
14 | /*global define: false, module: false */
15 |
16 | ( function( window ) {
17 |
18 | 'use strict';
19 |
20 | // class helper functions from bonzo https://github.com/ded/bonzo
21 |
22 | function classReg( className ) {
23 | return new RegExp("(^|\\s+)" + className + "(\\s+|$)");
24 | }
25 |
26 | // classList support for class management
27 | // altho to be fair, the api sucks because it won't accept multiple classes at once
28 | var hasClass, addClass, removeClass;
29 |
30 | if ( 'classList' in document.documentElement ) {
31 | hasClass = function( elem, c ) {
32 | return elem.classList.contains( c );
33 | };
34 | addClass = function( elem, c ) {
35 | elem.classList.add( c );
36 | };
37 | removeClass = function( elem, c ) {
38 | elem.classList.remove( c );
39 | };
40 | }
41 | else {
42 | hasClass = function( elem, c ) {
43 | return classReg( c ).test( elem.className );
44 | };
45 | addClass = function( elem, c ) {
46 | if ( !hasClass( elem, c ) ) {
47 | elem.className = elem.className + ' ' + c;
48 | }
49 | };
50 | removeClass = function( elem, c ) {
51 | elem.className = elem.className.replace( classReg( c ), ' ' );
52 | };
53 | }
54 |
55 | function toggleClass( elem, c ) {
56 | var fn = hasClass( elem, c ) ? removeClass : addClass;
57 | fn( elem, c );
58 | }
59 |
60 | var classie = {
61 | // full names
62 | hasClass: hasClass,
63 | addClass: addClass,
64 | removeClass: removeClass,
65 | toggleClass: toggleClass,
66 | // short names
67 | has: hasClass,
68 | add: addClass,
69 | remove: removeClass,
70 | toggle: toggleClass
71 | };
72 |
73 | // transport
74 | if ( typeof define === 'function' && define.amd ) {
75 | // AMD
76 | define( classie );
77 | } else if ( typeof exports === 'object' ) {
78 | // CommonJS
79 | module.exports = classie;
80 | } else {
81 | // browser global
82 | window.classie = classie;
83 | }
84 |
85 | })( window );
--------------------------------------------------------------------------------
/js/clipboard.js:
--------------------------------------------------------------------------------
1 | // Import support https://stackoverflow.com/questions/13673346/supporting-both-commonjs-and-amd
2 | (function(name, definition) {
3 | if (typeof module != "undefined") module.exports = definition();
4 | else if (typeof define == "function" && typeof define.amd == "object") define(definition);
5 | else this[name] = definition();
6 | }("clipboard", function() {
7 |
8 | var clipboard = {};
9 |
10 | clipboard.copy = (function() {
11 | var _intercept = false;
12 | var _data; // Map from data type (e.g. "text/html") to value.
13 |
14 | document.addEventListener("copy", function(e){
15 | if (_intercept) {
16 | _intercept = false;
17 | for (var key in _data) {
18 | e.clipboardData.setData(key, _data[key]);
19 | }
20 | e.preventDefault();
21 | }
22 | });
23 |
24 | return function(data) {
25 | return new Promise(function(resolve, reject) {
26 | _intercept = true; // Race condition?
27 | _data = (typeof data === "string" ? {"text/plain": data} : data);
28 | try {
29 | if (document.execCommand("copy")) {
30 | // document.execCommand is synchronous: http://www.w3.org/TR/2015/WD-clipboard-apis-20150421/#integration-with-rich-text-editing-apis
31 | // So we can call resolve() back here.
32 | resolve();
33 | }
34 | else {
35 | _intercept = false;
36 | reject(new Error("Unable to copy. Perhaps it's not available in your browser?"));
37 | }
38 | }
39 | catch (e) {
40 | _intercept = false;
41 | reject(e);
42 | }
43 | });
44 | };
45 | }());
46 |
47 | clipboard.paste = (function() {
48 | var _intercept = false;
49 | var _resolve;
50 | var _dataType;
51 |
52 | document.addEventListener("paste", function(e) {
53 | if (_intercept) {
54 | _intercept = false;
55 | e.preventDefault();
56 | _resolve(e.clipboardData.getData(_dataType));
57 | }
58 | });
59 |
60 | return function(dataType) {
61 | return new Promise(function(resolve, reject) {
62 | _intercept = true; // Race condition?
63 | _resolve = resolve;
64 | _dataType = dataType || "text/plain";
65 | try {
66 | if (!document.execCommand("paste")) {
67 | _intercept = false;
68 | reject(new Error("Unable to paste. Perhaps it's not available in your browser?"));
69 | }
70 | } catch (e) {
71 | _intercept = false;
72 | reject(new Error(e));
73 | }
74 | });
75 | };
76 | }());
77 |
78 | // Handle IE behaviour.
79 | if (typeof ClipboardEvent === "undefined" &&
80 | typeof window.clipboardData !== "undefined" &&
81 | typeof window.clipboardData.setData !== "undefined") {
82 |
83 | /*! promise-polyfill 2.0.1 */
84 | !function(a){function b(a,b){return function(){a.apply(b,arguments)}}function c(a){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof a)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],i(a,b(e,this),b(f,this))}function d(a){var b=this;return null===this._state?void this._deferreds.push(a):void j(function(){var c=b._state?a.onFulfilled:a.onRejected;if(null===c)return void(b._state?a.resolve:a.reject)(b._value);var d;try{d=c(b._value)}catch(e){return void a.reject(e)}a.resolve(d)})}function e(a){try{if(a===this)throw new TypeError("A promise cannot be resolved with itself.");if(a&&("object"==typeof a||"function"==typeof a)){var c=a.then;if("function"==typeof c)return void i(b(c,a),b(e,this),b(f,this))}this._state=!0,this._value=a,g.call(this)}catch(d){f.call(this,d)}}function f(a){this._state=!1,this._value=a,g.call(this)}function g(){for(var a=0,b=this._deferreds.length;b>a;a++)d.call(this,this._deferreds[a]);this._deferreds=null}function h(a,b,c,d){this.onFulfilled="function"==typeof a?a:null,this.onRejected="function"==typeof b?b:null,this.resolve=c,this.reject=d}function i(a,b,c){var d=!1;try{a(function(a){d||(d=!0,b(a))},function(a){d||(d=!0,c(a))})}catch(e){if(d)return;d=!0,c(e)}}var j=c.immediateFn||"function"==typeof setImmediate&&setImmediate||function(a){setTimeout(a,1)},k=Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)};c.prototype["catch"]=function(a){return this.then(null,a)},c.prototype.then=function(a,b){var e=this;return new c(function(c,f){d.call(e,new h(a,b,c,f))})},c.all=function(){var a=Array.prototype.slice.call(1===arguments.length&&k(arguments[0])?arguments[0]:arguments);return new c(function(b,c){function d(f,g){try{if(g&&("object"==typeof g||"function"==typeof g)){var h=g.then;if("function"==typeof h)return void h.call(g,function(a){d(f,a)},c)}a[f]=g,0===--e&&b(a)}catch(i){c(i)}}if(0===a.length)return b([]);for(var e=a.length,f=0;fd;d++)a[d].then(b,c)})},"undefined"!=typeof module&&module.exports?module.exports=c:a.Promise||(a.Promise=c)}(this);
85 |
86 | clipboard.copy = function(data) {
87 | return new Promise(function(resolve, reject) {
88 | // IE supports string and URL types: https://msdn.microsoft.com/en-us/library/ms536744(v=vs.85).aspx
89 | // We only support the string type for now.
90 | if (typeof data !== "string" && !("text/plain" in data)) {
91 | throw new Error("You must provide a text/plain type.")
92 | }
93 |
94 | var strData = (typeof data === "string" ? data : data["text/plain"]);
95 | var copySucceeded = window.clipboardData.setData("Text", strData);
96 | copySucceeded ? resolve() : reject(new Error("Copying was rejected."));
97 | });
98 | };
99 |
100 | clipboard.paste = function(data) {
101 | return new Promise(function(resolve, reject) {
102 | var strData = window.clipboardData.getData("Text");
103 | if (strData) {
104 | resolve(strData);
105 | } else {
106 | // The user rejected the paste request.
107 | reject(new Error("Pasting was rejected."));
108 | }
109 | });
110 | };
111 | }
112 |
113 | return clipboard;
114 | }));
--------------------------------------------------------------------------------
/js/lunr-search.js:
--------------------------------------------------------------------------------
1 | ---
2 |
3 | ---
4 | // This adds data to lunr so it can build out all the search weights and ouptput `index`
5 | // http://matthewdaly.co.uk/blog/2015/04/18/how-i-added-search-to-my-site-with-lunr-dot-js/
6 | var index = lunr(function () {
7 | this.field('title')
8 | this.field('content', {boost: 10})
9 | this.field('tags', {boost: 10})
10 | this.field('lang', {boost: 10})
11 | this.ref('id')
12 | });
13 | {% assign count = 0 %}{% for post in site.posts %}{% if post.title != null and post.title != empty %}
14 | index.add({
15 | title: {{post.title | escape | jsonify}},
16 | content: {{post.content | markdownify | strip_html | escape | jsonify}},
17 | tags: {{post.tags | jsonify}},
18 | lang: {{post.lang | jsonify}},
19 | id: {{count}}
20 | });
21 | {% assign count = count | plus: 1 %}{% endif %}{% endfor %}
22 |
23 | // This lines up with `index` and provides extra data about the pages and outputs this data in the search. The order of the logic MUST be the same as found in `search-feed.js`
24 | {% assign first = true %}
25 | var store = [{% for post in site.posts %}{% if post.title != null and post.title != empty %}{% assign categories = site.pages | where: 'layout', 'category' %}{% for category in categories %}{% assign thisCategory = post.categories | join: '' %}{% assign stripCategory = category.dir | downcase | replace:'/','' %}{% if stripCategory == thisCategory %}{% assign currentCategory = category.title %}{% assign currentCategoryLink = category.dir %}{% assign currentCategoryColor = category.color %}{% endif %}{% endfor %}{% unless first %},{% endunless %}/* clean up URLs, for posts that live in a category alone */{% assign getUrlLang = post.lang | prepend:'/' | append: '/' %}{% assign getUrl = post.url | replace: getUrlLang,'/' %}{% assign splitUrl = getUrl | split:'/' %}{% assign cleanUrl = splitUrl[2] | append:'/' %}{
26 | "title": {{post.title | escape | jsonify}},
27 | "link": "{{ site.baseurl }}{{ post.url | replace_first: cleanUrl,'' }}",
28 | "tags": {{post.tags | jsonify}},
29 | "lang": {{post.lang | jsonify}},
30 | "color": {{ currentCategoryColor | jsonify }},
31 | "category": {{ currentCategory | jsonify }},
32 | "excerpt": {{ post.content | strip_html | escape | truncatewords: 30 | jsonify }}
33 | }{% unless forloop.last %},{% endunless %}{% endif %}{% endfor %}
34 | ];
--------------------------------------------------------------------------------
/js/lunr.min.js:
--------------------------------------------------------------------------------
1 | /**
2 | * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 0.5.12
3 | * Copyright (C) 2015 Oliver Nightingale
4 | * MIT Licensed
5 | * @license
6 | */
7 | !function(){var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.5.12",t.utils={},t.utils.warn=function(t){return function(e){t.console&&console.warn&&console.warn(e)}}(this),t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var t=Array.prototype.slice.call(arguments),e=t.pop(),n=t;if("function"!=typeof e)throw new TypeError("last argument must be a function");n.forEach(function(t){this.hasHandler(t)||(this.events[t]=[]),this.events[t].push(e)},this)},t.EventEmitter.prototype.removeListener=function(t,e){if(this.hasHandler(t)){var n=this.events[t].indexOf(e);this.events[t].splice(n,1),this.events[t].length||delete this.events[t]}},t.EventEmitter.prototype.emit=function(t){if(this.hasHandler(t)){var e=Array.prototype.slice.call(arguments,1);this.events[t].forEach(function(t){t.apply(void 0,e)})}},t.EventEmitter.prototype.hasHandler=function(t){return t in this.events},t.tokenizer=function(t){return arguments.length&&null!=t&&void 0!=t?Array.isArray(t)?t.map(function(t){return t.toLowerCase()}):t.toString().trim().toLowerCase().split(/[\s\-]+/):[]},t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.registeredFunctions[e];if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");this._stack.splice(i,0,n)},t.Pipeline.prototype.remove=function(t){var e=this._stack.indexOf(t);-1!=e&&this._stack.splice(e,1)},t.Pipeline.prototype.run=function(t){for(var e=[],n=t.length,i=this._stack.length,o=0;n>o;o++){for(var r=t[o],s=0;i>s&&(r=this._stack[s](r,o,t),void 0!==r);s++);void 0!==r&&e.push(r)}return e},t.Pipeline.prototype.reset=function(){this._stack=[]},t.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},t.Vector.Node=function(t,e,n){this.idx=t,this.val=e,this.next=n},t.Vector.prototype.insert=function(e,n){this._magnitude=void 0;var i=this.list;if(!i)return this.list=new t.Vector.Node(e,n,i),this.length++;if(en.idx?n=n.next:(i+=e.val*n.val,e=e.next,n=n.next);return i},t.Vector.prototype.similarity=function(t){return this.dot(t)/(this.magnitude()*t.magnitude())},t.SortedSet=function(){this.length=0,this.elements=[]},t.SortedSet.load=function(t){var e=new this;return e.elements=t,e.length=t.length,e},t.SortedSet.prototype.add=function(){var t,e;for(t=0;t1;){if(r===t)return o;t>r&&(e=o),r>t&&(n=o),i=n-e,o=e+Math.floor(i/2),r=this.elements[o]}return r===t?o:-1},t.SortedSet.prototype.locationFor=function(t){for(var e=0,n=this.elements.length,i=n-e,o=e+Math.floor(i/2),r=this.elements[o];i>1;)t>r&&(e=o),r>t&&(n=o),i=n-e,o=e+Math.floor(i/2),r=this.elements[o];return r>t?o:t>r?o+1:void 0},t.SortedSet.prototype.intersect=function(e){for(var n=new t.SortedSet,i=0,o=0,r=this.length,s=e.length,a=this.elements,h=e.elements;;){if(i>r-1||o>s-1)break;a[i]!==h[o]?a[i]h[o]&&o++:(n.add(a[i]),i++,o++)}return n},t.SortedSet.prototype.clone=function(){var e=new t.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},t.SortedSet.prototype.union=function(t){var e,n,i;return this.length>=t.length?(e=this,n=t):(e=t,n=this),i=e.clone(),i.add.apply(i,n.toArray()),i},t.SortedSet.prototype.toJSON=function(){return this.toArray()},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.Store,this.tokenStore=new t.TokenStore,this.corpusTokens=new t.SortedSet,this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var t=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,t)},t.Index.prototype.off=function(t,e){return this.eventEmitter.removeListener(t,e)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;return n._fields=e.fields,n._ref=e.ref,n.documentStore=t.Store.load(e.documentStore),n.tokenStore=t.TokenStore.load(e.tokenStore),n.corpusTokens=t.SortedSet.load(e.corpusTokens),n.pipeline=t.Pipeline.load(e.pipeline),n},t.Index.prototype.field=function(t,e){var e=e||{},n={name:t,boost:e.boost||1};return this._fields.push(n),this},t.Index.prototype.ref=function(t){return this._ref=t,this},t.Index.prototype.add=function(e,n){var i={},o=new t.SortedSet,r=e[this._ref],n=void 0===n?!0:n;this._fields.forEach(function(n){var r=this.pipeline.run(t.tokenizer(e[n.name]));i[n.name]=r,t.SortedSet.prototype.add.apply(o,r)},this),this.documentStore.set(r,o),t.SortedSet.prototype.add.apply(this.corpusTokens,o.toArray());for(var s=0;s0&&(i=1+Math.log(this.documentStore.length/n)),this._idfCache[e]=i},t.Index.prototype.search=function(e){var n=this.pipeline.run(t.tokenizer(e)),i=new t.Vector,o=[],r=this._fields.reduce(function(t,e){return t+e.boost},0),s=n.some(function(t){return this.tokenStore.has(t)},this);if(!s)return[];n.forEach(function(e,n,s){var a=1/s.length*this._fields.length*r,h=this,l=this.tokenStore.expand(e).reduce(function(n,o){var r=h.corpusTokens.indexOf(o),s=h.idf(o),l=1,u=new t.SortedSet;if(o!==e){var c=Math.max(3,o.length-e.length);l=1/Math.log(c)}return r>-1&&i.insert(r,a*s*l),Object.keys(h.tokenStore.get(o)).forEach(function(t){u.add(t)}),n.union(u)},new t.SortedSet);o.push(l)},this);var a=o.reduce(function(t,e){return t.intersect(e)});return a.map(function(t){return{ref:t,score:i.similarity(this.documentVector(t))}},this).sort(function(t,e){return e.score-t.score})},t.Index.prototype.documentVector=function(e){for(var n=this.documentStore.get(e),i=n.length,o=new t.Vector,r=0;i>r;r++){var s=n.elements[r],a=this.tokenStore.get(s)[e].tf,h=this.idf(s);o.insert(this.corpusTokens.indexOf(s),a*h)}return o},t.Index.prototype.toJSON=function(){return{version:t.version,fields:this._fields,ref:this._ref,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(t){var e=Array.prototype.slice.call(arguments,1);e.unshift(this),t.apply(this,e)},t.Store=function(){this.store={},this.length=0},t.Store.load=function(e){var n=new this;return n.length=e.length,n.store=Object.keys(e.store).reduce(function(n,i){return n[i]=t.SortedSet.load(e.store[i]),n},{}),n},t.Store.prototype.set=function(t,e){this.has(t)||this.length++,this.store[t]=e},t.Store.prototype.get=function(t){return this.store[t]},t.Store.prototype.has=function(t){return t in this.store},t.Store.prototype.remove=function(t){this.has(t)&&(delete this.store[t],this.length--)},t.Store.prototype.toJSON=function(){return{store:this.store,length:this.length}},t.stemmer=function(){var t={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},e={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",o=n+"[^aeiouy]*",r=i+"[aeiou]*",s="^("+o+")?"+r+o,a="^("+o+")?"+r+o+"("+r+")?$",h="^("+o+")?"+r+o+r+o,l="^("+o+")?"+i,u=new RegExp(s),c=new RegExp(h),f=new RegExp(a),d=new RegExp(l),p=/^(.+?)(ss|i)es$/,m=/^(.+?)([^s])s$/,v=/^(.+?)eed$/,y=/^(.+?)(ed|ing)$/,g=/.$/,S=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),x=new RegExp("^"+o+i+"[^aeiouwxy]$"),k=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,_=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,F=/^(.+?)(s|t)(ion)$/,O=/^(.+?)e$/,P=/ll$/,N=new RegExp("^"+o+i+"[^aeiouwxy]$"),T=function(n){var i,o,r,s,a,h,l;if(n.length<3)return n;if(r=n.substr(0,1),"y"==r&&(n=r.toUpperCase()+n.substr(1)),s=p,a=m,s.test(n)?n=n.replace(s,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),s=v,a=y,s.test(n)){var T=s.exec(n);s=u,s.test(T[1])&&(s=g,n=n.replace(s,""))}else if(a.test(n)){var T=a.exec(n);i=T[1],a=d,a.test(i)&&(n=i,a=S,h=w,l=x,a.test(n)?n+="e":h.test(n)?(s=g,n=n.replace(s,"")):l.test(n)&&(n+="e"))}if(s=k,s.test(n)){var T=s.exec(n);i=T[1],n=i+"i"}if(s=b,s.test(n)){var T=s.exec(n);i=T[1],o=T[2],s=u,s.test(i)&&(n=i+t[o])}if(s=E,s.test(n)){var T=s.exec(n);i=T[1],o=T[2],s=u,s.test(i)&&(n=i+e[o])}if(s=_,a=F,s.test(n)){var T=s.exec(n);i=T[1],s=c,s.test(i)&&(n=i)}else if(a.test(n)){var T=a.exec(n);i=T[1]+T[2],a=c,a.test(i)&&(n=i)}if(s=O,s.test(n)){var T=s.exec(n);i=T[1],s=c,a=f,h=N,(s.test(i)||a.test(i)&&!h.test(i))&&(n=i)}return s=P,a=c,s.test(n)&&a.test(n)&&(s=g,n=n.replace(s,"")),"y"==r&&(n=r.toLowerCase()+n.substr(1)),n};return T}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.stopWordFilter=function(e){return e&&t.stopWordFilter.stopWords[e]!==e?e:void 0},t.stopWordFilter.stopWords={a:"a",able:"able",about:"about",across:"across",after:"after",all:"all",almost:"almost",also:"also",am:"am",among:"among",an:"an",and:"and",any:"any",are:"are",as:"as",at:"at",be:"be",because:"because",been:"been",but:"but",by:"by",can:"can",cannot:"cannot",could:"could",dear:"dear",did:"did","do":"do",does:"does",either:"either","else":"else",ever:"ever",every:"every","for":"for",from:"from",get:"get",got:"got",had:"had",has:"has",have:"have",he:"he",her:"her",hers:"hers",him:"him",his:"his",how:"how",however:"however",i:"i","if":"if","in":"in",into:"into",is:"is",it:"it",its:"its",just:"just",least:"least",let:"let",like:"like",likely:"likely",may:"may",me:"me",might:"might",most:"most",must:"must",my:"my",neither:"neither",no:"no",nor:"nor",not:"not",of:"of",off:"off",often:"often",on:"on",only:"only",or:"or",other:"other",our:"our",own:"own",rather:"rather",said:"said",say:"say",says:"says",she:"she",should:"should",since:"since",so:"so",some:"some",than:"than",that:"that",the:"the",their:"their",them:"them",then:"then",there:"there",these:"these",they:"they","this":"this",tis:"tis",to:"to",too:"too",twas:"twas",us:"us",wants:"wants",was:"was",we:"we",were:"were",what:"what",when:"when",where:"where",which:"which","while":"while",who:"who",whom:"whom",why:"why",will:"will","with":"with",would:"would",yet:"yet",you:"you",your:"your"},t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(t){var e=t.replace(/^\W+/,"").replace(/\W+$/,"");return""===e?void 0:e},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.TokenStore=function(){this.root={docs:{}},this.length=0},t.TokenStore.load=function(t){var e=new this;return e.root=t.root,e.length=t.length,e},t.TokenStore.prototype.add=function(t,e,n){var n=n||this.root,i=t[0],o=t.slice(1);return i in n||(n[i]={docs:{}}),0===o.length?(n[i].docs[e.ref]=e,void(this.length+=1)):this.add(o,e,n[i])},t.TokenStore.prototype.has=function(t){if(!t)return!1;for(var e=this.root,n=0;n a'
21 | this.offsets = []
22 | this.targets = []
23 | this.activeTarget = null
24 | this.scrollHeight = 0
25 |
26 | this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
27 | this.refresh()
28 | this.process()
29 | }
30 |
31 | ScrollSpy.VERSION = '3.3.2'
32 |
33 | ScrollSpy.DEFAULTS = {
34 | offset: 10
35 | }
36 |
37 | ScrollSpy.prototype.getScrollHeight = function () {
38 | return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
39 | }
40 |
41 | ScrollSpy.prototype.refresh = function () {
42 | var that = this
43 | var offsetMethod = 'offset'
44 | var offsetBase = 0
45 |
46 | this.offsets = []
47 | this.targets = []
48 | this.scrollHeight = this.getScrollHeight()
49 |
50 | if (!$.isWindow(this.$scrollElement[0])) {
51 | offsetMethod = 'position'
52 | offsetBase = this.$scrollElement.scrollTop()
53 | }
54 |
55 | this.$body
56 | .find(this.selector)
57 | .map(function () {
58 | var $el = $(this)
59 | var href = $el.data('target') || $el.attr('href')
60 | var $href = /^#./.test(href) && $(href)
61 |
62 | return ($href
63 | && $href.length
64 | && $href.is(':visible')
65 | && [[$href[offsetMethod]().top + offsetBase, href]]) || null
66 | })
67 | .sort(function (a, b) { return a[0] - b[0] })
68 | .each(function () {
69 | that.offsets.push(this[0])
70 | that.targets.push(this[1])
71 | })
72 | }
73 |
74 | ScrollSpy.prototype.process = function () {
75 | var scrollTop = this.$scrollElement.scrollTop() + this.options.offset;
76 | var scrollHeight = this.getScrollHeight();
77 | var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height();
78 | var offsets = this.offsets;
79 | var targets = this.targets;
80 | var activeTarget = this.activeTarget;
81 | var i;
82 |
83 | if (this.scrollHeight != scrollHeight) {
84 | this.refresh();
85 | }
86 |
87 | if (scrollTop >= maxScroll) {
88 | return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
89 | }
90 |
91 | if (activeTarget && scrollTop < offsets[0]) {
92 | this.activeTarget = null;
93 | return this.clear();
94 | }
95 |
96 | for (i = offsets.length; i--;) {
97 | activeTarget != targets[i]
98 | && scrollTop >= offsets[i]
99 | && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
100 | && this.activate(targets[i])
101 | }
102 | }
103 |
104 | ScrollSpy.prototype.activate = function (target) {
105 | this.activeTarget = target;
106 |
107 | this.clear();
108 |
109 | var selector = this.selector +
110 | '[data-target="' + target + '"],' +
111 | this.selector + '[href="' + target + '"]'
112 |
113 | var active = $(selector)
114 | .parents('li')
115 | .addClass('active')
116 |
117 | if (active.parent('.dropdown-menu').length) {
118 | active = active
119 | .closest('li.dropdown')
120 | .addClass('active')
121 | }
122 |
123 | active.trigger('activate.bs.scrollspy')
124 | }
125 |
126 | ScrollSpy.prototype.clear = function () {
127 | $(this.selector)
128 | .parentsUntil(this.options.target, '.active')
129 | .removeClass('active')
130 | }
131 |
132 |
133 | // SCROLLSPY PLUGIN DEFINITION
134 | // ===========================
135 |
136 | function Plugin(option) {
137 | return this.each(function () {
138 | var $this = $(this);
139 | var data = $this.data('bs.scrollspy');
140 | var options = typeof option == 'object' && option;
141 |
142 | if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
143 | if (typeof option == 'string') data[option]()
144 | })
145 | }
146 |
147 | var old = $.fn.scrollspy;
148 |
149 | $.fn.scrollspy = Plugin
150 | $.fn.scrollspy.Constructor = ScrollSpy
151 |
152 |
153 | // SCROLLSPY NO CONFLICT
154 | // =====================
155 |
156 | $.fn.scrollspy.noConflict = function () {
157 | $.fn.scrollspy = old
158 | return this
159 | }
160 |
161 |
162 | // SCROLLSPY DATA-API
163 | // ==================
164 |
165 | $(window).on('load.bs.scrollspy.data-api', function () {
166 | $('[data-spy="scroll"]').each(function () {
167 | var $spy = $(this)
168 | Plugin.call($spy, $spy.data())
169 | })
170 | })
171 |
172 | }(jQuery);
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "private": true,
3 | "name": "welcome-mat",
4 | "version": "0.0.1",
5 | "main": "package.json",
6 | "author": "OpenStreetMap Foundation (https://osmfoundation.org)",
7 | "license": "CC-by © OSMFoundation",
8 | "devDependencies": {
9 | "js-yaml": "^3.13.1",
10 | "tap-spec": "^4.1.1",
11 | "tape": "^4.2.2"
12 | },
13 | "scripts": {
14 | "test": "mct-noreferrer && mct-openstreetmap _posts && tape test/*.js | tap-spec"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/test/mapping.test.js:
--------------------------------------------------------------------------------
1 | var test = require('tape');
2 | var fs = require('fs');
3 | var path = require('path');
4 | var jsyaml = require('js-yaml');
5 |
6 | var paths = [];
7 | // crawl the root and create an array of all the folders that
8 | // contain a _posts folder
9 | var root = getDir('./');
10 | root.forEach(function(folder){
11 | var path = getDir(folder)
12 | if (path == '_posts'){
13 | paths.push(folder);
14 | }
15 | });
16 |
17 | // get all spanish dirs
18 | // refactor this
19 | var getES = getDir('es');
20 | var es = [];
21 | getES.forEach(function(e) {
22 | es.push('es/' + e);
23 | });
24 |
25 | // combine paths + spanish paths
26 | var paths = paths.concat(es);
27 | // get jp dirs
28 | var getJP = getDir('jp');
29 | var jp = [];
30 | getJP.forEach(function(e) {
31 | jp.push('jp/' + e);
32 | });
33 |
34 | // combine paths + jp paths
35 | var paths = paths.concat(jp);
36 |
37 | var categories = [];
38 | var posts = [];
39 |
40 | paths.forEach(function(dir) {
41 | file = fs.readdirSync(dir).filter(function(file) {
42 | var isFile = fs.statSync(path.join(dir, file)).isFile();
43 | if (file[0] != '.' && isFile) {
44 | categories.push(dir +'/' + file);
45 | } else if (file == '_posts') { // get _posts/
46 | var post_path = dir + '/' + file;
47 |
48 | // get any subdirs and then files
49 | var foundSubDirs = getDir(post_path);
50 | if (foundSubDirs) {
51 | foundSubDirs.forEach(function(dir){
52 | this_path = post_path + '/' + dir;
53 | this_path = fs.readdirSync(this_path).filter(function(file) {
54 | var isFile = fs.statSync(path.join(this_path, file)).isFile();
55 | if (file[0] != '.' && isFile) {
56 | posts.push(this_path +'/' + file);
57 | }
58 | });
59 | });
60 | }
61 |
62 | // get the files
63 | post_path = fs.readdirSync(post_path).filter(function(file) {
64 | var isFile = fs.statSync(path.join(post_path, file)).isFile();
65 | if (file[0] != '.' && isFile) {
66 | posts.push(post_path +'/' + file);
67 | }
68 | });
69 |
70 | } else if (file[0] != '.' && !isFile) { // get folder/_posts/
71 | var post_path = dir + '/' + file + '/_posts';
72 | post_path = fs.readdirSync(post_path).filter(function(file) {
73 | var isFile = fs.statSync(path.join(post_path, file)).isFile();
74 | if (file[0] != '.' && isFile) {
75 | posts.push(post_path +'/' + file);
76 | }
77 | });
78 | }
79 | });
80 | });
81 |
82 |
83 | function getDir(srcpath) {
84 | return fs.readdirSync(srcpath).filter(function(file) {
85 | return fs.statSync(path.join(srcpath, file)).isDirectory();
86 | });
87 | }
88 |
89 | function readPost(filename) {
90 | var buffer = fs.readFileSync(filename),
91 | file = buffer.toString('utf8');
92 |
93 | try {
94 | var parts = file.split(/---\s*[\n^]/),
95 | frontmatter = parts[1];
96 |
97 | return {
98 | name: filename,
99 | file: file,
100 | metadata: jsyaml.load(frontmatter),
101 | content: parts[2]
102 | };
103 | } catch(err) {
104 | console.log("\nCould not read metadata, check the syntax of the metadata and front matter:" + filename);
105 | }
106 | }
107 |
108 | function readData(dir, filename) {
109 | var buffer = fs.readFileSync(dir + filename),
110 | file = buffer.toString('utf8');
111 |
112 | try {
113 |
114 | return {
115 | name: filename,
116 | file: file,
117 | metadata: jsyaml.load(file)
118 | };
119 | } catch(err) {}
120 |
121 | }
122 |
123 | ////////////////////////////////////////////////
124 | ////////////////////////////////////////////////
125 | // CATEGORIES
126 | ////////////////////////////////////////////////
127 | ////////////////////////////////////////////////
128 |
129 | categories.forEach(function(post){
130 | var file = readPost(post);
131 |
132 | var metadata = file.metadata;
133 | var content = file.content;
134 |
135 | test(post, function(t) {
136 |
137 | t.ok(metadata.title,'must have a title');
138 | t.equal(metadata.layout,'category','layout must equal "category"');
139 | t.ok(metadata.color,'must have a color');
140 | t.ok(metadata.order,'must have an order');
141 | t.equal(typeof metadata.order,'number','order must be a number');
142 | t.ok(metadata.description,'must have a description');
143 | t.ok(metadata.image,'must have an image');
144 |
145 | t.equal(post.indexOf(' '),-1,'file name must not contain spaces');
146 | t.equal(post.toLowerCase(),post,'file name must be lowercase');
147 | if (!post.match('index.md')) {
148 | t.fail('file name must be index.md');
149 | }
150 |
151 | if (metadata.section) {
152 | t.equal(typeof metadata, 'array', 'section must be formatted as a list');
153 | }
154 |
155 | t.end();
156 | });
157 | });
158 |
159 |
160 | ////////////////////////////////////////////////
161 | ////////////////////////////////////////////////
162 | // POSTS
163 | ////////////////////////////////////////////////
164 | ////////////////////////////////////////////////
165 |
166 | posts.forEach(function(post){
167 | var file = readPost(post);
168 |
169 | var metadata = file.metadata;
170 | var content = file.content;
171 |
172 | test(post, function(t) {
173 |
174 | t.ok(metadata.title,'must have a title');
175 | t.equal(post.indexOf(' '),-1,'file name must not contain spaces');
176 | t.equal(post.toLowerCase(),post,'file name must be lowercase');
177 | if (!post.match('0000-01-')) {
178 | t.fail('file name must start with 0000-01-');
179 | }
180 |
181 | t.end();
182 | });
183 | });
184 |
--------------------------------------------------------------------------------
/what-is-openstreetmap/_posts/0000-01-01-what-is-openstreetmap.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: What is OpenStreetMap?
3 | ---
4 |
5 | OpenStreetMap is a free, editable map of the whole world made by people like you. It was started in 2004 in the UK, out of frustration with the lack of availability of good map data that was free to use.
6 |
7 | OpenStreetMap includes data about roads, buildings, addresses, shops and businesses, points of interest, railways, trails, transit, land use and natural features, and much more.
8 |
9 | The map is created and maintained by nearly 5 million registered users and more than 1 million map contributors in every country in the world, using free tools and software. The data is used by local people, volunteer groups, companies, governments, software developers and more.
10 |
11 | The project has a very lean governance structure run entirely by the volunteers of the
12 | OpenStreetMap Foundation . Financial support comes from the OpenStreetMap Foundation members, including corporate members, as well as
13 | donations .
14 |
--------------------------------------------------------------------------------
/what-is-openstreetmap/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: What is OpenStreetMap?
3 | layout: category
4 | order: 0
5 | color: blue
6 | description: A brief intro to OpenStreetMap
7 | image: GOPR7567.jpg
8 | image-alt: three men planning a field survey to collect OpenStreetMap data
9 | ---
10 |
--------------------------------------------------------------------------------
/who-is-openstreetmap/_posts/0000-01-01-osm-community.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Who makes up the OpenStreetMap community?
3 | ---
4 |
5 | Everyone who participates in the creation and progress of OpenStreetMap is part of the OSM community. There’s also the
6 | OpenStreetMap Foundation , a registered nonprofit in the United Kingdom that supports OpenStreetMap and makes sure it is running smoothly.
7 |
8 | * **Contributors:** people who add or update data on OpenStreetMap. The majority of these are volunteers; some are humanitarian workers or are employed by companies.
9 |
10 | * **Data Consumers:** many different companies, organizations, governments, researchers and individuals use OpenStreetMap data for any number of uses: transportation and routing, GPS and navigation, health care, city planning, cartography, municipal services, academic research, GIS and more. Some of the users of OSM data are
11 | listed here.
12 |
13 | * **Developers:** coders, developers and designers who use OpenStreetMap to make tools like routing, data editing, quality assurance, project management and more.
14 |
15 | * **Local and Regional Communities:** regional, country, state or city organizations that organize OpenStreetMap editing and events in their areas, but some of which are officially organized, others gather informally. Many of these groups organize their own conferences.
16 |
17 | * **Humanitarian Groups:** many humanitarian organizations create data and use OpenStreetMap data to support their projects, either for planning and preparation, logistics, or response. Often there are volunteer mappers who help digitize imagery as well as on-the-ground data collectors and mapping staff.
18 |
--------------------------------------------------------------------------------
/who-is-openstreetmap/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Who is OpenStreetMap?
3 | layout: category
4 | order: 1
5 | color: blue
6 | description: The people and communities of OSM
7 | image: whatishistory_14665124541_52ce01db2c_o_KLL.jpg
8 | image-alt: a group of people posing on stairs after completing a mapping workshop
9 | ---
10 |
--------------------------------------------------------------------------------
/why-openstreetmap/_posts/0000-01-02-why-use-openstreetmap.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Why use OpenStreetMap?
3 | ---
4 |
5 | ## Free and Open
6 | OpenStreetMap is published under an open licence, that allows anyone to access, use and share the data. This creates a level playing field allowing a diverse variety of individuals, communities and organisations to contribute towards creating a shared resource.
7 | ## Global Reach
8 | OpenStreetMap provides global map data in a unified tagging schema, although there are some local variations. Data is available for every country in the world, and in many places, the data quality is excellent. And since it’s open, you can also help improve quality.
9 | ## Local Knowledge
10 | OpenStreetMap emphasizes local knowledge and empowers people across the globe to edit. The barrier to entry is low, and there are many ways to contribute that do not require access to the latest technology. The result is a map made by local experts.
11 | ## Continuous updates
12 | OpenStreetMap has no data releases. Contributions to the map are ingested immediately. You determine how fresh you want your OpenStreetMap data, up to the minute if needed.
13 | ## Agency
14 | As OpenStreetMap contributors, we together hold the keys to the future of the map. Your contributions, be it in map data, novel tools, new people and insights, evangelism or training, help determine the course of OpenStreetMap, and make it a better map for you and everyone else.
15 | ## Giving Back
16 | By building against a shared resource, your organisation can benefit from updates provided by OpenStreetMap’s global community.
17 |
--------------------------------------------------------------------------------
/why-openstreetmap/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Why use OpenStreetMap?
3 | layout: category
4 | order: 2
5 | color: blue
6 | description: What makes OpenStreetMap special?
7 | image: whyshouldweuseOSM_niccolo_rigacci.jpg
8 | image-alt: three people sitting on stairs comparing data collected during an OpenStreetMap field survey
9 | ---
10 |
--------------------------------------------------------------------------------
/working-with-osm-data/_posts/0000-01-04-how-good-is-osm.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: How good is OSM data?
3 | ---
4 |
5 | This is difficult to answer with a simple answer, but “good” should be a starting point. OSM data is created by local communities made up of individual mappers so their activity level often dictates the quality of the map. Also, in some regions, open government data is available to mappers for improving OSM.
6 |
7 | Nonetheless, as OSM compares to the traditional map provider data, and OSM is now often as good or better as what is commercially available. This is evidenced by increased government and corporate usage and contribution.
8 |
9 |
10 | There is one thing for certain about OSM; it is constantly improving in all regions.
11 |
12 | Links below demonstrate some of the statistics that are relevant to make a comparison with third party data:
13 |
14 | - [http://www.missingmaps.org/osmstats/](http://www.missingmaps.org/osmstats/){:target="_blank"}
15 | - [https://mapbox.github.io/osm-analysis-collab/osm-quality](https://mapbox.github.io/osm-analysis-collab/osm-quality){:target="_blank"}
16 |
17 | More research about OpenStreetMap, including many papers on data quality, can be found here:
18 | - [https://wiki.openstreetmap.org/wiki/Research](https://wiki.openstreetmap.org/wiki/Research){:target="_blank"}
19 |
20 | There are a number of quality assurance tools here [https://wiki.openstreetmap.org/wiki/Quality_assurance](https://wiki.openstreetmap.org/wiki/Quality_assurance){:target="_blank"}
21 |
--------------------------------------------------------------------------------
/working-with-osm-data/_posts/0000-01-05-contribute-osm-data.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Organized Editing in OpenStreetMap
3 | ---
4 |
5 | OpenStreetMap is a project powered by its community. While originally supported by individuals, the continuing growth and popularity of OSM have also spawned organized mapping efforts. These have taken shape in the form of not only companies setting up paid data teams to improve OSM data in specific regions or for specific use cases, but also unpaid groups like school classes that are directed to work on OSM.
6 |
7 | Organized mapping efforts are an integral part of today's OSM contribution landscape and, when done well, help make OSM better and more widely known.
8 |
9 | In order to maintain good communications between, and a level playing field for, individual community members and organized editing groups, there is a set of [guidelines for directed and organized editing](https://wiki.openstreetmap.org/wiki/Organised_Editing_Guidelines) such as by companies or school groups. The scope is to set expectations on visibility of mapping efforts and how to communicate with and be reachable by the broader community.
10 |
--------------------------------------------------------------------------------
/working-with-osm-data/_posts/0000-01-06-humanitarian-campaign.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: We’re planning a humanitarian campaign using OSM, what do we need to know?
3 | ---
4 |
5 | If you are just using the data from OpenStreetMap, you only need to abide by the [license](https://www.openstreetmap.org/copyright){:target="_blank"}, which explains how to credit OpenStreetMap and that if you combine other data with OSM, you need to contribute that data back as well.
6 |
7 | If you wish to help create OpenStreetMap data for your work, that’s great! There are a number of organizations who have done something like this, using OSM data after disasters or crises, or mapping ahead of time in places where disasters may occur. OSM data quality is often very good, or if something is missing, you can help map the features that you need. The best way to do this is to contact the local OSM community via the [email list for that country](https://lists.openstreetmap.org/listinfo){:target="_blank"} or their [OSM Forum](https://community.openstreetmap.org){:target="_blank"}, they may know other groups that have already worked there. Be aware that you are not operating on a blank slate; there are many active mappers and groups, and make sure that your participants receive adequate training and understanding of OpenStreetMap before they begin.
8 |
9 | Some humanitarian mapping projects involve on the ground data collection, mapping remotely using imagery, or both. Often combining both can make sure data is complete and accurate. It is also important to work with local people during humanitarian mapping efforts. There are many examples of humanitarian mapping; OSMF does not endorse any particular group, but some active organizations are the the [Humanitarian OpenStreetMap Team](http://www.hotosm.org){:target="_blank"}, the [Missing Maps project](http://www.missingmaps.org){:target="_blank"}, and [Projet Espace OSM Francophone](https://projeteof.org/){:target="_blank"}.
10 |
--------------------------------------------------------------------------------
/working-with-osm-data/_posts/0000-01-07-research-with-osm.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: How can I research with OSM?
3 | ---
4 |
5 | Research is a welcome part of the OSM community. From Kathmandu to Berlin, there is a rich history of research about OSM -- the community, the project, and the data. Before starting out, we encourage you to get in touch with the local OSM community and review the background on OSM research.
6 |
7 | There is an email list for research, [research-announce@lists.openstreetmap.org](mailto:research-announce@lists.openstreetmap.org).
8 |
9 | Suggestions for how to conduct your research and cite OpenStreetMap are [here](https://wiki.openstreetmap.org/wiki/Researcher_Information){:target="_blank"}.
10 |
11 | You can find details on Google Scholar or other web sources that include articles, but here are [some examples](https://wiki.openstreetmap.org/wiki/Research){:target="_blank"} to help you get started.
12 |
13 | **Could OSM provide a letter of support for our research project?**
14 |
15 | As OSM is a distributed, global community with diverse expertise, OSM does not provide an exclusive letter of support for any given topic. We encourage researchers to connect with their local OSM community and/or chapter. The benefit of researchers working within the community is that they can seek guidance and context about the work which will add value to the end product.
16 |
17 | For these reasons, the OSMF Board does not formally give letters of support for research. We do, however, recommend that you contact previous researchers to build on their work. During your research journey, we do encourage you to connect with the community, join the events and share your research. Many researchers have presented at the various State of the Map events around the world. Their perspectives are very welcome and contribute to the corpus of OSM knowledge.
--------------------------------------------------------------------------------
/working-with-osm-data/_posts/0000-01-08-find-a-developer.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Where do we find a good developer or company to build with OSM?
3 | ---
4 |
5 | OSM is a global, open community. There are many organizations and companies that use OSM and there are also developers who build tools and processes using OSM. The OSM Foundation is does not vet developers nor maintain a list of developers.
6 |
7 | We recommend that you join the community, investigate some of the networks and groups involved, and ask questions. There is a lengthy [list of commercial services for OSM on our wiki](https://wiki.openstreetmap.org/wiki/Commercial_OSM_Software_and_Services). Depending where you are in the world, there are local OSM chapters, local country-level mailing lists, as well as local events. Hiring a developer with any niche skills, such as expertise in OSM and the related technological applications is the responsibility of each business.
8 |
9 | The [Get in Touch]({{site.baseurl}}/about-osm-community/get-in-touch/) page has suggestions for how to reach out and talk with the community.
10 |
--------------------------------------------------------------------------------
/working-with-osm-data/_posts/0000-01-09-downloading-and-using.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Downloading and using OSM data
3 | ---
4 |
5 | There are many ways to use OpenStreetMap data. It is possible to download raw data for a certain area, entire countries or regions, or certain features such as roads or buildings. There are also many ways to use use existing sets or of OpenStreetMap data, such as map images, routing software and more.
6 |
7 | If you are interested in downloading raw OpenStreetMap data, [this page](https://wiki.openstreetmap.org/wiki/Downloading_data){:target="_blank"} has more information.
8 |
9 | [Here](https://wiki.openstreetmap.org/wiki/Use_OpenStreetMap){:target="_blank"} is more information on uses of OpenStreetMap such as in maps and for routing.
--------------------------------------------------------------------------------
/working-with-osm-data/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Working with OpenStreetMap Data
3 | layout: category
4 | order: 13
5 | color: blue
6 | description: How to use, research and edit OSM
7 | image: whatisOSM_Civic_Use_DanielXOneilr.jpg
8 | image-alt: a person working on a laptop computer, editing OpenStreetMap data
9 | ---
10 |
--------------------------------------------------------------------------------