├── .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 |
18 |
19 |   42 |
43 |
-------------------------------------------------------------------------------- /_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 |
15 | {% include translate.html swap='Next' lang=page.lang %}: 16 | 17 | {{ next.title }} 18 | 19 | 20 |

{{next.summary}}

21 |
22 | {% endunless %} 23 | {% unless forloop.first == false %} 24 | {% if catg_posts.size > 1 %} 25 | 26 | 27 |
28 |
29 | {% include translate.html swap='This is the last guide in this category.' lang=page.lang %} 30 |
31 | {% if currentCategory %} 32 | 35 | {% endif %} 36 | 38 |
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 | 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 | 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 |
    86 | 87 | {% include svgs/logo.svg %} 88 | 89 |
    90 |

    {{page.title}}

    91 |

    Does your organization want to work with OSM? Find what you need to know!

    92 |
    93 |
    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 |
    11 |
    12 | 13 | {% include search.html %} 14 | 15 | {% assign pages = site.pages | where: "layout", "category" | where: "lang", lang | sort: "order" %} 16 | {% for page in pages %} 17 | 18 | {% assign langDir = page.lang | append: '/' %} 19 | {% assign title = page.dir | downcase | replace: langDir,'' | replace: '/','' %} 20 | {% assign guideCount = 0 %}{% for post in site.categories[title] %}{% if post.lang == page.lang %}{% assign guideCount = guideCount | plus: 1 %}{% endif %}{% endfor %} 21 | 22 |
    23 |
    24 | 25 | {% if page.image %} 26 | {% if page.image contains '.svg' %} 27 | {% assign illo = page.image | prepend: 'svgs/' %} 28 | {% include {{illo}} %} 29 | {% else %} 30 | {{page.image-alt}} 31 | {% endif %} 32 | {% endif %} 33 | 34 |
    35 |
    36 | 37 |
    38 |
    40 |

    {{page.title}}

    41 |

    {{page.description}}

    42 | {% if guideCount > 1 or topicCount > 1 %} 43 |
    {{guideCount}} {% include translate.html swap='guide' lang=page.lang %}{% if guideCount > 1 %}s{% endif %}
    44 | {% endif %} 45 |
    46 |
    47 | 48 |
    49 |
    50 | {% endfor %} 51 |
    52 |
    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 | --------------------------------------------------------------------------------