├── .gitignore ├── .rubocop.yml ├── .rubocop_todo.yml ├── Gemfile ├── LICENSE.txt ├── README.md ├── Rakefile ├── bin └── json_resume ├── examples └── prateek_cv.json ├── extras └── resume_html │ ├── core-page.html │ ├── index.html │ └── public │ ├── css │ ├── book.png │ ├── bookmark.png │ ├── bootstrap.min.css │ ├── briefcase.png │ ├── edit.png │ ├── envelope.png │ ├── file.png │ ├── gear.png │ ├── github.png │ ├── globe.png │ ├── icons.data.png.css │ ├── icons.data.svg.css │ ├── icons.fallback.css │ ├── institution.png │ ├── mobile.css │ ├── mortar-board.png │ ├── music.png │ ├── phone.png │ ├── screen.css │ ├── star-o.png │ ├── th-list.png │ └── user.png │ ├── images │ └── resume.png │ └── js │ └── grunticon.js ├── json_resume.gemspec ├── lib ├── json_resume.rb └── json_resume │ ├── formatter.rb │ ├── formatter_html.rb │ ├── formatter_latex.rb │ ├── formatter_md.rb │ ├── json_resume.rb │ ├── reader.rb │ └── version.rb ├── locale ├── en.yml ├── es.yml ├── fi.yml ├── ge.yml ├── ja.yml ├── pl.yml ├── pt.yml └── zh_cn.yml ├── spec ├── json_resume │ ├── formatter_html_spec.rb │ ├── formatter_latex_spec.rb │ ├── formatter_spec.rb │ └── reader_spec.rb └── spec_helper.rb └── templates ├── classic_tex.mustache ├── default_html.mustache ├── default_md.mustache └── default_tex.mustache /.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | *.gem 3 | *.rbc 4 | .bundle 5 | .config 6 | .yardoc 7 | Gemfile.lock 8 | InstalledFiles 9 | _yardoc 10 | coverage 11 | doc/ 12 | lib/bundler/man 13 | pkg 14 | rdoc 15 | spec/reports 16 | test/tmp 17 | test/version_tmp 18 | tmp 19 | -------------------------------------------------------------------------------- /.rubocop.yml: -------------------------------------------------------------------------------- 1 | inherit_from: .rubocop_todo.yml 2 | -------------------------------------------------------------------------------- /.rubocop_todo.yml: -------------------------------------------------------------------------------- 1 | # This configuration was generated by `rubocop --auto-gen-config` 2 | # on 2014-12-29 14:04:27 +0530 using RuboCop version 0.28.0. 3 | # The point is for the user to remove these configuration records 4 | # one by one as the offenses are removed from the code base. 5 | # Note that changes in the inspected code, or installation of new 6 | # versions of RuboCop, may require this file to be generated again. 7 | 8 | # Offense count: 8 9 | Metrics/AbcSize: 10 | Max: 22 11 | 12 | # Offense count: 1 13 | # Configuration parameters: CountComments. 14 | Metrics/ClassLength: 15 | Max: 253 16 | 17 | # Offense count: 36 18 | # Configuration parameters: AllowURI, URISchemes. 19 | Metrics/LineLength: 20 | Max: 213 21 | 22 | # Offense count: 4 23 | # Configuration parameters: CountComments. 24 | Metrics/MethodLength: 25 | Max: 30 26 | 27 | # Offense count: 1 28 | Style/AccessorMethodName: 29 | Enabled: true 30 | 31 | # Offense count: 1 32 | # Cop supports --auto-correct. 33 | # Configuration parameters: EnforcedStyle, SupportedStyles. 34 | Style/AndOr: 35 | Enabled: true 36 | 37 | # Offense count: 1 38 | Style/ClassVars: 39 | Enabled: false 40 | 41 | # Offense count: 1 42 | # Configuration parameters: Keywords. 43 | Style/CommentAnnotation: 44 | Enabled: true 45 | 46 | # Offense count: 11 47 | Style/Documentation: 48 | Enabled: false 49 | 50 | # Offense count: 1 51 | Style/EachWithObject: 52 | Enabled: true 53 | 54 | # Offense count: 1 55 | Style/EvenOdd: 56 | Enabled: true 57 | 58 | # Offense count: 1 59 | # Configuration parameters: MinBodyLength. 60 | Style/GuardClause: 61 | Enabled: true 62 | 63 | # Offense count: 1 64 | # Configuration parameters: EnforcedStyle, SupportedStyles. 65 | Style/MethodName: 66 | Enabled: true 67 | 68 | # Offense count: 1 69 | # Configuration parameters: NamePrefix, NamePrefixBlacklist. 70 | Style/PredicateName: 71 | Enabled: true 72 | 73 | # Offense count: 1 74 | # Configuration parameters: EnforcedStyle, SupportedStyles. 75 | Style/RaiseArgs: 76 | Enabled: true 77 | 78 | # Offense count: 2 79 | # Configuration parameters: MaxSlashes. 80 | Style/RegexpLiteral: 81 | Enabled: true 82 | 83 | # Offense count: 2 84 | # Cop supports --auto-correct. 85 | # Configuration parameters: AllowAsExpressionSeparator. 86 | Style/Semicolon: 87 | Enabled: true 88 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | # Specify your gem's dependencies in json_resume.gemspec 4 | gemspec 5 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014 Prateek Agarwal 2 | 3 | MIT License 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining 6 | a copy of this software and associated documentation files (the 7 | "Software"), to deal in the Software without restriction, including 8 | without limitation the rights to use, copy, modify, merge, publish, 9 | distribute, sublicense, and/or sell copies of the Software, and to 10 | permit persons to whom the Software is furnished to do so, subject to 11 | the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be 14 | included in all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # JsonResume 2 | 3 | JsonResume creates pretty versions of resume from a single JSON input file. Output formats are specifically customized to modern resume templates. Also, there are a ton of customizations to the templates possible, to make your own version of resume created easily and super quickly. 4 | 5 | ## Installation 6 | 7 | $ gem install json_resume 8 | 9 | ## Usage 10 | 11 | ### Create a sample JSON input file to start 12 | 13 | $ json_resume sample 14 | 15 | A [sample](https://github.com/prat0318/json_resume/blob/master/examples/prateek_cv.json) `prateek_cv.json` is generated in the current working directory(cwd). 16 | 17 | Modify it as per the needs, and remove or keep rest of the fields empty. 18 | 19 | Note: YAML files are also supported. Try `$ json_resume sample --in=yaml`. 20 | 21 | ### Conversion 22 | 23 | * Syntax 24 | 25 | ``` 26 | json_resume convert [--template=/path/to/custom/template] 27 | [--out=html|html_pdf|tex|tex_pdf|md] 28 | [--locale=es|en|ge|fi|pl|pt|zh_cn|ja] 29 | [--dest_dir=/path/to/put/output/files] 30 | [--theme=default|classic] 31 | 32 | can be /path/to/json OR "{'json':'string'}" OR http://raw.json 33 | ``` 34 | 35 | NEW: YAML files are also supported. Pass path/to/yaml file (must have .yaml or .yml). 36 | 37 | * Default (HTML) version 38 | 39 | ``` 40 | $ json_resume convert prateek_cv.json 41 | ``` 42 | 43 | A directory `resume/` will be generated in cwd, which can be put hosted on /var/www or on github pages. ([Sample](http://prat0318.github.io/json_resume/html_version/resume_with_icons/)) 44 | 45 | 46 | * HTML\* version 47 | 48 | `html` version without icons can be generated by giving `icons` as `false` : ([Sample](http://prat0318.github.io/json_resume/html_version/resume_without_icons/)) 49 | 50 | ``` 51 | "settings": { 52 | "icons" : false 53 | }, 54 | ``` 55 | 56 | * PDF version from HTML ([Sample](http://prat0318.github.io/json_resume/html_version/resume_with_icons/resume.pdf)) 57 | 58 | ``` 59 | $ json_resume convert --out=html_pdf prateek_cv.json 60 | ``` 61 | 62 | * LaTeX version ([Sample](https://www.writelatex.com/read/ynhgbrnmtrbw)) 63 | 64 | ``` 65 | $ json_resume convert --out=tex prateek_cv.json 66 | ``` 67 | 68 | LaTex also includes a ``classic`` theme. Usage: ``--theme=classic`` ([Sample](https://www.writelatex.com/read/xscbhfpxwkqh)). 69 | 70 | * PDF version from LaTeX ([Sample](https://www.writelatex.com/read/ynhgbrnmtrbw)) 71 | 72 | ``` 73 | $ json_resume convert --out=tex_pdf prateek_cv.json 74 | ``` 75 | 76 | * Markdown version ([Sample](https://gist.github.com/prat0318/9c6e36fdcfd6a854f1f9)) 77 | 78 | ``` 79 | $ json_resume convert --out=md prateek_cv.json 80 | ``` 81 | 82 | ## i18n Support 83 | 84 | Support for ``en``, ``ge``, ``es``, ``fi``, ``pl`` and ``pt`` right now. Pull requests for others are welcome. 85 | 86 | ``` 87 | $ json_resume convert --locale=es prateek_cv.json 88 | ``` 89 | 90 | It is also possible to define a custom location for locale definitions. 91 | Pass the option `--locale_dir=path/to/defs`. 92 | In this location there should be the definitions available. 93 | The default one is `en.yml`, others may be provided as well. 94 | This is useful if you want to define new headings. 95 | 96 | ## Markup Language 97 | 98 | JSON is parsed as per the `markdown` standards. This implies all this works- 99 | - \*\* **bold** \*\*, 100 | - \_ _italics_ \_, 101 | - script<sup>sup<sup/>, 102 | - script<sub>sub<sub/>, 103 | - \[[href](#)\]\(#\), 104 | - <<[http://github.com](http://github.com)>> 105 | 106 | ## Customization 107 | 108 | #### Mustache Templates 109 | * Output is created using mustache templates. They are located in `templates/`. These can be modified and given as `--template=/path/to/template` to `convert`. 110 | 111 | #### Adding your own icons to json_resume 112 | 1. Download the svg(s) you would like to use from a site like [IcoMoon](https://icomoon.io/app/) or [IconFinder](https://www.iconfinder.com) and chose size as 16X16. 113 | 2. Download the official ``json_resume`` svgs from [the json_resume_icon repo zip](https://github.com/NoahHines/json_resume_icons/archive/master.zip). Unzip it, svgs are present in `/SVG`. 114 | 3. Drag all svgs (including yours) onto the [grumpicon](http://www.grumpicon.com/) and then "downlode it". 115 | 4. Drag all the files (``.css`` and ``.png``) from the ``grunticon`` folder into your local ``json_resume`` gem's folder ``json_resume-1.X.X/extras/resume_html/public/css/``, replacing existing files ([Read this](http://stackoverflow.com/questions/2827496/where-are-my-ruby-gems) to find your gem's location in your machine). 116 | 5. Modify your HTML [mustache template](#mustache-templates) to include your icons. Specifically, edit the ``div`` class in the template to include your new grunticon (```
```, where "user" is the SVG name). You can also check grunticon's generated ``preview.html`` file to verify the icon class name. 117 | 6. Run ``json_resume convert --template=/path/to/template ``, and you should be able to see the changes in the generated HTML. Also, steps 1-5 are to be done just once and the icons will be stored within your local gem. 118 | 119 | ## Changelog 120 | 121 | ### v1.0 122 | * Glyphicons are now replaced by Font-Awesome icons. 123 | * HTML version has a responsive design. 124 | * Supports i18n. (Supporting ``es``, ``pt`` right now). 125 | * New classic theme for latex format. 126 | 127 | ## Contributing 128 | 129 | Many awesome formats can be created by writing new mustache templates. We :heart: **Pull Requests**. 130 | 131 | 1. Fork it 132 | 2. Create your feature branch (`git checkout -b my-new-feature`) 133 | 3. Commit your changes (`git commit -am 'Add some feature'`) 134 | 4. Push to the branch (`git push origin my-new-feature`) 135 | 5. Create new Pull Request 136 | 137 | ### Installation of local fork 138 | If you want to checkout your local changes do the following: 139 | 1. `gem build json_resume.gemspec` 140 | 2. `sudo gem install ./json_resume-x.y.z.gem` 141 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require 'bundler/gem_tasks' 2 | -------------------------------------------------------------------------------- /bin/json_resume: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | require 'i18n' 4 | require 'thor' 5 | require 'mustache' 6 | require_relative '../lib/json_resume' 7 | require 'zlib' 8 | require 'pdfkit' 9 | require 'rest-client' 10 | require 'json' 11 | require 'yaml' 12 | 13 | WL_URL = 'https://www.overleaf.com/docs' 14 | 15 | class String 16 | def red 17 | "\033[31m#{self}\033[0m" 18 | end 19 | 20 | def green 21 | "\033[32m#{self}\033[0m" 22 | end 23 | end 24 | 25 | class JsonResumeCLI < Thor 26 | desc 'convert /path/to/json/file', 'converts the json to pretty resume format' 27 | option :out, default: 'html', banner: 'output_type', desc: 'html|html_pdf|tex|tex_pdf|md' 28 | option :template, banner: 'template_path', desc: 'path to customized template (optional)' 29 | option :locale_dir, desc: 'path to locale definitions (optional)' 30 | option :locale, default: 'en', banner: 'locale', desc: 'en|ge|es|pl|pt|zh_cn|ja' 31 | option :theme, default: 'default', banner: 'theme', desc: 'default|classic' 32 | option :dest_dir, default: 'current', banner: 'dest_dir', desc: 'location of dest. dir (optional)' 33 | def convert(json_input) 34 | assign_i18n(options[:locale]) 35 | puts "Generating the #{options[:out]} type..." 36 | dest = options[:dest_dir] == 'current' ? Dir.pwd : options[:dest_dir] 37 | begin 38 | puts send('convert_to_' + options[:out], json_input, get_template(options), dest) 39 | rescue Encoding::InvalidByteSequenceError 40 | puts "ERROR: You need to 'export LC_CTYPE=en_US.UTF-8' ...".green 41 | end 42 | end 43 | 44 | desc 'sample', 'Generates a sample json file in cwd' 45 | option :in, default: 'json', banner: 'input_type', desc: 'json|yaml' 46 | def sample 47 | cwd = Dir.pwd 48 | file_names = [] 49 | if options[:in] == 'yaml' 50 | file_names = convert_sample_to_yaml 51 | else 52 | json_file_paths = Dir["#{@@orig_locn}/../examples/*.json"] 53 | file_names = json_file_paths.map { |x| File.basename(x) } 54 | FileUtils.cp json_file_paths, cwd 55 | end 56 | msg = "Generated #{file_names.join(' ')} in #{cwd}/".green 57 | msg += "\nYou can now modify it and call: json_resume convert " 58 | puts msg 59 | end 60 | 61 | no_commands do 62 | @@orig_locn = File.expand_path(File.dirname(__FILE__)) 63 | 64 | def convert_sample_to_yaml 65 | cwd = Dir.pwd 66 | json_file_paths = Dir["#{@@orig_locn}/../examples/*.json"] 67 | json_file_paths.map do |json_file_path| 68 | dest = File.basename(json_file_path).gsub(/json$/, 'yaml') 69 | yaml_string = (JSON.parse(File.read(json_file_path))).to_yaml 70 | File.open("#{cwd}/#{dest}", 'w') { |f| f.write(yaml_string) } 71 | dest 72 | end 73 | end 74 | 75 | def get_template(options) 76 | return options[:template] if options[:template] 77 | out_type = options[:out].split('_').first # html for both html, html_pdf 78 | out_type = 'html' if out_type == 'pdf' 79 | theme = options[:theme] 80 | template_path = "#{@@orig_locn}/../templates/#{theme}_#{out_type}.mustache" 81 | if !(File.exist? template_path) && theme != 'default' 82 | puts "Theme #{theme} doesn't exist for #{options[:out]} type yet! Using default...".red 83 | template_path = "#{@@orig_locn}/../templates/default_#{out_type}.mustache" 84 | end 85 | template_path 86 | end 87 | 88 | def convert_to_html(json_input, template, dest = Dir.pwd, dir_name = 'resume') 89 | dest_dir = "#{dest}/#{dir_name}" 90 | FileUtils.mkdir_p dest_dir 91 | FileUtils.cp_r(Dir["#{@@orig_locn}/../extras/resume_html/*"], dest_dir) 92 | msg = generate_file(json_input, template, 'html', "#{dest_dir}/page.html") 93 | msg += "\nPlace #{dest_dir}/ in /var/www/ to host." 94 | msg 95 | end 96 | 97 | def convert_to_pdf(json_input, template, dest = Dir.pwd) 98 | puts "Defaulting to 'html_pdf'..." 99 | convert_to_html_pdf(json_input, template, dest) 100 | end 101 | 102 | def convert_to_html_pdf(json_input, template, dest = Dir.pwd) 103 | tmp_dir = '.tmp_resume' 104 | convert_to_html(json_input, template, dest, tmp_dir) 105 | PDFKit.configure do |config| 106 | wkhtmltopdf_path = `which wkhtmltopdf`.to_s.strip 107 | config.wkhtmltopdf = wkhtmltopdf_path unless wkhtmltopdf_path.empty? 108 | config.default_options = { 109 | footer_right: "Page [page] of [toPage] .\n", 110 | footer_font_size: 10, 111 | footer_font_name: 'Georgia' 112 | } 113 | end 114 | html_file = File.new("#{dest}/#{tmp_dir}/core-page.html") 115 | # Purge the mobile css properties so that wkhtmlpdf not uses them. 116 | File.open("#{dest}/#{tmp_dir}/public/css/mobile.css", 'w') {} 117 | 118 | pdf_options = { 119 | margin_top: 2.0, 120 | margin_left: 0.0, 121 | margin_right: 0.0, 122 | margin_bottom: 4.0, 123 | page_size: 'Letter' 124 | } 125 | kit = PDFKit.new(html_file, pdf_options) 126 | 127 | begin 128 | kit.to_file(dest + '/resume.pdf') 129 | rescue Errno::ENOENT => e 130 | puts "\nTry: sudo apt-get update; sudo apt-get install libxtst6 libfontconfig1".green 131 | raise e 132 | end 133 | FileUtils.rm_rf "#{dest}/#{tmp_dir}" 134 | msg = "\nGenerated resume.pdf at #{dest}.".green 135 | msg 136 | end 137 | 138 | def convert_to_tex(json_input, template, dest = Dir.pwd, filename = 'resume.tex') 139 | generate_file(json_input, template, 'latex', "#{dest}/#{filename}") 140 | end 141 | 142 | def convert_to_tex_pdf(json_input, template, dest = Dir.pwd) 143 | file1 = 'resume' 144 | filename = "#{file1}.tex" 145 | convert_to_tex(json_input, template, dest, filename) 146 | if `which pdflatex` == '' 147 | puts 'It looks like pdflatex is not installed...'.red 148 | puts 'Either install it with instructions at...' 149 | puts 'http://dods.ipsl.jussieu.fr/fast/pdflatex_install.html' 150 | return use_write_latex(dest, filename) 151 | end 152 | if `kpsewhich moderncv.cls` == '' 153 | puts 'It looks liks moderncv package for tex is not installed'.red 154 | puts 'Read about it here: http://ctan.org/pkg/moderncv' 155 | return use_write_latex(dest, filename) 156 | end 157 | system("pdflatex -shell-escape -interaction=nonstopmode #{dest}/#{filename}") 158 | ['.tex', '.out', '.aux', '.log'].each do |ext| 159 | FileUtils.rm "#{dest}/#{file1}#{ext}" 160 | end 161 | msg = "\nPDF is ready at #{dest}/#{file1}.pdf".green 162 | msg 163 | end 164 | 165 | def use_write_latex(dest, filename) 166 | reply = ask 'Create PDF online using writeLatex/overleaf ([y]n)?' 167 | if reply == '' || reply == 'y' 168 | return convert_using_write_latex(dest, filename) 169 | end 170 | msg = "Latex file created at #{dest}/#{filename}".green 171 | msg 172 | end 173 | 174 | def convert_using_write_latex(dest, filename) 175 | tex_file = File.read("#{dest}/#{filename}") 176 | msg = '' 177 | RestClient.post(WL_URL, snip: tex_file, splash: 'none') do |response, _, _, &_| 178 | FileUtils.rm "#{dest}/#{filename}" 179 | msg = "\nPDF is ready at #{response.headers[:location]}".green 180 | end 181 | msg 182 | end 183 | 184 | def convert_to_md(json_input, template, dest = Dir.pwd) 185 | generate_file(json_input, template, 'markdown', "#{dest}/resume.md") 186 | end 187 | 188 | def assign_i18n(locale) 189 | if options[:locale_dir] 190 | locale_dir = "#{File.expand_path(options[:locale_dir])}/*.yml" 191 | else 192 | locale_dir = "#{@@orig_locn}/../locale/*.yml" 193 | end 194 | puts "Using #{locale_dir} for locale files" 195 | I18n.load_path = Dir[locale_dir] 196 | I18n.enforce_available_locales = true 197 | I18n.locale = locale.to_sym 198 | end 199 | 200 | def i18n(text) 201 | text.gsub(/##(\w*?)##/) { I18n.t! Regexp.last_match[1], scope: 'headings' } 202 | end 203 | 204 | def generate_file(json_input, template, output_type, dest) 205 | resume_obj = JsonResume.new(json_input, 'output_type' => output_type) 206 | mustache_obj = Mustache.render(i18n(File.read(template)), resume_obj.reader.hash) 207 | File.open(dest, 'w') { |f| f.write(mustache_obj) } 208 | "\nGenerated files present at #{dest}".green 209 | end 210 | end 211 | end 212 | 213 | JsonResumeCLI.start(ARGV) 214 | -------------------------------------------------------------------------------- /examples/prateek_cv.json: -------------------------------------------------------------------------------- 1 | { 2 | "settings": { 3 | "icons" : true 4 | }, 5 | "firstname": "Prateek", 6 | "familyname": "Agarwal", 7 | "linkedin_id": "prat0318", 8 | "github_id": "prat0318", 9 | "bio_data": { 10 | "email": "prat0318 @ cs.utexas.edu", 11 | "phone": "+1 (512) 698-3649", 12 | "website": "http://prat0318.github.io", 13 | "stars": ["Ruby","Python","Git","Cartooning"], 14 | "summary": { 15 | "points":[ 16 | "Competent at managing responsibilities in a high-volume atmosphere", 17 | "Hard worker, quick learner, and ability to assume responsibility" 18 | ] 19 | }, 20 | "github_projects": { 21 | "details": [ 22 | { 23 | "project_name": "prat0318/2048-tetris", 24 | "tagline": "Live at [2048-tetris.com](http://2048-tetris.com)", 25 | "description": [ 26 | "Wrote a Tetris variant of 2048 game, 1M+ unique visits", 27 | "Made it to the front page of Hacker News for a day(~150 pts), mentioned in TechCrunch." 28 | ] 29 | }, 30 | { 31 | "project_name": "prat0318/gitator", 32 | "tagline": "Live at [Gitator.com](http://gitator.com)", 33 | "description": [ 34 | "Finds relevant repositories based on an user's GitHub profile.", 35 | "Written in Ruby on Sinatra and uses Github's Octokit gem" 36 | ] 37 | }, 38 | { 39 | "project_name": "prat0318/json_resume", 40 | "tagline": "Convert JSON data to pretty resumes in .html, .tex, .md", 41 | "description": [ 42 | "Static personal page and resume design using Mustache.", 43 | "Current resume is generated using json_resume." 44 | ] 45 | } 46 | ] 47 | }, 48 | "skills": { 49 | "details": [ 50 | { 51 | "type": "Programming Languages", 52 | "items": [ 53 | "Ruby", 54 | "Python", 55 | "Java", 56 | "C++", 57 | "Javascript", 58 | "PHP" 59 | ] 60 | }, 61 | { 62 | "type": "Web Frameworks", 63 | "items": [ 64 | "Sinatra", 65 | "Django", 66 | "Rails", 67 | "Apache" 68 | ] 69 | }, 70 | { 71 | "type": "Databases", 72 | "items": [ 73 | "MySQL", 74 | "PostgreSQL", 75 | "IBM Informix", 76 | "IBM DB2" 77 | ] 78 | } 79 | ] 80 | }, 81 | "education": { 82 | "show_gpa": true, 83 | "schools": [ 84 | { 85 | "degree": "Master of Science", 86 | "major": "Computer Science", 87 | "institution": "University of Texas at Austin", 88 | "graduation_year": 2015, 89 | "gpa": "3.55/4" 90 | }, 91 | { 92 | "degree": "Bachelor of Technology (Hons.)", 93 | "major": "Computer Science", 94 | "institution": "Indian Insitute of Technology, Kharagpur (IN)", 95 | "graduation_year": 2009, 96 | "gpa": "8.91/10" 97 | } 98 | ] 99 | }, 100 | "acad_achievements": { 101 | "items": [ 102 | "Was among the top 5% in the institute merit list of the undergraduate batch at IIT Kharagpur.", 103 | "Secured 383rd Rank in IIT-JEE 2005, an exam conducted by Indian Institute of Technology(s)." 104 | ] 105 | }, 106 | "experience": { 107 | "items": [ 108 | { 109 | "title": "Graduate Research Assistant", 110 | "organisation": "CTR, UT Austin", 111 | "location": "", 112 | "from": "Sept. 2013", 113 | "to": "Jan. 2014", 114 | "details": [ 115 | "Developed a common web interface <> to search through different datasets and output aggregate results and ensuring easy pluggability of new datasets." 116 | ], 117 | "technology_used": { 118 | "tools": [ 119 | "Python", 120 | "Django", 121 | "South", 122 | "PostgreSQL" 123 | ] 124 | } 125 | }, 126 | { 127 | "title": "SDE II (Software Development Engineer II)", 128 | "organisation": "Flipkart", 129 | "location": "India", 130 | "from": "Apr. 2013", 131 | "to": "Jul. 2013", 132 | "details": [ 133 | "Wrote a ruby gem _Morsel_ to traverse through active record trees to purge old records. It helped in limiting the production database size and keeping the data clean." 134 | ] 135 | }, 136 | { 137 | "title": "Software Development Engineer", 138 | "organisation": "Flipkart", 139 | "location": "India", 140 | "from": "Jun. 2011", 141 | "to": "Mar. 2013", 142 | "details": [ 143 | "Was part of a team which developed the warehouse module in RoR framework from scratch. It now scales to around 10X as compared to the ERP system existed.", 144 | "Designed warehouse stock snapshots and stock ledger framework using Pig scripts to make the supply chain system legally compliant." 145 | ], 146 | "technology_used": { 147 | "tools": [ 148 | "Ruby", 149 | "Java", 150 | "Pig", 151 | "Active Records", 152 | "MySQL" 153 | ] 154 | } 155 | }, 156 | { 157 | "title": "Software Engineer", 158 | "organisation": "IBM Software Labs", 159 | "location": "India", 160 | "from": "Jul. 2009", 161 | "to": "Jun. 2011", 162 | "details": [ 163 | "Handled high priority issues for JDBC client driver for IBM Informix database.", 164 | "Was awarded Smart CADian award for resolving an obscure deadlock situation, making Informix JDBC driver more robust." 165 | ], 166 | "technology_used": { 167 | "tools": [ 168 | "Java", 169 | "IBM Informix", 170 | "IBM DB2" 171 | ] 172 | } 173 | } 174 | ] 175 | }, 176 | "other_projects": { 177 | "items": [ 178 | { 179 | "headline": "Designed product _Omerta_, a multi-user chat room application in j2me using Sun Wireless Toolkit platform.", 180 | "points": [ 181 | "Was awarded 1st position for the product in [Envision](http://www.ecell-iitkgp.org/envision.php), Product Innovation Contest, IIT KGP.", 182 | "Was awarded 1st position for the product in Javawise, J2ME s/w Development Contest at IIT Kharagpur, 2008 and 2009 continuously." 183 | ] 184 | } 185 | ] 186 | }, 187 | "grad_courses": [ 188 | { 189 | "name": "Distributed Computing", 190 | "url": "http://www.cs.utexas.edu/users/lorenzo/corsi/cs380d/13F/" 191 | }, 192 | { 193 | "name": "Feature Oriented Programming", 194 | "url": "http://www.cs.utexas.edu/users/dsb/cs392f" 195 | }, 196 | { 197 | "name": "Multicore Programming", 198 | "url": "http://www.cs.utexas.edu/~pingali/CS395T/2013fa" 199 | } 200 | ], 201 | "undergrad_courses": [ 202 | { 203 | "name": "Network Systems", 204 | "url": "http://www.facweb.iitkgp.ernet.in/~agupta/netlab/" 205 | }, 206 | { 207 | "name": "Graph Theory", 208 | "url": "http://cse.iitkgp.ac.in/~agupta/graph/" 209 | } 210 | ], 211 | "research_experience": { 212 | "items": [ 213 | { 214 | "title":"Undergraduate project", 215 | "organisation": "Sanyog Lab, IIT Kharagpur", 216 | "from": "Jul. 2008", 217 | "to": "May 2009", 218 | "points": [ 219 | "Designing and Formal modelling of embedded systems for project Sanyog.", 220 | "Skills Developed: Low level system design, theorem verification using Prolog and Coq" 221 | ] 222 | }, 223 | { 224 | "title":"Summer Intern", 225 | "organisation": "Network Systems Lab, IIT Kharagpur", 226 | "from": "May 2008", 227 | "to": "Jun. 2008", 228 | "points": [ 229 | "Design and simulation of currently published Pull-based Freshness Schemes in C++." 230 | ] 231 | }, 232 | { 233 | "title":"Summer Intern", 234 | "organisation": "Telemedicine Lab, IIT Kharagpur", 235 | "from": "May 2007", 236 | "to": "Jun. 2007", 237 | "points": [ 238 | "Web based medical image browsing and annotation tools for PDA devices in .NET platform." 239 | ] 240 | } 241 | ] 242 | }, 243 | "extra_curricular": { 244 | "items": [ 245 | "Was awarded 2nd position in Bionetics, Coding Event, Genesis 09 at IIT Kharagpur.", 246 | "Microsoft Student Partner of IIT Kharagpur from the period July 08 – June 09." 247 | ] 248 | }, 249 | "papers": { 250 | "items": [ 251 | { 252 | "authors":"Michl Dugls, Mrclo Dsconi", 253 | "title":"Some exotic dummy title like potentials arising from string compactifications", 254 | "misc":"arXiv: 1206.1885, June 2012" 255 | } 256 | ] 257 | }, 258 | "patents": { 259 | "items": [ 260 | { 261 | "patent_id":"US Patent X,XXX,634", 262 | "url":"", 263 | "issuance_date":"September 15, 1992", 264 | "title":"Another exotic title like bed cover with an inflatable human form." 265 | } 266 | ] 267 | }, 268 | "memberships": { 269 | "committees": [ 270 | "Member of the ACM awesomest humans secret group, 2008-present" 271 | ] 272 | } 273 | } 274 | } 275 | -------------------------------------------------------------------------------- /extras/resume_html/core-page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Resume 5 | 6 | 7 | 8 | 9 | 10 |
11 |
12 |
13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /extras/resume_html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Resume 5 | 6 | 7 | 8 | 15 | 16 | 17 |
18 | 19 |
20 | 27 |
28 | 29 | 30 | 31 | 34 | -------------------------------------------------------------------------------- /extras/resume_html/public/css/book.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prat0318/json_resume/d2aa8d297a3563b6401f6022bc05279393d3b2a5/extras/resume_html/public/css/book.png -------------------------------------------------------------------------------- /extras/resume_html/public/css/bookmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prat0318/json_resume/d2aa8d297a3563b6401f6022bc05279393d3b2a5/extras/resume_html/public/css/bookmark.png -------------------------------------------------------------------------------- /extras/resume_html/public/css/briefcase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prat0318/json_resume/d2aa8d297a3563b6401f6022bc05279393d3b2a5/extras/resume_html/public/css/briefcase.png -------------------------------------------------------------------------------- /extras/resume_html/public/css/edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prat0318/json_resume/d2aa8d297a3563b6401f6022bc05279393d3b2a5/extras/resume_html/public/css/edit.png -------------------------------------------------------------------------------- /extras/resume_html/public/css/envelope.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prat0318/json_resume/d2aa8d297a3563b6401f6022bc05279393d3b2a5/extras/resume_html/public/css/envelope.png -------------------------------------------------------------------------------- /extras/resume_html/public/css/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prat0318/json_resume/d2aa8d297a3563b6401f6022bc05279393d3b2a5/extras/resume_html/public/css/file.png -------------------------------------------------------------------------------- /extras/resume_html/public/css/gear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prat0318/json_resume/d2aa8d297a3563b6401f6022bc05279393d3b2a5/extras/resume_html/public/css/gear.png -------------------------------------------------------------------------------- /extras/resume_html/public/css/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prat0318/json_resume/d2aa8d297a3563b6401f6022bc05279393d3b2a5/extras/resume_html/public/css/github.png -------------------------------------------------------------------------------- /extras/resume_html/public/css/globe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prat0318/json_resume/d2aa8d297a3563b6401f6022bc05279393d3b2a5/extras/resume_html/public/css/globe.png -------------------------------------------------------------------------------- /extras/resume_html/public/css/icons.data.png.css: -------------------------------------------------------------------------------- 1 | 2 | .icon-book { 3 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAQCAYAAADJViUEAAAA8klEQVQoU6WSgQ2CMBBFYQOdQDZQJxA3cATcACeQEXACcQOcQDaQEdhAnUD/I1clDQlNbPIDPe7d/V6Joz9W7LGJ9ueAenvldD5cKHgMgA/KKX34beCFyiNFMsUW0lpqh/BKgbsBpZ7PEThX7CVxvHoItwos7SPv/gKg60lqpHwIO8uVPiB/0XUnbe35HVimQMiUsTyTOil1nbGxGenmhxgk86ilBJhKjwCQFO43MaY/cyGF3C3wXMIl52+A8c8Up9bVIG4CtxEwU2b8Y/c6LFhpk5oyB2PjZnamujMsGlGo74wFgskUaQ0Kl+f/2wH8L+UD270uEbdDQyQAAAAASUVORK5CYII='); 4 | background-repeat: no-repeat; 5 | } 6 | 7 | 8 | .icon-bookmark { 9 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAQCAYAAADAvYV+AAAAXElEQVQoU2NkIAEwAtUuAGJ5YvSAFP8nRiFIzahi5JCiSmg8xBZR2ExeCFRYAMQBQDwfnzNAChOQFIDYcA3IJqMrhOlxADI2ADE/SDHISgEgbsCTRgxANoIUEw0AuisVVDAmmBMAAAAASUVORK5CYII='); 10 | background-repeat: no-repeat; 11 | } 12 | 13 | 14 | .icon-briefcase { 15 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAkUlEQVQ4T2NkwAQBQKH1WMRBQoFAvAFZjhGLwgagGMiQAjS5CVDNIHk4ABkAUpyPJKYAZAsA8QU0AwyA/A9A/ABJfCLIAJAgPw4nExL+ADLgPyFV+OQHhwEOtPKCI9Dg/VDDkdko9uELA0WgSlCUggAo6u5jc+ngCERKEtJHWFJGT/fERswEbJmJWM1gdRQbAAC+xBnJ7nsHcgAAAABJRU5ErkJggg=='); 16 | background-repeat: no-repeat; 17 | } 18 | 19 | 20 | .icon-edit { 21 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA80lEQVQ4T6WSAQ3CMBBFNwUgYThAwlAAOGAKAAXgAFDAHAAKmIRJAAdDAfzXXEkJWbdkl/y0S++/Xu+WJgMjlX8s7aRpD9bScs5ab1IJoDTzpgPQ6LyWFtLFcgsAb2kmVR0AKr1Lp6CKZ18A5qvpoLUwSN0H4M08FTPfLymTmi5Amzm3fiQxgH8zzWNC/uavmWe0AbyZUTGdkZX9Y44BSFxLW4n90VY8VEM/XLRVgImRVdJEYvb8A3vz+dUBeCMJJPvItFnZB+PDTJTSIwA5AOXN7TBg/G3pC/PPA6ADEDSKA5Lagpu5zFfj8jwgdnP0bDDgA37hQIGLpIMTAAAAAElFTkSuQmCC'); 22 | background-repeat: no-repeat; 23 | } 24 | 25 | 26 | .icon-envelope { 27 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAx0lEQVQ4T2NkoBAwUqifAWRAABDnk2nQRJABH4CYn0wDPoAMeADE8mQa8BBkgAEQHyDDFR+BehxgBoAcsACI9Yl0yUWgugSQWpAB/4G4AYgboXQ9AUNg6kB66mEGgPRcAOJAIFaAugY9XB5CbQWF2Xqo1+EugFkKihGQyQuhNCx6J0L5IGeDXCgA04DsAmSXbwByEqGuAYmDbJ0PxKA0gwJwGQBSBHINyCAQAGmE24psAj4D0C3DyqeKAQXY/EaU9cC0Q3FuBAAP9iTpVHbbeAAAAABJRU5ErkJggg=='); 28 | background-repeat: no-repeat; 29 | } 30 | 31 | 32 | .icon-file { 33 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAc0lEQVQ4T2NkYGC4AMT6QIwLMAIlDKDqMNSAJP/j0QySAqk5AMQLoBhFOSkG2AN1JqIbQqoBINtRDCHWgASgRgUkt08Asj/A/EcoDAqwBOBHmBgxLsAWxgeBgg7EumDUAOzJdLgFIqHsjC0UJgIFQSmUAQDI1SYRLzXoNwAAAABJRU5ErkJggg=='); 34 | background-repeat: no-repeat; 35 | } 36 | 37 | 38 | .icon-gear { 39 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA9klEQVQ4T62TjQ0BQRCFXQV0gArQgQ5QgesAFVACFTgVoAM6oIPTARXwPpmRuUtOLmGTyc7uzL6dNz9J48eVVLxPdT8120L7peqfCDCWU0uSSQ6SkT2a2HlltjyCOQA/bs3Ab/3g5A86urtLura/XRxgLX1WMx0eUQGAA+jNAHI2Sr1wt5E+L1Mg/LYEjr4GUjxx3C/NAJ1McnQ7FJ6l0DGS0LjKPkQ3xOEvAPxG1j1MgKso3IzCSTvyqQJ6OYk40BexpDud08jtb2WExt6Qr9pj6QibRaUeFlHuUVS1ciYHn4XYyrR4YS6+DZNzpXFqDVPMTW39BW1nNhE31U/CAAAAAElFTkSuQmCC'); 40 | background-repeat: no-repeat; 41 | } 42 | 43 | 44 | .icon-github { 45 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABJUlEQVQ4T6WTjW0CMQxGywRlA2CDMgEwQcsEvRHKBBwbwATQCSgTcJ0AOkHZADaA70X2yYoCqtRIn5Jz4uef5DpP/xydzL+r71epCvaL1iupKcWKgLEObCUgpXGUcSIBbIcDcN7/oRqcBxECgIi/NrP5Ir1JJwP2NdcSQdZSY5mkbQBszu0wAHfME6oMgH0oUVICQBxJ3xYld/RvMj3bx8ICJ8A1N94jhGA7rSkzAWjMs8RVfTxwZusk9aRPqcpLYJMe3Bs091AqobbIAKhxJqUGhUG63IC/Ed5D4xlgxHkpjSUaOpW+DLDR/B5gbfoOYCY9HConB4daa7/mHwvSvsb4lB1Ck9oUtXYA10wpxaccAqYsyMYPAqbMJh7ydf43ls48tN0AtH06EeSzgcYAAAAASUVORK5CYII='); 46 | background-repeat: no-repeat; 47 | } 48 | 49 | 50 | .icon-globe { 51 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABKElEQVQ4T6WS7VGCMRCEpQKlAqECoAJeK8AOgArECoQKwAqECsAKgA7sQO1AK9B9MnfMJQT/eDM7SS63ex9J6+qf1ir4NzqPhEnwf2n/LBxquaJAo4Ct4D4IfeHWiG9a7wQET+bBkPfCo7C2oHutT0I7iEDuRhEEKPs9kF0dgZXASgz7nkBlVJIMgbllos+ZX9gKkay0QjWIYQOBlpIAikPhKDSFAEdEmE28W1jiJPBjpLP+zL/TystEe/VqogABPmn2D8K3sKxUlQl4Cx5HRkrEf10h48pamMvBgKJBXgtTgfmUlg2RIX1cyEZLG6uGFxoL2bDLj1RmYgY8IQN+EXj/jp1TbPmV6T/2DREf7/8pNJFcCnCmHYInoRRE+IWHsryaQC3mT98vpgw/EQsBfkEAAAAASUVORK5CYII='); 52 | background-repeat: no-repeat; 53 | } 54 | 55 | 56 | .icon-institution { 57 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAQCAYAAAAbBi9cAAAA3klEQVQ4T+2TYQ0CMQyF7xSAA3AADuAUgIRDATjgUAA4OBzggMMBEsABKID3kTVpLoxc9oc/NHnZ1nav7drlWVzGMi2FuXAUDkITc89bhr7OM2ElQNSWqxS7QHr3RiPy0SHrIrXPEqKLMOpyM+JDlgVElVAKg0Syje7VVhrlQNYTbgL1W5Zn7SndbMQj6EOgCWSU+cdudJ4IRGB/Chni422o1wIBplbFn+gHb8R/2grD0CFaWoaOVGFvNtR0Cx++yx6FdQ3Fp79l3f22vkcAIoaKYUsVhncB0TOVwd0rXjKnRKECypkzAAAAAElFTkSuQmCC'); 58 | background-repeat: no-repeat; 59 | } 60 | 61 | 62 | .icon-mortar-board { 63 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAQCAYAAAD52jQlAAABF0lEQVQ4T7WUjQ0BQRCFXQWUQAV0QAeUQAWUQAV0IDqgAqcCSjgdUAHvS2Zl7qzNkphksn+z33s7LorWH6LIYE5UM1Z2laXyoLyk7sWgHYMAI2NRaXOv3MUEAhQXuAEyynDvS24mgAivaAHlScMvQZ/KEZgFp7jD5fxH+Mm5rXxPaQE/wFQ5MJF+QoSn8mQSh6/w0KV2ATMC4xJrXoAQ8wBhZI0481p4KIc4LZVHU2ePNQK4AUL/EWFOvH1BvqcBtFLhuqmudWXuUsZqKnybuCRxt41AY1t3bXK3Ft46TgAulEsb2wn4VWf0GyMfoQ+d8GmMXAVzv+YI8dLGqGZwStPPVthLuMs68tCN3Wg6ywL5opx/qa+hT28cOWHav2kBAAAAAElFTkSuQmCC'); 64 | background-repeat: no-repeat; 65 | } 66 | 67 | 68 | .icon-music { 69 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAz0lEQVQ4T2NkoBAwkqDfAKjWHogDgHgjEE8A6SVkgANQjT9UkwKSZQeBbJAcVgMEgOL9UE0gNjaA14AGoI56Al6jvwEXgS5aAMQHoF4D+R9nGMC8AArpDVBND5C8BJInaABcAZawoL8BoKiMh/r9A5AG8UHpB28YIHvhAlCxPppXMKIRlkxBNjgCsQLMBiCNzYCJQPECkKEgpyyAOhHZErgNUCcnIHkBFDMgPWAAMgBkKz+aE0FRCMo0BAEsMBqAKkE57SMQg2wAOQ9kMEEAAHTCLBG2sIf/AAAAAElFTkSuQmCC'); 70 | background-repeat: no-repeat; 71 | } 72 | 73 | 74 | .icon-phone { 75 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAAQCAYAAADNo/U5AAAAxElEQVQoU2NkIAMwQvVMANL6QJwIxA8ImQPS1ADE9VCFC4F0AjGaPgAV8SMpdASyD+DTCLLpP5qCQCB/AyFNIAX+UEUgPy0gxnkgP8yHKjQE0heI0SQADTGQv0B+AfkJL4AFeQBQ1XqoSpDzQM7ECWCaQApAiuOxaFSAOh8kD4oSBmRN6BofAAUKgLgBiA2ghoGcX4iuCSQHSh35eFzXiE0TSL0D1AZ7NM0fQbbi0gRTC3JWAtR5oKgAueIBIU1YXUmWJgB76R7hYyR6BgAAAABJRU5ErkJggg=='); 76 | background-repeat: no-repeat; 77 | } 78 | 79 | 80 | .icon-star-o { 81 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAeElEQVQYV2NkwAQOQKEDyMKMaGoUoApACh/A5NAVTQBKLADiAiBOQFYE4oB0gsAFIAYpBCkygIodAJkkgCTxAcl6uDjMOpgA3Aokaz8guwnkFpjVB6CKwJqQTdoP5H8EYpACkBv5gdgQWRHIkSAMMg0GQKaAPHIBABwZF3oLR/pGAAAAAElFTkSuQmCC'); 82 | background-repeat: no-repeat; 83 | } 84 | 85 | 86 | .icon-th-list { 87 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAsUlEQVQ4T2NkoBAwAvVvAGJ+JHMmAtkXgHg+EWZ/ABnwH01hI5B/AIj3E2EAA1UMKADaJIBkG8hLD4AYJE4IgL2gAMTySCovAtkfgNgBi/fQDXwIMgCkGDkQSQkD6gQiugsKobFwnlAAAOU/grwACkADqGKQYaA0AAKgsAFhfOACyIAJQKyPpAoUBrCEhBw72AwCGzDwCQnkBVgYgJzZAPXCAmj4EAwDIgIbtxJQGFAEAIBbLFlNN48YAAAAAElFTkSuQmCC'); 88 | background-repeat: no-repeat; 89 | } 90 | 91 | 92 | .icon-user { 93 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAAQCAYAAADNo/U5AAAAyUlEQVQoU2NkIAMwYtETABTLh4o/ANKFQPwBWR26pgSg5Hw0g0AaDZE1omsCmciPxXaQbRNg4siaBICC73F4cSNQHORsMEC36T8OTY1A8QZcmkAS9WgaPwL5Ctj8BBKMB+KLUAUJQFofiEHOAvnFHogfAPFCmPNAfrkPxCAaBA4A8QaoIgcgDTIAJjcRyC4A+QlkEixeoPrwUoogTRegTiFGA0hNIkgTrhDDZUgj2ZpAHgeFDrEA7DwFaGDAQgifZpAFDdhSOUEbAfVsIfGDsbFJAAAAAElFTkSuQmCC'); 94 | background-repeat: no-repeat; 95 | } 96 | 97 | -------------------------------------------------------------------------------- /extras/resume_html/public/css/icons.data.svg.css: -------------------------------------------------------------------------------- 1 | 2 | .icon-book { 3 | background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C%21--%20Generated%20by%20IcoMoon.io%20--%3E%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20width%3D%2215%22%20height%3D%2216%22%20viewBox%3D%220%200%2015%2016%22%3E%0A%3Cg%3E%0A%09%3Cline%20stroke-width%3D%221%22%20x1%3D%22%22%20y1%3D%22%22%20x2%3D%22%22%20y2%3D%22%22%20stroke%3D%22%23449FDB%22%20opacity%3D%22%22%3E%3C/line%3E%0A%3C/g%3E%0A%09%3Cpath%20d%3D%22M0.089%2012.071q0-0.036%200.027-0.241t0.036-0.33q0.009-0.071-0.027-0.192t-0.027-0.174q0.018-0.098%200.071-0.188t0.147-0.21%200.147-0.21q0.205-0.339%200.402-0.817t0.268-0.817q0.027-0.089%200.004-0.268t-0.004-0.25q0.027-0.098%200.152-0.25t0.152-0.205q0.188-0.321%200.375-0.821t0.223-0.804q0.009-0.080-0.022-0.286t0.004-0.25q0.036-0.116%200.196-0.272t0.196-0.201q0.17-0.232%200.379-0.754t0.246-0.862q0.009-0.071-0.027-0.228t-0.018-0.237q0.018-0.071%200.080-0.161t0.161-0.205%200.152-0.188q0.071-0.107%200.147-0.272t0.134-0.313%200.143-0.321%200.174-0.286%200.237-0.21%200.321-0.103%200.424%200.049l-0.009%200.027q0.339-0.080%200.455-0.080h6.795q0.661%200%201.018%200.5t0.161%201.161l-2.446%208.089q-0.321%201.063-0.638%201.371t-1.147%200.308h-7.759q-0.241%200-0.339%200.134-0.098%200.143-0.009%200.384%200.214%200.625%201.286%200.625h8.241q0.259%200%200.5-0.138t0.313-0.371l2.679-8.813q0.063-0.196%200.045-0.509%200.339%200.134%200.527%200.384%200.357%200.509%200.161%201.152l-2.455%208.089q-0.17%200.571-0.683%200.96t-1.094%200.388h-8.241q-0.688%200-1.326-0.478t-0.888-1.174q-0.214-0.598-0.018-1.134zM4.393%206.571q-0.036%200.116%200.018%200.201t0.179%200.085h5.429q0.116%200%200.228-0.085t0.147-0.201l0.188-0.571q0.036-0.116-0.018-0.201t-0.179-0.085h-5.429q-0.116%200-0.228%200.085t-0.147%200.201zM5.134%204.286q-0.036%200.116%200.018%200.201t0.179%200.085h5.429q0.116%200%200.228-0.085t0.147-0.201l0.188-0.571q0.036-0.116-0.018-0.201t-0.179-0.085h-5.429q-0.116%200-0.228%200.085t-0.147%200.201z%22%20fill%3D%22%23000000%22%3E%3C/path%3E%0A%3C/svg%3E%0A'); 4 | background-repeat: no-repeat; 5 | } 6 | 7 | 8 | .icon-bookmark { 9 | background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C%21--%20Generated%20by%20IcoMoon.io%20--%3E%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20width%3D%2211%22%20height%3D%2216%22%20viewBox%3D%220%200%2011%2016%22%3E%0A%3Cg%3E%0A%09%3Cline%20stroke-width%3D%221%22%20x1%3D%22%22%20y1%3D%22%22%20x2%3D%22%22%20y2%3D%22%22%20stroke%3D%22%23449FDB%22%20opacity%3D%22%22%3E%3C/line%3E%0A%3C/g%3E%0A%09%3Cpath%20d%3D%22M0%2013.652v-11.509q0-0.304%200.174-0.554t0.469-0.366q0.188-0.080%200.393-0.080h9.357q0.205%200%200.393%200.080%200.295%200.116%200.469%200.366t0.174%200.554v11.509q0%200.304-0.174%200.554t-0.469%200.366q-0.17%200.071-0.393%200.071-0.429%200-0.741-0.286l-3.938-3.786-3.938%203.786q-0.321%200.295-0.741%200.295-0.205%200-0.393-0.080-0.295-0.116-0.469-0.366t-0.174-0.554z%22%20fill%3D%22%23000000%22%3E%3C/path%3E%0A%3C/svg%3E%0A'); 10 | background-repeat: no-repeat; 11 | } 12 | 13 | 14 | .icon-briefcase { 15 | background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C%21--%20Generated%20by%20IcoMoon.io%20--%3E%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%0A%3Cg%3E%0A%09%3Cline%20stroke-width%3D%221%22%20x1%3D%22%22%20y1%3D%22%22%20x2%3D%22%22%20y2%3D%22%22%20stroke%3D%22%23449FDB%22%20opacity%3D%22%22%3E%3C/line%3E%0A%3C/g%3E%0A%09%3Cpath%20d%3D%22M0%2012.286v-4.286h6v1.429q0%200.232%200.17%200.402t0.402%200.17h2.857q0.232%200%200.402-0.17t0.17-0.402v-1.429h6v4.286q0%200.589-0.42%201.009t-1.009%200.42h-13.143q-0.589%200-1.009-0.42t-0.42-1.009zM0%207.143v-3.429q0-0.589%200.42-1.009t1.009-0.42h3.143v-1.429q0-0.357%200.25-0.607t0.607-0.25h5.143q0.357%200%200.607%200.25t0.25%200.607v1.429h3.143q0.589%200%201.009%200.42t0.42%201.009v3.429h-16zM5.714%202.286h4.571v-1.143h-4.571v1.143zM6.857%209.143v-1.143h2.286v1.143h-2.286z%22%20fill%3D%22%23000000%22%3E%3C/path%3E%0A%3C/svg%3E%0A'); 16 | background-repeat: no-repeat; 17 | } 18 | 19 | 20 | .icon-edit { 21 | background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C%21--%20Generated%20by%20IcoMoon.io%20--%3E%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%0A%3Cg%3E%0A%09%3Cline%20stroke-width%3D%221%22%20x1%3D%22%22%20y1%3D%22%22%20x2%3D%22%22%20y2%3D%22%22%20stroke%3D%22%23449FDB%22%20opacity%3D%22%22%3E%3C/line%3E%0A%3C/g%3E%0A%09%3Cpath%20d%3D%22M0%2011.143v-7.429q0-1.063%200.754-1.817t1.817-0.754h7.429q0.563%200%201.045%200.223%200.134%200.063%200.161%200.205%200.027%200.152-0.080%200.259l-0.438%200.438q-0.125%200.125-0.286%200.071-0.205-0.054-0.402-0.054h-7.429q-0.589%200-1.009%200.42t-0.42%201.009v7.429q0%200.589%200.42%201.009t1.009%200.42h7.429q0.589%200%201.009-0.42t0.42-1.009v-1.125q0-0.116%200.080-0.196l0.571-0.571q0.134-0.134%200.313-0.063t0.179%200.259v1.696q0%201.063-0.754%201.817t-1.817%200.754h-7.429q-1.063%200-1.817-0.754t-0.754-1.817zM5.714%2011.429v-2.571l6-6%202.571%202.571-6%206h-2.571zM6.571%209.714h0.857v0.857h0.5l1.036-1.036-1.357-1.357-1.036%201.036v0.5zM8.429%207.571q0.143%200.143%200.295-0.009l3.125-3.125q0.152-0.152%200.009-0.295t-0.295%200.009l-3.125%203.125q-0.152%200.152-0.009%200.295zM12.286%202.286l0.821-0.821q0.25-0.25%200.607-0.25t0.607%200.25l1.357%201.357q0.25%200.25%200.25%200.607t-0.25%200.607l-0.821%200.821z%22%20fill%3D%22%23000000%22%3E%3C/path%3E%0A%3C/svg%3E%0A'); 22 | background-repeat: no-repeat; 23 | } 24 | 25 | 26 | .icon-envelope { 27 | background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C%21--%20Generated%20by%20IcoMoon.io%20--%3E%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%0A%3Cg%3E%0A%09%3Cline%20stroke-width%3D%221%22%20x1%3D%22%22%20y1%3D%22%22%20x2%3D%22%22%20y2%3D%22%22%20stroke%3D%22%23449FDB%22%20opacity%3D%22%22%3E%3C/line%3E%0A%3C/g%3E%0A%09%3Cpath%20d%3D%22M0%2013.429v-7.089q0.393%200.438%200.902%200.777%203.232%202.196%204.438%203.080%200.509%200.375%200.826%200.585t0.844%200.429%200.982%200.219h0.018q0.455%200%200.982-0.219t0.844-0.429%200.826-0.585q1.518-1.098%204.446-3.080%200.509-0.348%200.893-0.777v7.089q0%200.589-0.42%201.009t-1.009%200.42h-13.143q-0.589%200-1.009-0.42t-0.42-1.009zM0%203.911q0-0.696%200.371-1.161t1.058-0.464h13.143q0.58%200%201.004%200.42t0.424%201.009q0%200.705-0.438%201.348t-1.089%201.098q-3.357%202.33-4.179%202.902-0.089%200.063-0.379%200.272t-0.482%200.339-0.464%200.29-0.513%200.241-0.446%200.080h-0.018q-0.205%200-0.446-0.080t-0.513-0.241-0.464-0.29-0.482-0.339-0.379-0.272q-0.813-0.571-2.339-1.629t-1.83-1.272q-0.554-0.375-1.045-1.031t-0.491-1.219z%22%20fill%3D%22%23000000%22%3E%3C/path%3E%0A%3C/svg%3E%0A'); 28 | background-repeat: no-repeat; 29 | } 30 | 31 | 32 | .icon-file { 33 | background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C%21--%20Generated%20by%20IcoMoon.io%20--%3E%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%0A%3Cg%3E%0A%09%3Cline%20stroke-width%3D%221%22%20x1%3D%22%22%20y1%3D%22%22%20x2%3D%22%22%20y2%3D%22%22%20stroke%3D%22%23449FDB%22%20opacity%3D%22%22%3E%3C/line%3E%0A%3C/g%3E%0A%09%3Cpath%20d%3D%22M0%2015.143v-14.286q0-0.357%200.25-0.607t0.607-0.25h7.143v4.857q0%200.357%200.25%200.607t0.607%200.25h4.857v9.429q0%200.357-0.25%200.607t-0.607%200.25h-12q-0.357%200-0.607-0.25t-0.25-0.607zM9.143%204.571v-4.214q0.196%200.125%200.321%200.25l3.643%203.643q0.125%200.125%200.25%200.321h-4.214z%22%20fill%3D%22%23000000%22%3E%3C/path%3E%0A%3C/svg%3E%0A'); 34 | background-repeat: no-repeat; 35 | } 36 | 37 | 38 | .icon-gear { 39 | background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C%21--%20Generated%20by%20IcoMoon.io%20--%3E%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%0A%3Cg%3E%0A%09%3Cline%20stroke-width%3D%221%22%20x1%3D%22%22%20y1%3D%22%22%20x2%3D%22%22%20y2%3D%22%22%20stroke%3D%22%23449FDB%22%20opacity%3D%22%22%3E%3C/line%3E%0A%3C/g%3E%0A%09%3Cpath%20d%3D%22M0%208.973v-1.982q0-0.107%200.071-0.205t0.17-0.116l1.661-0.25q0.125-0.411%200.348-0.821-0.357-0.509-0.955-1.232-0.089-0.107-0.089-0.214%200-0.089%200.080-0.205%200.232-0.321%200.879-0.96t0.844-0.638q0.116%200%200.232%200.089l1.232%200.955q0.393-0.205%200.813-0.339%200.143-1.214%200.259-1.661%200.063-0.25%200.321-0.25h1.982q0.125%200%200.219%200.076t0.103%200.192l0.25%201.643q0.438%200.143%200.804%200.33l1.268-0.955q0.080-0.080%200.214-0.080%200.116%200%200.223%200.089%201.152%201.063%201.473%201.518%200.063%200.071%200.063%200.196%200%200.107-0.071%200.205-0.134%200.188-0.455%200.594t-0.482%200.629q0.232%200.446%200.366%200.875l1.634%200.25q0.116%200.018%200.188%200.112t0.071%200.21v1.982q0%200.107-0.071%200.205t-0.179%200.116l-1.652%200.25q-0.17%200.482-0.348%200.813%200.313%200.446%200.955%201.232%200.089%200.107%200.089%200.223t-0.080%200.205q-0.241%200.33-0.884%200.964t-0.839%200.634q-0.107%200-0.232-0.080l-1.232-0.964q-0.393%200.205-0.813%200.339-0.143%201.214-0.259%201.661-0.063%200.25-0.321%200.25h-1.982q-0.125%200-0.219-0.076t-0.103-0.192l-0.25-1.643q-0.438-0.143-0.804-0.33l-1.259%200.955q-0.089%200.080-0.223%200.080-0.125%200-0.223-0.098-1.125-1.018-1.473-1.5-0.063-0.089-0.063-0.205%200-0.107%200.071-0.205%200.134-0.188%200.455-0.594t0.482-0.629q-0.241-0.446-0.366-0.884l-1.634-0.241q-0.116-0.018-0.188-0.112t-0.071-0.21zM4.571%208q0%200.946%200.67%201.616t1.616%200.67%201.616-0.67%200.67-1.616-0.67-1.616-1.616-0.67-1.616%200.67-0.67%201.616z%22%20fill%3D%22%23000000%22%3E%3C/path%3E%0A%3C/svg%3E%0A'); 40 | background-repeat: no-repeat; 41 | } 42 | 43 | 44 | .icon-github { 45 | background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C%21--%20Generated%20by%20IcoMoon.io%20--%3E%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%0A%3Cg%3E%0A%09%3Cline%20stroke-width%3D%221%22%20x1%3D%22%22%20y1%3D%22%22%20x2%3D%22%22%20y2%3D%22%22%20stroke%3D%22%23449FDB%22%20opacity%3D%22%22%3E%3C/line%3E%0A%3C/g%3E%0A%09%3Cpath%20d%3D%22M0%208q0-1.866%200.92-3.442t2.496-2.496%203.442-0.92%203.442%200.92%202.496%202.496%200.92%203.442q0%202.241-1.308%204.031t-3.379%202.478q-0.241%200.045-0.353-0.063t-0.112-0.268v-1.884q0-0.866-0.464-1.268%200.509-0.054%200.915-0.161t0.839-0.348%200.723-0.594%200.473-0.938%200.183-1.344q0-1.080-0.705-1.839%200.33-0.813-0.071-1.821-0.25-0.080-0.723%200.098t-0.821%200.393l-0.339%200.214q-0.83-0.232-1.714-0.232t-1.714%200.232q-0.143-0.098-0.379-0.241t-0.746-0.344-0.768-0.121q-0.393%201.009-0.063%201.821-0.705%200.759-0.705%201.839%200%200.759%200.183%201.339t0.469%200.938%200.719%200.598%200.839%200.348%200.915%200.161q-0.357%200.321-0.438%200.92-0.188%200.089-0.402%200.134t-0.509%200.045-0.585-0.192-0.496-0.558q-0.17-0.286-0.433-0.464t-0.442-0.214l-0.179-0.027q-0.188%200-0.259%200.040t-0.045%200.103%200.080%200.125%200.116%200.107l0.063%200.045q0.196%200.089%200.388%200.339t0.281%200.455l0.089%200.205q0.116%200.339%200.393%200.549t0.598%200.268%200.621%200.063%200.496-0.031l0.205-0.036q0%200.339%200.004%200.795t0.004%200.482q0%200.161-0.116%200.268t-0.357%200.063q-2.071-0.688-3.379-2.478t-1.308-4.031z%22%20fill%3D%22%23000000%22%3E%3C/path%3E%0A%3C/svg%3E%0A'); 46 | background-repeat: no-repeat; 47 | } 48 | 49 | 50 | .icon-globe { 51 | background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C%21--%20Generated%20by%20IcoMoon.io%20--%3E%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%0A%3Cg%3E%0A%09%3Cline%20stroke-width%3D%221%22%20x1%3D%22%22%20y1%3D%22%22%20x2%3D%22%22%20y2%3D%22%22%20stroke%3D%22%23449FDB%22%20opacity%3D%22%22%3E%3C/line%3E%0A%3C/g%3E%0A%09%3Cpath%20d%3D%22M0%208q0-1.866%200.92-3.442t2.496-2.496%203.442-0.92%203.442%200.92%202.496%202.496%200.92%203.442-0.92%203.442-2.496%202.496-3.442%200.92-3.442-0.92-2.496-2.496-0.92-3.442zM2.018%204.973q0.063%200.063%200.107%200.071%200.036%200.009%200.045%200.080t0.022%200.098%200.103-0.027q0.080%200.071%200.027%200.17%200.009-0.009%200.393%200.241%200.17%200.152%200.188%200.188%200.027%200.098-0.089%200.161-0.009-0.018-0.080-0.080t-0.080-0.036q-0.027%200.045%200.004%200.165t0.094%200.112q-0.063%200-0.085%200.143t-0.022%200.317-0.009%200.21l0.018%200.009q-0.027%200.107%200.049%200.308t0.192%200.174q-0.116%200.027%200.179%200.384%200.054%200.071%200.071%200.080%200.027%200.018%200.107%200.067t0.134%200.089%200.089%200.094q0.036%200.045%200.089%200.201t0.125%200.21q-0.018%200.054%200.085%200.179t0.094%200.205q-0.009%200-0.022%200.009t-0.022%200.009q0.027%200.063%200.138%200.125t0.138%200.116q0.009%200.027%200.018%200.089t0.027%200.098%200.071%200.018q0.018-0.179-0.214-0.554-0.134-0.223-0.152-0.259-0.027-0.045-0.049-0.138t-0.040-0.129q0.018%200%200.054%200.013t0.076%200.031%200.067%200.036%200.018%200.027q-0.027%200.063%200.018%200.156t0.107%200.165%200.152%200.17%200.107%200.116q0.054%200.054%200.125%200.174t0%200.121q0.080%200%200.179%200.089t0.152%200.179q0.045%200.071%200.071%200.232t0.045%200.214q0.018%200.063%200.076%200.121t0.112%200.085l0.143%200.071t0.116%200.063q0.045%200.018%200.165%200.094t0.192%200.103q0.089%200.036%200.143%200.036t0.129-0.022%200.121-0.031q0.134-0.018%200.259%200.134t0.188%200.188q0.321%200.17%200.491%200.098-0.018%200.009%200.004%200.067t0.071%200.138%200.080%200.129%200.049%200.076q0.045%200.054%200.161%200.134t0.161%200.134q0.054-0.036%200.063-0.080-0.027%200.071%200.063%200.179t0.161%200.089q0.125-0.027%200.125-0.286-0.277%200.134-0.438-0.161%200-0.009-0.022-0.049t-0.036-0.076-0.022-0.076%200-0.067%200.045-0.027q0.080%200%200.089-0.031t-0.018-0.112-0.036-0.116q-0.009-0.071-0.098-0.179t-0.107-0.134q-0.045%200.080-0.143%200.071t-0.143-0.080q0%200.009-0.013%200.049t-0.013%200.058q-0.116%200-0.134-0.009%200.009-0.027%200.022-0.156t0.031-0.201q0.009-0.036%200.049-0.107t0.067-0.129%200.036-0.112-0.040-0.085-0.156-0.022q-0.17%200.009-0.232%200.179-0.009%200.027-0.027%200.094t-0.045%200.103-0.080%200.063q-0.063%200.027-0.214%200.018t-0.214-0.045q-0.116-0.071-0.201-0.259t-0.085-0.33q0-0.089%200.022-0.237t0.027-0.223-0.049-0.219q0.027-0.018%200.080-0.085t0.089-0.094q0.018-0.009%200.040-0.013t0.040%200%200.036-0.013%200.027-0.054q-0.009-0.009-0.036-0.027-0.027-0.027-0.036-0.027%200.063%200.027%200.254-0.013t0.246%200.013q0.134%200.098%200.196-0.018%200-0.009-0.022-0.085t-0.004-0.121q0.045%200.241%200.259%200.080%200.027%200.027%200.138%200.045t0.156%200.045q0.027%200.018%200.063%200.049t0.049%200.040%200.045-0.004%200.076-0.058q0.089%200.125%200.107%200.214%200.098%200.357%200.17%200.393%200.063%200.027%200.098%200.018t0.040-0.085%200-0.125-0.013-0.112l-0.009-0.071v-0.161l-0.009-0.071q-0.134-0.027-0.165-0.107t0.013-0.165%200.134-0.165q0.009-0.009%200.071-0.031t0.138-0.058%200.112-0.071q0.188-0.17%200.134-0.313%200.063%200%200.098-0.080-0.009%200-0.045-0.027t-0.067-0.045-0.040-0.018q0.080-0.045%200.018-0.143%200.045-0.027%200.067-0.098t0.067-0.089q0.080%200.107%200.188%200.018%200.063-0.071%200.009-0.143%200.045-0.063%200.183-0.094t0.165-0.085q0.063%200.018%200.071-0.018t0.009-0.107%200.027-0.107q0.036-0.045%200.134-0.080t0.116-0.045l0.152-0.098q0.027-0.036%200-0.036%200.161%200.018%200.277-0.098%200.089-0.098-0.054-0.179%200.027-0.054-0.027-0.085t-0.134-0.049q0.027-0.009%200.103-0.004t0.094-0.013q0.134-0.089-0.063-0.143-0.152-0.045-0.384%200.107-0.018%200.009-0.085%200.085t-0.121%200.085q0.018%200%200.040-0.045t0.045-0.098%200.031-0.063q0.054-0.063%200.196-0.134%200.125-0.054%200.464-0.107%200.304-0.071%200.455%200.098-0.018-0.018%200.085-0.116t0.129-0.107q0.027-0.018%200.134-0.040t0.134-0.067l0.018-0.196q-0.107%200.009-0.156-0.063t-0.058-0.188q0%200.018-0.054%200.071%200-0.063-0.040-0.071t-0.103%200.009-0.080%200.009q-0.089-0.027-0.134-0.067t-0.071-0.147-0.036-0.134q-0.018-0.045-0.085-0.094t-0.085-0.094q-0.009-0.018-0.022-0.049t-0.027-0.058-0.036-0.049-0.049-0.022-0.063%200.045-0.067%200.089-0.040%200.045q-0.027-0.018-0.054-0.013t-0.040%200.009-0.040%200.027-0.045%200.031q-0.027%200.018-0.076%200.027t-0.076%200.018q0.134-0.045-0.009-0.098-0.089-0.036-0.143-0.027%200.080-0.036%200.067-0.107t-0.076-0.125h0.045q-0.009-0.036-0.076-0.076t-0.156-0.076-0.116-0.054q-0.071-0.045-0.304-0.085t-0.295-0.004q-0.045%200.054-0.040%200.094t0.036%200.125%200.031%200.112q0.009%200.054-0.049%200.116t-0.058%200.107q0%200.063%200.125%200.138t0.089%200.192q-0.027%200.071-0.143%200.143t-0.143%200.107q-0.045%200.071-0.013%200.165t0.094%200.147q0.018%200.018%200.013%200.036t-0.031%200.040-0.049%200.036-0.058%200.031l-0.027%200.018q-0.098%200.045-0.183-0.054t-0.121-0.232q-0.063-0.223-0.143-0.268-0.205-0.071-0.259%200.009-0.045-0.116-0.366-0.232-0.223-0.080-0.518-0.036%200.054-0.009%200-0.134-0.063-0.134-0.17-0.107%200.027-0.054%200.036-0.156t0.009-0.121q0.027-0.116%200.107-0.205%200.009-0.009%200.063-0.076t0.085-0.121%200.004-0.054q0.313%200.036%200.446-0.098%200.045-0.045%200.103-0.152t0.094-0.152q0.080-0.054%200.125-0.049t0.129%200.049%200.129%200.045q0.125%200.009%200.138-0.098t-0.067-0.179q0.107%200.009%200.027-0.152-0.045-0.063-0.071-0.080-0.107-0.036-0.241%200.045-0.071%200.036%200.018%200.071-0.009-0.009-0.085%200.094t-0.147%200.156-0.143-0.045q-0.009-0.009-0.049-0.121t-0.085-0.121q-0.071%200-0.143%200.134%200.027-0.071-0.098-0.134t-0.214-0.071q0.17-0.107-0.071-0.241-0.063-0.036-0.183-0.045t-0.174%200.036q-0.045%200.063-0.049%200.103t0.045%200.071%200.094%200.049%200.103%200.036%200.076%200.027q0.125%200.089%200.071%200.125-0.018%200.009-0.076%200.031t-0.103%200.040-0.054%200.036q-0.027%200.036%200%200.125t-0.018%200.125q-0.045-0.045-0.080-0.156t-0.063-0.147q0.063%200.080-0.223%200.054l-0.089-0.009q-0.036%200-0.143%200.018t-0.183%200.009-0.121-0.071q-0.036-0.071%200-0.179%200.009-0.036%200.036-0.018-0.036-0.027-0.098-0.085t-0.089-0.076q-0.411%200.134-0.839%200.366%200.054%200.009%200.107-0.009%200.045-0.018%200.116-0.058t0.089-0.049q0.304-0.125%200.375-0.063l0.045-0.045q0.125%200.143%200.179%200.223-0.063-0.036-0.268-0.009-0.179%200.054-0.196%200.107%200.063%200.107%200.045%200.161-0.036-0.027-0.103-0.089t-0.129-0.098-0.134-0.045q-0.143%200-0.196%200.009-1.304%200.714-2.098%201.982zM7.83%2013.482q0%200.054%200.018%200.143%201.839-0.321%203.134-1.688-0.027-0.027-0.112-0.040t-0.112-0.031q-0.161-0.063-0.214-0.071%200.009-0.063-0.022-0.116t-0.071-0.080-0.112-0.071-0.098-0.063q-0.018-0.018-0.063-0.054t-0.063-0.049-0.067-0.040-0.076-0.018-0.089%200.009l-0.027%200.009q-0.027%200.009-0.049%200.022t-0.049%200.027-0.036%200.027%200%200.022q-0.188-0.152-0.321-0.196-0.045-0.009-0.098-0.049t-0.094-0.063-0.089-0.013-0.103%200.063q-0.045%200.045-0.054%200.134t-0.018%200.116q-0.063-0.045%200-0.156t0.018-0.165q-0.027-0.054-0.094-0.040t-0.107%200.040-0.103%200.076-0.080%200.058-0.076%200.049-0.076%200.067q-0.027%200.036-0.054%200.107t-0.045%200.098q-0.018-0.036-0.103-0.058t-0.085-0.049q0.018%200.089%200.036%200.313t0.045%200.339q0.063%200.277-0.107%200.429-0.241%200.223-0.259%200.357-0.036%200.196%200.107%200.232%200%200.063-0.071%200.183t-0.063%200.192z%22%20fill%3D%22%23000000%22%3E%3C/path%3E%0A%3C/svg%3E%0A'); 52 | background-repeat: no-repeat; 53 | } 54 | 55 | 56 | .icon-institution { 57 | background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C%21--%20Generated%20by%20IcoMoon.io%20--%3E%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20width%3D%2218%22%20height%3D%2216%22%20viewBox%3D%220%200%2018%2016%22%3E%0A%3Cg%3E%0A%09%3Cline%20stroke-width%3D%221%22%20x1%3D%22%22%20y1%3D%22%22%20x2%3D%22%22%20y2%3D%22%22%20stroke%3D%22%23449FDB%22%20opacity%3D%22%22%3E%3C/line%3E%0A%3C/g%3E%0A%09%3Cpath%20d%3D%22M0%2014.857q0-0.232%200.183-0.402t0.433-0.17h15.911q0.25%200%200.433%200.17t0.183%200.402v1.143h-17.143v-1.143zM0%204.571v-1.143l8.571-3.429%208.571%203.429v1.143h-1.143q0%200.232-0.183%200.402t-0.433%200.17h-13.625q-0.25%200-0.433-0.17t-0.183-0.402h-1.143zM1.143%2013.714v-0.571q0-0.232%200.183-0.402t0.433-0.17h0.527v-6.857h2.286v6.857h1.143v-6.857h2.286v6.857h1.143v-6.857h2.286v6.857h1.143v-6.857h2.286v6.857h0.527q0.25%200%200.433%200.17t0.183%200.402v0.571h-14.857z%22%20fill%3D%22%23000000%22%3E%3C/path%3E%0A%3C/svg%3E%0A'); 58 | background-repeat: no-repeat; 59 | } 60 | 61 | 62 | .icon-mortar-board { 63 | background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C%21--%20Generated%20by%20IcoMoon.io%20--%3E%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20width%3D%2221%22%20height%3D%2216%22%20viewBox%3D%220%200%2021%2016%22%3E%0A%3Cg%3E%0A%09%3Cline%20stroke-width%3D%221%22%20x1%3D%22%22%20y1%3D%22%22%20x2%3D%22%22%20y2%3D%22%22%20stroke%3D%22%23449FDB%22%20opacity%3D%22%22%3E%3C/line%3E%0A%3C/g%3E%0A%09%3Cpath%20d%3D%22M0%204.571q0-0.205%200.196-0.277l10-3.143q0.036-0.009%200.089-0.009t0.089%200.009l10%203.143q0.196%200.071%200.196%200.277t-0.196%200.277l-10%203.143q-0.036%200.009-0.089%200.009t-0.089-0.009l-5.821-1.839q-0.384%200.304-0.634%200.996t-0.304%201.594q0.563%200.321%200.563%200.973%200%200.616-0.518%200.955l0.518%203.866q0.018%200.125-0.071%200.223-0.080%200.098-0.214%200.098h-1.714q-0.134%200-0.214-0.098-0.089-0.098-0.071-0.223l0.518-3.866q-0.518-0.339-0.518-0.955%200-0.652%200.58-0.991%200.098-1.848%200.875-2.946l-2.973-0.929q-0.196-0.071-0.196-0.277zM4.571%2010.286l0.161-2.821%205.125%201.616q0.196%200.063%200.429%200.063t0.429-0.063l5.125-1.616%200.161%202.821q0.036%200.616-0.732%201.143t-2.098%200.835-2.884%200.308-2.884-0.308-2.098-0.835-0.732-1.143z%22%20fill%3D%22%23000000%22%3E%3C/path%3E%0A%3C/svg%3E%0A'); 64 | background-repeat: no-repeat; 65 | } 66 | 67 | 68 | .icon-music { 69 | background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C%21--%20Generated%20by%20IcoMoon.io%20--%3E%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%0A%3Cg%3E%0A%09%3Cline%20stroke-width%3D%221%22%20x1%3D%22%22%20y1%3D%22%22%20x2%3D%22%22%20y2%3D%22%22%20stroke%3D%22%23449FDB%22%20opacity%3D%22%22%3E%3C/line%3E%0A%3C/g%3E%0A%09%3Cpath%20d%3D%22M0%2014.286q0-0.446%200.304-0.795t0.768-0.54%200.924-0.286%200.862-0.094q0.938%200%201.714%200.348v-8.634q0-0.277%200.17-0.504t0.438-0.317l7.429-2.286q0.107-0.036%200.25-0.036%200.357%200%200.607%200.25t0.25%200.607v10q0%200.446-0.304%200.795t-0.768%200.54-0.924%200.286-0.862%200.094-0.862-0.094-0.924-0.286-0.768-0.54-0.304-0.795%200.304-0.795%200.768-0.54%200.924-0.286%200.862-0.094q0.938%200%201.714%200.348v-4.795l-6.857%202.116v6.33q0%200.446-0.304%200.795t-0.768%200.54-0.924%200.286-0.862%200.094-0.862-0.094-0.924-0.286-0.768-0.54-0.304-0.795z%22%20fill%3D%22%23000000%22%3E%3C/path%3E%0A%3C/svg%3E%0A'); 70 | background-repeat: no-repeat; 71 | } 72 | 73 | 74 | .icon-phone { 75 | background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C%21--%20Generated%20by%20IcoMoon.io%20--%3E%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20width%3D%2213%22%20height%3D%2216%22%20viewBox%3D%220%200%2013%2016%22%3E%0A%3Cg%3E%0A%09%3Cline%20stroke-width%3D%221%22%20x1%3D%22%22%20y1%3D%22%22%20x2%3D%22%22%20y2%3D%22%22%20stroke%3D%22%23449FDB%22%20opacity%3D%22%22%3E%3C/line%3E%0A%3C/g%3E%0A%09%3Cpath%20d%3D%22M0%204.17q0-0.821%200.455-1.661%200.5-0.902%200.946-1.089%200.223-0.098%200.612-0.188t0.629-0.089q0.125%200%200.188%200.027%200.161%200.054%200.473%200.679%200.098%200.17%200.268%200.482t0.313%200.567%200.277%200.478q0.027%200.036%200.156%200.223t0.192%200.317%200.063%200.254q0%200.179-0.254%200.446t-0.554%200.491-0.554%200.473-0.254%200.411q0%200.080%200.045%200.201t0.076%200.183%200.125%200.214%200.103%200.17q0.679%201.223%201.554%202.098t2.098%201.554q0.018%200.009%200.17%200.103t0.214%200.125%200.183%200.076%200.201%200.045q0.161%200%200.411-0.254t0.473-0.554%200.491-0.554%200.446-0.254q0.125%200%200.254%200.063t0.317%200.192%200.223%200.156q0.223%200.134%200.478%200.277t0.567%200.313%200.482%200.268q0.625%200.313%200.679%200.473%200.027%200.063%200.027%200.188%200%200.241-0.089%200.629t-0.188%200.612q-0.188%200.446-1.089%200.946-0.839%200.455-1.661%200.455-0.241%200-0.469-0.031t-0.513-0.112-0.424-0.129-0.496-0.183-0.438-0.161q-0.875-0.313-1.563-0.741-1.143-0.705-2.362-1.924t-1.924-2.362q-0.429-0.688-0.741-1.563-0.027-0.080-0.161-0.438t-0.183-0.496-0.129-0.424-0.112-0.513-0.031-0.469z%22%20fill%3D%22%23000000%22%3E%3C/path%3E%0A%3C/svg%3E%0A'); 76 | background-repeat: no-repeat; 77 | } 78 | 79 | 80 | .icon-star-o { 81 | background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C%21--%20Generated%20by%20IcoMoon.io%20--%3E%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20width%3D%229%22%20height%3D%229%22%20viewBox%3D%220%200%209%209%22%3E%0A%3Cg%20id%3D%22icomoon-ignore%22%3E%0A%09%3Cline%20stroke-width%3D%221%22%20x1%3D%22%22%20y1%3D%22%22%20x2%3D%22%22%20y2%3D%22%22%20stroke%3D%22%23449FDB%22%20opacity%3D%22%22%3E%3C/line%3E%0A%3C/g%3E%0A%09%3Cpath%20d%3D%22M9%203.49l-3.109-0.452-1.391-2.818-1.391%202.818-3.109%200.452%202.25%202.193-0.531%203.097%202.781-1.462%202.781%201.462-0.531-3.097%202.25-2.193zM4.5%206.623l-1.964%201.033%200.375-2.187-1.589-1.549%202.196-0.319%200.982-1.99%200.982%201.99%202.196%200.319-1.589%201.549%200.375%202.187-1.964-1.033z%22%20fill%3D%22%23000000%22%3E%3C/path%3E%0A%3C/svg%3E%0A'); 82 | background-repeat: no-repeat; 83 | } 84 | 85 | 86 | .icon-th-list { 87 | background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C%21--%20Generated%20by%20IcoMoon.io%20--%3E%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%0A%3Cg%3E%0A%09%3Cline%20stroke-width%3D%221%22%20x1%3D%22%22%20y1%3D%22%22%20x2%3D%22%22%20y2%3D%22%22%20stroke%3D%22%23449FDB%22%20opacity%3D%22%22%3E%3C/line%3E%0A%3C/g%3E%0A%09%3Cpath%20d%3D%22M0%2012.857v-1.714q0-0.357%200.25-0.607t0.607-0.25h2.857q0.357%200%200.607%200.25t0.25%200.607v1.714q0%200.357-0.25%200.607t-0.607%200.25h-2.857q-0.357%200-0.607-0.25t-0.25-0.607zM0%208.286v-1.714q0-0.357%200.25-0.607t0.607-0.25h2.857q0.357%200%200.607%200.25t0.25%200.607v1.714q0%200.357-0.25%200.607t-0.607%200.25h-2.857q-0.357%200-0.607-0.25t-0.25-0.607zM0%203.714v-1.714q0-0.357%200.25-0.607t0.607-0.25h2.857q0.357%200%200.607%200.25t0.25%200.607v1.714q0%200.357-0.25%200.607t-0.607%200.25h-2.857q-0.357%200-0.607-0.25t-0.25-0.607zM5.714%2012.857v-1.714q0-0.357%200.25-0.607t0.607-0.25h8.571q0.357%200%200.607%200.25t0.25%200.607v1.714q0%200.357-0.25%200.607t-0.607%200.25h-8.571q-0.357%200-0.607-0.25t-0.25-0.607zM5.714%208.286v-1.714q0-0.357%200.25-0.607t0.607-0.25h8.571q0.357%200%200.607%200.25t0.25%200.607v1.714q0%200.357-0.25%200.607t-0.607%200.25h-8.571q-0.357%200-0.607-0.25t-0.25-0.607zM5.714%203.714v-1.714q0-0.357%200.25-0.607t0.607-0.25h8.571q0.357%200%200.607%200.25t0.25%200.607v1.714q0%200.357-0.25%200.607t-0.607%200.25h-8.571q-0.357%200-0.607-0.25t-0.25-0.607z%22%20fill%3D%22%23000000%22%3E%3C/path%3E%0A%3C/svg%3E%0A'); 88 | background-repeat: no-repeat; 89 | } 90 | 91 | 92 | .icon-user { 93 | background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C%21--%20Generated%20by%20IcoMoon.io%20--%3E%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20width%3D%2213%22%20height%3D%2216%22%20viewBox%3D%220%200%2013%2016%22%3E%0A%3Cg%3E%0A%09%3Cline%20stroke-width%3D%221%22%20x1%3D%22%22%20y1%3D%22%22%20x2%3D%22%22%20y2%3D%22%22%20stroke%3D%22%23449FDB%22%20opacity%3D%22%22%3E%3C/line%3E%0A%3C/g%3E%0A%09%3Cpath%20d%3D%22M0%2012.545q0-0.473%200.031-0.924t0.125-0.973%200.237-0.969%200.384-0.871%200.554-0.723%200.763-0.478%200.996-0.179q0.080%200%200.375%200.192t0.665%200.429%200.964%200.429%201.192%200.192%201.192-0.192%200.964-0.429%200.665-0.429%200.375-0.192q0.545%200%200.996%200.179t0.763%200.478%200.554%200.723%200.384%200.871%200.237%200.969%200.125%200.973%200.031%200.924q0%201.071-0.652%201.692t-1.732%200.621h-7.804q-1.080%200-1.732-0.621t-0.652-1.692zM2.857%204.571q0-1.42%201.004-2.424t2.424-1.004%202.424%201.004%201.004%202.424-1.004%202.424-2.424%201.004-2.424-1.004-1.004-2.424z%22%20fill%3D%22%23000000%22%3E%3C/path%3E%0A%3C/svg%3E%0A'); 94 | background-repeat: no-repeat; 95 | } 96 | -------------------------------------------------------------------------------- /extras/resume_html/public/css/icons.fallback.css: -------------------------------------------------------------------------------- 1 | 2 | .icon-book { 3 | background-image: url('png/book.png'); 4 | background-repeat: no-repeat; 5 | } 6 | 7 | 8 | .icon-bookmark { 9 | background-image: url('png/bookmark.png'); 10 | background-repeat: no-repeat; 11 | } 12 | 13 | 14 | .icon-briefcase { 15 | background-image: url('png/briefcase.png'); 16 | background-repeat: no-repeat; 17 | } 18 | 19 | 20 | .icon-edit { 21 | background-image: url('png/edit.png'); 22 | background-repeat: no-repeat; 23 | } 24 | 25 | 26 | .icon-envelope { 27 | background-image: url('png/envelope.png'); 28 | background-repeat: no-repeat; 29 | } 30 | 31 | 32 | .icon-file { 33 | background-image: url('png/file.png'); 34 | background-repeat: no-repeat; 35 | } 36 | 37 | 38 | .icon-gear { 39 | background-image: url('png/gear.png'); 40 | background-repeat: no-repeat; 41 | } 42 | 43 | 44 | .icon-github { 45 | background-image: url('png/github.png'); 46 | background-repeat: no-repeat; 47 | } 48 | 49 | 50 | .icon-globe { 51 | background-image: url('png/globe.png'); 52 | background-repeat: no-repeat; 53 | } 54 | 55 | 56 | .icon-institution { 57 | background-image: url('png/institution.png'); 58 | background-repeat: no-repeat; 59 | } 60 | 61 | 62 | .icon-mortar-board { 63 | background-image: url('png/mortar-board.png'); 64 | background-repeat: no-repeat; 65 | } 66 | 67 | 68 | .icon-music { 69 | background-image: url('png/music.png'); 70 | background-repeat: no-repeat; 71 | } 72 | 73 | 74 | .icon-phone { 75 | background-image: url('png/phone.png'); 76 | background-repeat: no-repeat; 77 | } 78 | 79 | 80 | .icon-star-o { 81 | background-image: url('png/star-o.png'); 82 | background-repeat: no-repeat; 83 | } 84 | 85 | 86 | .icon-th-list { 87 | background-image: url('png/th-list.png'); 88 | background-repeat: no-repeat; 89 | } 90 | 91 | 92 | .icon-user { 93 | background-image: url('png/user.png'); 94 | background-repeat: no-repeat; 95 | } 96 | 97 | -------------------------------------------------------------------------------- /extras/resume_html/public/css/institution.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prat0318/json_resume/d2aa8d297a3563b6401f6022bc05279393d3b2a5/extras/resume_html/public/css/institution.png -------------------------------------------------------------------------------- /extras/resume_html/public/css/mobile.css: -------------------------------------------------------------------------------- 1 | /*added for #PAGE */ 2 | @media screen and (max-width: 600px){ 3 | #page { 4 | padding: 0.5em 1em 0.5em 1em; 5 | } 6 | #site { 7 | max-width: 46em; 8 | margin: 0em auto 0em auto; 9 | } 10 | #bottom-contact { 11 | display: inline; 12 | } 13 | #top-contact { 14 | display: none; 15 | } 16 | #mobile-table { 17 | display: inline; 18 | } 19 | #desktop-table { 20 | display: none; 21 | } 22 | .contact-details { 23 | float: right; 24 | width: 50em; 25 | font-size: 80%; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /extras/resume_html/public/css/mortar-board.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prat0318/json_resume/d2aa8d297a3563b6401f6022bc05279393d3b2a5/extras/resume_html/public/css/mortar-board.png -------------------------------------------------------------------------------- /extras/resume_html/public/css/music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prat0318/json_resume/d2aa8d297a3563b6401f6022bc05279393d3b2a5/extras/resume_html/public/css/music.png -------------------------------------------------------------------------------- /extras/resume_html/public/css/phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prat0318/json_resume/d2aa8d297a3563b6401f6022bc05279393d3b2a5/extras/resume_html/public/css/phone.png -------------------------------------------------------------------------------- /extras/resume_html/public/css/screen.css: -------------------------------------------------------------------------------- 1 | /* @override http://mark.reid.dev/files/css/screen.css */ 2 | 3 | /* @override 4 | http://mark.reid.dev/files/css/screen.css 5 | http://mark.reid.name/files/css/screen.css 6 | */ 7 | 8 | /* screen.css 9 | * 10 | * A clean, simple stylesheet that aims for 11 | * a consistent vertical rhythm. 12 | * 13 | * Base font height: 16px 14 | * Base line length: 24px 15 | * 16 | * AUTHOR: Mark Reid 17 | */ 18 | 19 | /* @group Reset */ 20 | body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,p,blockquote,th,td,abbr { margin:0; padding:0;} 21 | /* @end */ 22 | 23 | body { 24 | font-family: Palatino, "Palatino Linotype", "Palatino LT STD", "Book Antiqua", "times new roman", Georgia, serif; 25 | background-color: whitesmoke; 26 | background-position: center -18em; 27 | background-repeat: repeat-x; 28 | } 29 | 30 | /* Hack via Joel Spolsky to make image rescaling nicer in IE */ 31 | img { -ms-interpolation-mode:bicubic; } 32 | 33 | /* IE6 ignores this and uses default size of 16pt */ 34 | html>body { font-size:16px; } 35 | p { margin: 0 0 1.5em 0; text-align: justify; } 36 | 37 | a { 38 | text-decoration: none; 39 | color: inherit; 40 | font-weight: bold; 41 | } 42 | a:hover { text-decoration: underline; color: #33f; } 43 | a.pdf:before { 44 | margin-right: 1em; 45 | content: url(/files/css/icon_pdf.gif); } 46 | 47 | h1,h2,h3,h4 { 48 | line-height:1em; 49 | font-size:1.5em; 50 | font-weight: normal; 51 | clear: left; 52 | font-family: 'lucida grande', sans-serif; 53 | } 54 | h1 { margin-bottom: 1em; } 55 | h2 { 56 | font-size: 100%; 57 | line-height: 1.5em; 58 | margin:0.5em 0 0.5em 0; 59 | font-weight:bold; 60 | } 61 | 62 | hr { 63 | border-top: 1px solid silver; 64 | border-bottom: none; 65 | padding: 0; 66 | margin: 1.46em 0 0 0; 67 | } 68 | 69 | sup { line-height: 1ex; } 70 | 71 | #site { 72 | max-width: 46em; 73 | margin: 1.5em auto 3em auto; 74 | line-height:1.5em; 75 | } 76 | 77 | #page { 78 | background: white; 79 | padding: 3em 3em 1.5em 3em; 80 | } 81 | #bottom-contact { 82 | display: none; 83 | } 84 | #mobile-table { 85 | display: none; 86 | } 87 | 88 | .icon-square { 89 | width: 16px; 90 | height: 16px; 91 | display:inline-block; 92 | 93 | } 94 | 95 | .icon-rect { 96 | width: 21px; 97 | height: 16px; 98 | display:inline-block; 99 | 100 | } 101 | 102 | .icon-star { 103 | width: 9px; 104 | height: 9px; 105 | display:inline-block; 106 | 107 | } 108 | 109 | /* @group FancyFirst */ 110 | .emphnext + p:first-letter, p.emphfirst:first-letter { 111 | font-size: 48px; 112 | padding: 0 0.15em 0 0; 113 | margin: 0.05em 0 -0.15em 0; 114 | line-height: 1em; 115 | float: left; 116 | } 117 | 118 | .emphnext + p:first-line, p.emphfirst:first-line { 119 | font-variant: small-caps; 120 | font-size: larger; 121 | } 122 | /* @end */ 123 | 124 | .right { float: right; clear: left; } 125 | .left { float: left; clear: right; } 126 | .inset { 127 | border: 1px solid silver; 128 | padding: 2px; 129 | margin: 0em 0.8em 0.8em 0.8em; 130 | } 131 | .right.inset { margin-right: 0 !important; } 132 | .left.inset { margin-left: 0 !important; } 133 | .quiet { 134 | color: grey; 135 | font-size: 0.875em; 136 | line-height: 1.714em; 137 | } 138 | blockquote { 139 | padding: 0 2.8em; 140 | margin: 1.714em 0; 141 | color: #444; 142 | font-size: 0.875em; 143 | line-height: 1.714em; 144 | } 145 | 146 | .note { 147 | padding-top: 0.5em; 148 | background-color: #fafaff; 149 | border-top: 1px solid silver; 150 | border-bottom: 1px solid silver; 151 | } 152 | /* @group Table */ 153 | table.neat { 154 | width: 80%; 155 | margin: 1.5em auto 1.5em auto; 156 | table-layout: fixed; 157 | border-spacing: 0; 158 | } 159 | table.neat tr { text-align: center; } 160 | table.neat th { font-weight: normal; background-color: #eeeeee; } 161 | table.neat td { background-color: white; } 162 | table.neat th.title { border-bottom: 1px solid gray; border-top: 1px solid gray; vertical-align: bottom; background-color: lightgrey; } 163 | caption { 164 | color: #333; 165 | font-size: 0.875em; 166 | margin: 0.875em auto 0 auto; 167 | line-height: 1.14em; 168 | text-align: justify; 169 | } 170 | 171 | /* @end */ 172 | 173 | /* @group Lists */ 174 | ul { 175 | /* margin-top: 1.5em; 176 | margin-bottom: 1.5em; 177 | */ 178 | line-height: 1.3em; 179 | padding-left: 2.5em; 180 | } 181 | ul li { 182 | list-style-type: square; 183 | list-style-position: outside; 184 | } 185 | ul li ul li { 186 | font-size: 80%; 187 | list-style-type: circle; 188 | list-style-position: outside; 189 | } 190 | 191 | ol li { 192 | list-style-type: decimal; 193 | list-style-position: inside; 194 | } 195 | dt { font-weight: bold;} 196 | dd { margin: 0 0 1.5em 0; text-align: justify; } 197 | 198 | ul.compact { margin: 0; padding: 0;} 199 | ul.compact li { list-style: ; 200 | list-style-type: square; 201 | list-style-position: inside; 202 | } 203 | ul.compact li span.date { 204 | display: none; 205 | color: grey; 206 | width: 20%; 207 | } 208 | ul.compact li a { 209 | width: 70%; 210 | } 211 | /* @end */ 212 | 213 | /* @group Header */ 214 | #header, #header a { color: silver; } 215 | #header .hover { color: transparent; } 216 | #header:hover a { color: black; text-shadow: #aaa 2px 2px 3px; } 217 | #header:hover a #github-header { opacity: 1.0 } 218 | #header:hover a:hover { text-decoration: none; } 219 | #header a:hover .hover { color: silver; } 220 | #header { 221 | position: relative; 222 | font-variant: small-caps; 223 | line-height: 1em; 224 | margin-top: 0em; 225 | margin-bottom: 0em; 226 | } 227 | #header h1 { 228 | font-family: Palatino, georgia, "times new roman", serif; 229 | margin-bottom: 0; 230 | line-height: 0.9em; 231 | display: block; 232 | font-weight: normal; 233 | } 234 | 235 | #header ul { 236 | position: absolute; 237 | top: 0; 238 | right: 0; 239 | font-size: 100%; 240 | line-height: 1.6em; 241 | display: block; 242 | margin: 0; 243 | width: 50%; 244 | text-align: right; 245 | } 246 | #header ul li { display: inline; } 247 | #header ul li a { 248 | padding: 0.4em 0.3em 0 0.3em; 249 | display: inline; 250 | } 251 | #header ul li a:hover { 252 | color: blue; 253 | border-bottom: 2px solid blue; 254 | } 255 | #header .byline { 256 | color: silver; 257 | font-size: 10pt; 258 | line-height: 75% 259 | } 260 | #header:hover .byline a { color: silver; text-shadow: none; } 261 | #header:hover .byline a:hover { color: black; text-shadow: #aaa 1px 1px 2px;} 262 | 263 | body#Work #header a.work, 264 | body#Home #header a.home, 265 | body#Play #header a.play, 266 | body#Info #header a.info, 267 | body#Code #header a.code, 268 | body#Past #header a.past, 269 | body#Kith #header a.kith 270 | { 271 | border-bottom: 2px solid silver; 272 | } 273 | 274 | /* @end */ 275 | 276 | /* @group Footnotes */ 277 | .footnotes { color: grey; } 278 | .footnotes:hover { color: black; } 279 | .footnotes ol li { 280 | list-style-type: decimal; 281 | list-style-position: inside; 282 | font-size: 75%; 283 | line-height: 1.5em; 284 | } 285 | .footnotes ol li > a { display: none; } 286 | /* @end */ 287 | 288 | /* @group Sections */ 289 | .section { 290 | font-size: 87.5%; 291 | line-height: 1.43em; 292 | margin-bottom: 1.43em; 293 | margin-top: 1.43em; 294 | margin-left: 7.5em; 295 | padding-right: 3em; 296 | } 297 | .section h1 { 298 | font-family: Palatino, georgia, serif; 299 | font-size: 100%; 300 | line-height: 1.43em; 301 | position: absolute; 302 | width: 6em; 303 | max-width: 6em; 304 | margin-left: -7.5em; 305 | font-weight: bold; 306 | font-variant: small-caps; 307 | } 308 | .section p { margin-bottom: 1.43em; } 309 | 310 | /* @end */ 311 | 312 | .list .title { font-weight: bold; } 313 | p.line { position: relative; margin: 0; } 314 | p.excerpt { margin: 0; } 315 | .comments { font-size: smaller; position: absolute; color: silver; right: 0; top: 0; } 316 | .excerpt { color: black; } 317 | 318 | /* @group Signature */ 319 | .signature { 320 | margin-top: 3em; 321 | position: relative; 322 | } 323 | .signature .author { 324 | font-variant: small-caps; 325 | font-style: normal; 326 | color: black; 327 | display: block; 328 | margin-bottom: 1.5em; 329 | } 330 | .signature .date { 331 | font-size: 87.5%; 332 | line-height: 1.5em; 333 | display: block; 334 | font-variant: small-caps; 335 | font-style: normal; 336 | position: absolute; 337 | right: 0; 338 | top: 0; 339 | } 340 | .signature .location { 341 | display: block; 342 | font-size: 87.5%; 343 | line-height: 1.5em; 344 | position: absolute; 345 | right: 0; 346 | top: 1.5em; 347 | } 348 | /* @end */ 349 | 350 | /* @group Code */ 351 | pre { 352 | margin: 1em 0 1.5em 0; 353 | font-size: 0.75em; /* Hack to make code look same size as body font */ 354 | line-height: 1.5em; 355 | color: #111; 356 | background: #fffff0; 357 | border: 1px solid #ddc; 358 | padding: 0.5em 1em; 359 | overflow: hidden; 360 | 361 | /* Experimental CSS3 stuff */ 362 | box-shadow: 1px 1px 6px #ccc; 363 | -webkit-box-shadow: 1px 1px 6px #ccc; 364 | -moz-box-shadow: 1px 1px 6px #ccc; 365 | } 366 | pre:hover { 367 | border-right: none; 368 | overflow: visible; 369 | } 370 | code { 371 | font-size: 1em; 372 | background-color: #f7f7ff; 373 | line-height: 1.4em; 374 | } 375 | pre > code { 376 | background-color: transparent; 377 | } 378 | /* @end */ 379 | 380 | 381 | /* @group LibraryThing */ 382 | span.LTtitle { display: none; } 383 | div.LTitem { display: inline; margin-right: 0.7em; } 384 | div.LTprovided { display: none; } 385 | /* @end */ 386 | 387 | /* @group Footer */ 388 | #footer { 389 | margin-top: 0; 390 | color: grey; 391 | font-size: 87.5%; 392 | line-height: 1.3em; 393 | } 394 | #footer address { 395 | position: relative; 396 | margin: .5em 0 0 0; 397 | text-align: right; 398 | } 399 | #footer a { 400 | font-variant: small-caps; 401 | font-style: normal; 402 | color: #77d; 403 | text-decoration: none; 404 | } 405 | #footer .copyright { 406 | position: absolute; 407 | left: 0; 408 | text-align: left; 409 | display: block; 410 | } 411 | #footer .engine { 412 | position: absolute; 413 | text-align: right; 414 | display: block; 415 | right: 0; 416 | } 417 | /* @end */ 418 | 419 | 420 | /* @group Figures and images */ 421 | dl.figure { 422 | margin-top: 1.5em; 423 | margin-bottom: 1.5em; 424 | text-align: center; 425 | } 426 | 427 | dl.figure dd { 428 | color: #333; 429 | font-size: 0.875em; 430 | margin: 0.875em auto 0 auto; 431 | line-height: 1.14em; 432 | text-align: justify; 433 | width: 85%; 434 | } 435 | /* @end */ 436 | 437 | /* @group Equations */ 438 | div.maruku-equation { display: block ;text-align: center; } 439 | div.maruku-equation img.maruku-png { position: relative; top: -0.75em;} 440 | span.maruku-inline { } 441 | img.maruku-png { } 442 | /* @end */ 443 | 444 | /* .prev-next */ 445 | .prev-next { 446 | position:relative; 447 | } 448 | .prev-next .next{ 449 | float:right; 450 | } 451 | 452 | /* tag_box ======================================================== */ 453 | .tag_box { 454 | list-style:none; 455 | margin:0; 456 | padding:5px 0 ; 457 | overflow:hidden; 458 | } 459 | .tag_box li { 460 | list-style:none; 461 | line-height:1.8em; 462 | } 463 | .tag_box.inline li { 464 | float:left; 465 | } 466 | .tag_box a { 467 | padding: 3px 6px; 468 | margin: 2px; 469 | background: #eee; 470 | border-radius: 3px; 471 | border:1px dashed #ccc; 472 | text-decoration:none; 473 | } 474 | .tag_box a span{ 475 | vertical-align:super; 476 | font-size:0.8em; 477 | } 478 | .tag_box a.active { 479 | background:#57A957; 480 | border:1px solid #4C964D; 481 | color:#FFF; 482 | } 483 | 484 | .contact-details { 485 | float: right; 486 | width: 14em; 487 | font-size: 80%; 488 | } 489 | 490 | .emphnext { 491 | float: left; 492 | margin-bottom: 0; 493 | } 494 | 495 | .stars { 496 | float: left; 497 | font-size: 70%; 498 | } 499 | 500 | .icon-star-o { 501 | background-size: 9px; 502 | vertical-align: middle; 503 | width: 9px; 504 | height: 9px; 505 | } 506 | 507 | .languages { 508 | line-height: 1.6em; 509 | } 510 | 511 | .education { 512 | font-size: 90%; 513 | } 514 | 515 | .right { 516 | float: right; 517 | } 518 | 519 | .gray { 520 | opacity: 0.3 521 | } 522 | 523 | @media print { 524 | a[href]:after { 525 | content: none !important; 526 | } 527 | } 528 | -------------------------------------------------------------------------------- /extras/resume_html/public/css/star-o.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prat0318/json_resume/d2aa8d297a3563b6401f6022bc05279393d3b2a5/extras/resume_html/public/css/star-o.png -------------------------------------------------------------------------------- /extras/resume_html/public/css/th-list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prat0318/json_resume/d2aa8d297a3563b6401f6022bc05279393d3b2a5/extras/resume_html/public/css/th-list.png -------------------------------------------------------------------------------- /extras/resume_html/public/css/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prat0318/json_resume/d2aa8d297a3563b6401f6022bc05279393d3b2a5/extras/resume_html/public/css/user.png -------------------------------------------------------------------------------- /extras/resume_html/public/images/resume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prat0318/json_resume/d2aa8d297a3563b6401f6022bc05279393d3b2a5/extras/resume_html/public/images/resume.png -------------------------------------------------------------------------------- /extras/resume_html/public/js/grunticon.js: -------------------------------------------------------------------------------- 1 | window.grunticon=function(e){if(e&&3===e.length){var t=window,n=!!t.document.createElementNS&&!!t.document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect&&!!document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image","1.1"),A=function(A){var o=t.document.createElement("link"),r=t.document.getElementsByTagName("script")[0];o.rel="stylesheet",o.href=e[A&&n?0:A?1:2],r.parentNode.insertBefore(o,r)},o=new t.Image;o.onerror=function(){A(!1)},o.onload=function(){A(1===o.width&&1===o.height)},o.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="}}; 2 | grunticon( [ "public/css/icons.data.svg.css", "public/css/icons.data.png.css", "public/css/icons.fallback.css" ] ); 3 | -------------------------------------------------------------------------------- /json_resume.gemspec: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | lib = File.expand_path('../lib', __FILE__) 3 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 4 | require 'json_resume/version' 5 | 6 | Gem::Specification.new do |spec| 7 | spec.name = 'json_resume' 8 | spec.version = JsonResume::VERSION 9 | spec.authors = ['Prateek Agarwal'] 10 | spec.email = ['prat0318@gmail.com'] 11 | spec.description = 'json_resume creates pretty resume formats from a .json input file. Currently, it can convert to html, tex, markdown and pdf. Customizing the templates to your own needs is also super easy.' 12 | spec.summary = 'Generates pretty resume formats out of json input file' 13 | spec.homepage = 'http://github.com/prat0318/json_resume' 14 | spec.license = 'MIT' 15 | 16 | spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR) 17 | spec.executables = ['json_resume'] 18 | spec.test_files = spec.files.grep(/^(test|spec|features)/) 19 | spec.require_paths = ['lib'] 20 | 21 | spec.add_development_dependency 'bundler', '~> 1.3' 22 | spec.add_development_dependency 'rake' 23 | 24 | spec.add_dependency 'i18n' 25 | spec.add_dependency 'mustache' 26 | spec.add_dependency 'pdfkit' 27 | spec.add_dependency 'rest-client' 28 | spec.add_dependency 'thor' 29 | spec.add_dependency 'wkhtmltopdf-binary' 30 | end 31 | -------------------------------------------------------------------------------- /lib/json_resume.rb: -------------------------------------------------------------------------------- 1 | require_relative 'json_resume/version' 2 | require_relative 'json_resume/json_resume' 3 | 4 | module JsonResume 5 | # Your code goes here... 6 | end 7 | -------------------------------------------------------------------------------- /lib/json_resume/formatter.rb: -------------------------------------------------------------------------------- 1 | # Hack to generalise call empty? on 2 | # objects, arrays and hashes 3 | class Object 4 | def empty? 5 | false 6 | end 7 | end 8 | 9 | module JsonResume 10 | class Formatter 11 | attr_reader :hash 12 | 13 | def initialize(hash) 14 | @hash = hash 15 | 16 | # recursively defined proc 17 | @hash_proc = proc do |k, v| 18 | v = k if v.nil? # HACK: to make it common for hash and array 19 | v.delete_if(&@hash_proc) if [Hash, Array].any? { |x| v.instance_of? x } 20 | v.empty? 21 | end 22 | end 23 | 24 | def add_linkedin_github_url 25 | @hash['raw_website'] = @hash['bio_data']['website'].sub(%r{^https?://}, '') if @hash['bio_data'] && @hash['bio_data']['website'] 26 | @hash['linkedin_url'] = 'http://linkedin.com/in/' + @hash['linkedin_id'] if @hash['linkedin_id'] 27 | @hash['github_url'] = 'http://github.com/' + @hash['github_id'] if @hash['github_id'] 28 | end 29 | 30 | def add_last_marker_on_stars 31 | return if @hash['bio_data']['stars'].nil? 32 | @hash['bio_data']['stars'] = { 33 | 'items' => @hash['bio_data']['stars'].map { |i| { 'name' => i } } 34 | } 35 | @hash['bio_data']['stars']['items'][-1]['last'] = true 36 | end 37 | 38 | def add_last_marker_on_skills 39 | return if @hash['bio_data']['skills'].nil? 40 | @hash['bio_data']['skills']['details'].each do |item| 41 | item['items'].map! { |x| { 'name' => x } } 42 | item['items'][-1]['last'] = true 43 | end 44 | end 45 | 46 | def add_last_marker_on_tools 47 | return if @hash['bio_data']['other_projects'].nil? 48 | @hash['bio_data']['other_projects']['items'].each do |item| 49 | next if item['technology_used'].nil? 50 | item['technology_used']['tools'].map! { |x| { 'name' => x } } 51 | item['technology_used']['tools'][-1]['last'] = true 52 | end 53 | end 54 | 55 | def add_last_marker_on_field(field_name) 56 | return if @hash['bio_data'][field_name].nil? 57 | @hash['bio_data'][field_name]['items'].each do |item| 58 | next if item['technology_used'].nil? 59 | item['technology_used']['tools'].map! { |x| { 'name' => x } } 60 | item['technology_used']['tools'][-1]['last'] = true 61 | end 62 | end 63 | 64 | def cleanse 65 | @hash.delete_if(&@hash_proc) 66 | self 67 | end 68 | 69 | def format_to_output_type 70 | format_proc = proc do |k, v| 71 | v = k if v.nil? 72 | v.each { |x| format_proc.call(x) } if [Hash, Array].any? { |x| v.instance_of? x } 73 | format_string v if v.instance_of? String 74 | end 75 | @hash.each { |x| format_proc.call(x) } 76 | self 77 | end 78 | 79 | def format_string(_) 80 | fail(NotImplementedError.new('format_string not impl in formatter'), '') 81 | end 82 | 83 | def item_false?(item) 84 | item == false || item == 'false' 85 | end 86 | 87 | def purge_gpa 88 | return if @hash['bio_data']['education'].nil? 89 | @hash['bio_data']['education'].delete('show_gpa') if item_false?(@hash['bio_data']['education']['show_gpa']) || @hash['bio_data']['education']['schools'].all? { |sch| sch['gpa'].nil? || sch['gpa'].empty? } 90 | end 91 | 92 | def add_padding(course) 93 | return if @hash['bio_data'].nil? || @hash['bio_data'][course].nil? 94 | course_hash = @hash['bio_data'][course] 95 | course_hash << {} if course_hash.size.odd? 96 | @hash['bio_data'][course] = { 97 | 'rows' => course_hash.each_slice(2).to_a.map { |i| { 'columns' => i } } 98 | } 99 | end 100 | 101 | def format 102 | return if @hash['bio_data'].nil? 103 | 104 | cleanse 105 | 106 | format_to_output_type 107 | 108 | add_last_marker_on_stars 109 | 110 | add_last_marker_on_skills 111 | 112 | add_last_marker_on_field 'experience' 113 | add_last_marker_on_field 'other_projects' 114 | 115 | purge_gpa 116 | 117 | add_linkedin_github_url 118 | 119 | # make odd listed courses to even 120 | %w(grad_courses undergrad_courses).each do |course| 121 | add_padding(course) 122 | end 123 | 124 | self 125 | end 126 | end 127 | end 128 | -------------------------------------------------------------------------------- /lib/json_resume/formatter_html.rb: -------------------------------------------------------------------------------- 1 | require_relative 'formatter' 2 | 3 | module JsonResume 4 | class FormatterHtml < Formatter 5 | def format_link(str) 6 | str.gsub!(/\[(.*?)\]\((.*?)\)/, '\1') 7 | end 8 | 9 | def format_autolink(str) 10 | str.gsub!(/<<(\S*?)>>/, '\1') 11 | end 12 | 13 | def format_emphasis(str) 14 | str.gsub!(/\b_(.+?)_\b/, '\1') 15 | str.gsub!(/\*\*(.+?)\*\*/, '\1') 16 | end 17 | 18 | def format_string(str) 19 | format_link str 20 | format_autolink str 21 | format_emphasis str 22 | end 23 | 24 | def format 25 | super 26 | 27 | self 28 | end 29 | end 30 | end 31 | -------------------------------------------------------------------------------- /lib/json_resume/formatter_latex.rb: -------------------------------------------------------------------------------- 1 | require_relative 'formatter' 2 | 3 | module JsonResume 4 | class FormatterLatex < Formatter 5 | def format_slashes(str) 6 | str.gsub!(/\\/, '\textbackslash') 7 | str.gsub!(/\{/, '\{') 8 | str.gsub!(/\}/, '\}') 9 | end 10 | 11 | def format_link(str) 12 | str.gsub!(/\[(.*?)\]\((.*?)\)/, '{\color{see} \href{\2}{\1}}') 13 | end 14 | 15 | def format_autolink(str) 16 | str.gsub!(/<<(\S*?)>>/, '{\color{see} \url{\1}}') 17 | end 18 | 19 | def format_emphasis(str) 20 | str.gsub!(/\b_(.+?)_\b/, '\textit{\1}') 21 | str.gsub!(/\*\*(.+?)\*\*/, '\textbf{\1}') 22 | end 23 | 24 | def format_superscripts(str) 25 | str.gsub!(/(.*?)<\/sup>/, '$^{\1}$') 26 | str.gsub!(/(.*?)<\/sub>/, '$_{\1}$') 27 | end 28 | 29 | def format_symbols(str) 30 | str.gsub!(/#/, '\#') 31 | str.gsub!(/\$/, '\$') 32 | str.gsub!(/&/, '\\\\&') 33 | str.gsub!(/\|/, '\textbar') 34 | str.gsub!(/%/, '\%') 35 | str.gsub!(/_/, '\_') 36 | end 37 | 38 | def format_string(str) 39 | format_slashes str 40 | format_link str 41 | format_autolink str 42 | format_emphasis str 43 | format_symbols str 44 | format_superscripts str 45 | end 46 | 47 | def format 48 | super 49 | 50 | self 51 | end 52 | end 53 | end 54 | -------------------------------------------------------------------------------- /lib/json_resume/formatter_md.rb: -------------------------------------------------------------------------------- 1 | require_relative 'formatter' 2 | 3 | module JsonResume 4 | class FormatterMd < Formatter 5 | def format_autolink(str) 6 | str.gsub!(/<<(\S*?)>>/, '[\1](\1)') 7 | end 8 | 9 | def format_string(str) 10 | format_autolink str 11 | end 12 | 13 | def format 14 | super 15 | 16 | self 17 | end 18 | end 19 | end 20 | -------------------------------------------------------------------------------- /lib/json_resume/json_resume.rb: -------------------------------------------------------------------------------- 1 | require_relative 'reader' 2 | 3 | module JsonResume 4 | class << self 5 | def new(json_input, options = {}) 6 | options = options.each_with_object({}) { |(k, v), memo| memo[k.to_sym] = v } 7 | JsonResume::Core.new(json_input, options) 8 | end 9 | end 10 | 11 | class Core 12 | attr_accessor :reader 13 | 14 | def initialize(json_input, options) 15 | @reader = Reader.new(json_input, options) 16 | @reader.format! 17 | end 18 | end 19 | end 20 | -------------------------------------------------------------------------------- /lib/json_resume/reader.rb: -------------------------------------------------------------------------------- 1 | require_relative 'formatter_html' 2 | require_relative 'formatter_latex' 3 | require_relative 'formatter_md' 4 | require 'rest-client' 5 | require 'json' 6 | require 'yaml' 7 | 8 | module JsonResume 9 | class Reader 10 | attr_accessor :hash 11 | 12 | def initialize(json_input, options) 13 | output_type = options[:output_type] || 'html' # default html, others latex, md 14 | @json_string = case json_input 15 | when /^(http|https|www)/ then RestClient.get(json_input) 16 | when /\.json$/i then File.read(json_input) 17 | when /\.ya?ml$/i then JSON.dump(YAML.load_file(json_input)) 18 | else json_input 19 | end 20 | @output_type = output_type 21 | begin 22 | @hash = JSON.parse(@json_string) 23 | rescue JSON::ParserError => e 24 | raise Exception, 'Either you entered a file without .json extension or JSON string is wrong: ' + e.message 25 | end 26 | end 27 | 28 | def format! 29 | formatters = { 30 | latex: JsonResume::FormatterLatex, 31 | html: JsonResume::FormatterHtml, 32 | markdown: JsonResume::FormatterMd 33 | } 34 | type = @output_type.to_sym 35 | @hash = formatters[type].new(@hash).format.hash 36 | end 37 | end 38 | end 39 | -------------------------------------------------------------------------------- /lib/json_resume/version.rb: -------------------------------------------------------------------------------- 1 | module JsonResume 2 | VERSION = '1.0.6' 3 | end 4 | -------------------------------------------------------------------------------- /locale/en.yml: -------------------------------------------------------------------------------- 1 | --- 2 | en: 3 | headings: 4 | # "Academic Achievements" 5 | acad_achievements: "Academic Achievements" 6 | # "Degree" 7 | degree: "Degree" 8 | # "Education" 9 | education: "Education" 10 | # "Professional Experience" 11 | experience: "Professional Experience" 12 | # "Extra Curricular Awards" 13 | extra_curricular: "Extra Curricular Awards" 14 | # "GitHub Projects" 15 | github_projects: "GitHub Projects" 16 | # GPA 17 | gpa: "GPA" 18 | # "Graduate Courses Taken" 19 | grad_courses: "Graduate Courses Taken" 20 | # "Graduation Year" 21 | graduation_year: "Graduation Year" 22 | # "Institution" 23 | institution: "Institution" 24 | # "issued on" 25 | issuance: "issued on" 26 | # "Major" 27 | major: "Major" 28 | # "Memberships" 29 | memberships: "Memberships" 30 | # "Other Personal Projects" 31 | other_projects: "Other Personal Projects" 32 | # "Publications" 33 | papers: "Publications" 34 | # "Patents" 35 | patents: "Patents" 36 | # "Research Experience" 37 | research_experience: "Research Experience" 38 | # "Technical Skills" 39 | skills: "Technical Skills" 40 | # "Qualifications summary" 41 | summary: "Qualifications summary" 42 | # "Technologies got to work on" 43 | technology_used: "Technologies got to work on" 44 | # "Undergraduate Courses Taken" 45 | undergrad_courses: "Undergraduate Courses Taken" 46 | -------------------------------------------------------------------------------- /locale/es.yml: -------------------------------------------------------------------------------- 1 | --- 2 | es: 3 | headings: 4 | # "Academic Achievements" 5 | acad_achievements: "Logros Académicos" 6 | # "Degree" 7 | degree: "Grado" 8 | # "Education" 9 | education: "Educación" 10 | # "Professional Experience" 11 | experience: "Experiencia Profesional" 12 | # "Extra Curricular Awards" 13 | extra_curricular: "Premios Extracurriculares" 14 | # "GitHub Projects" 15 | github_projects: "Proyectos en GitHub" 16 | # GPA - Grade point average 17 | gpa: "GPA" 18 | # "Graduate Courses Taken" 19 | grad_courses: "Cursos de Postgrado realizados" 20 | # "Graduation Year" 21 | graduation_year: "Año de Graduación" 22 | # "Institution" 23 | institution: "Institución" 24 | # "issued on" 25 | issuance: "emitido el" 26 | # "Major" 27 | major: "Major" 28 | # "Memberships" 29 | memberships: "Membresías" 30 | # "Other Personal Projects" 31 | other_projects: "Otros Proyectos Personales" 32 | # "Publications" 33 | papers: "Publicaciones" 34 | # "Patents" 35 | patents: "Patentes" 36 | # "Research Experience" 37 | research_experience: "Experiencia en Investigación" 38 | # "Technical Skills" 39 | skills: "Habilidades Técnicas" 40 | # "Qualifications summary" 41 | summary: "Resumen de Cualificaciones" 42 | # "Technologies got to work on" 43 | technology_used: "Tecnologías en las que trabajó" 44 | # "Undergraduate Courses Taken" 45 | undergrad_courses: "Pregrado recibido" 46 | -------------------------------------------------------------------------------- /locale/fi.yml: -------------------------------------------------------------------------------- 1 | --- 2 | fi: 3 | headings: 4 | # "Academic Achievements" 5 | acad_achievements: "Akateemiset saavutukset" 6 | # "Degree" 7 | degree: "Tutkinto" 8 | # "Education" 9 | education: "Koulutus" 10 | # "Professional Experience" 11 | experience: "Ammatillinen kokemus" 12 | # "Extra Curricular Awards" 13 | extra_curricular: "Oppimäärään kuulumattomat palkinnot" 14 | # "GitHub Projects" 15 | github_projects: "GitHub - projektit" 16 | # GPA 17 | gpa: "Keskiarvo" 18 | # "Graduate Courses Taken" 19 | grad_courses: "Jatkokurssit" 20 | # "Graduation Year" 21 | graduation_year: "Valmistumisvuosi" 22 | # "Institution" 23 | institution: "Oppilaitos" 24 | # "issued on" 25 | issuance: "Myönnetty" 26 | # "Major" 27 | major: "Pääaine" 28 | # "Memberships" 29 | memberships: "Jäsenyydet" 30 | # "Other Personal Projects" 31 | other_projects: "Muut henkilökohtaiset projektit" 32 | # "Publications" 33 | papers: "Julkaisut" 34 | # "Patents" 35 | patents: "Patentit" 36 | # "Research Experience" 37 | research_experience: "Tieteellinen kokemus" 38 | # "Technical Skills" 39 | skills: "Tekniset taidot" 40 | # "Qualifications summary" 41 | summary: "Yhteenveto pätevyyksistä" 42 | # "Technologies got to work on" 43 | technology_used: "Teknologiat" 44 | # "Undergraduate Courses Taken" 45 | undergrad_courses: "Perustutkintokurssit" 46 | -------------------------------------------------------------------------------- /locale/ge.yml: -------------------------------------------------------------------------------- 1 | --- 2 | ge: 3 | headings: 4 | # "Academic Achievements" 5 | acad_achievements: "Akademische Leistungen" 6 | # "Degree" 7 | degree: "Abschluss" 8 | # "Education" 9 | education: "Ausbildung" 10 | # "Professional Experience" 11 | experience: "Berufserfahrung" 12 | # "Extra Curricular Awards" 13 | extra_curricular: "Besondere Leistungen" 14 | # "GitHub Projects" 15 | github_projects: "GitHub Projekte" 16 | # GPA 17 | gpa: "Gesamtnote" 18 | # "Graduate Courses Taken" 19 | grad_courses: "Vertiefungsfächer Hauptstudium" 20 | # "Graduation Year" 21 | graduation_year: "Abschlussjahr" 22 | # "Institution" 23 | institution: "Hochschule/Universität" 24 | # "issued on" 25 | issuance: "Veröffentlicht am" 26 | # "Major" 27 | major: "Fachrichtung" 28 | # "Memberships" 29 | memberships: "Mitgliedschaften" 30 | # "Other Personal Projects" 31 | other_projects: "Weitere persönliche Projekte" 32 | # "Publications" 33 | papers: "Veröffentlichungen" 34 | # "Patents" 35 | patents: "Patente" 36 | # "Research Experience" 37 | research_experience: "Forschungserfahrung" 38 | # "Technical Skills" 39 | skills: "Qualifikationen" 40 | # "Qualifications summary" 41 | summary: "Übersicht" 42 | # "Technologies got to work on" 43 | technology_used: "Verwendete Technologien" 44 | # "Undergraduate Courses Taken" 45 | undergrad_courses: "Vertiefungsfächer" 46 | -------------------------------------------------------------------------------- /locale/ja.yml: -------------------------------------------------------------------------------- 1 | --- 2 | ja: 3 | headings: 4 | # "Academic Achievements" 5 | acad_achievements: "学業成就" 6 | # "Degree" 7 | degree: "学位" 8 | # "Education" 9 | education: "教育経歴" 10 | # "Professional Experience" 11 | experience: "職業経歴" 12 | # "Extra Curricular Awards" 13 | extra_curricular: "課外栄誉" 14 | # "GitHub Projects" 15 | github_projects: "GitHub プロジェクト" 16 | # GPA 17 | gpa: "GPA" 18 | # "Graduate Courses Taken" 19 | grad_courses: "修士課程" 20 | # "Graduation Year" 21 | graduation_year: "卒業時間" 22 | # "Institution" 23 | institution: "学校" 24 | # "issued on" 25 | issuance: "発行作品" 26 | # "Major" 27 | major: "専攻" 28 | # "Memberships" 29 | memberships: "会員資格" 30 | # "Other Personal Projects" 31 | other_projects: "個人プロジェクト" 32 | # "Publications" 33 | papers: "論文" 34 | # "Patents" 35 | patents: "特許" 36 | # "Research Experience" 37 | research_experience: "研究経歴" 38 | # "Technical Skills" 39 | skills: "技能" 40 | # "Qualifications summary" 41 | summary: "資格概要" 42 | # "Technologies got to work on" 43 | technology_used: "技術経験" 44 | # "Undergraduate Courses Taken" 45 | undergrad_courses: "学士課程" 46 | -------------------------------------------------------------------------------- /locale/pl.yml: -------------------------------------------------------------------------------- 1 | --- 2 | pl: 3 | headings: 4 | # "Academic Achievements" 5 | acad_achievements: "Dorobek naukowy" 6 | # "Degree" 7 | degree: "Stopień naukowy" 8 | # "Education" 9 | education: "Wykształcenie" 10 | # "Professional Experience" 11 | experience: "Doświadczenie zawodowe" 12 | # "Extra Curricular Awards" 13 | extra_curricular: "Dodatkowe osiągnięcia" 14 | # "GitHub Projects" 15 | github_projects: "Projekty na GitHubie" 16 | # GPA 17 | gpa: "Ocena końcowa" 18 | # "Graduate Courses Taken" 19 | grad_courses: "Studia podyplomowe" 20 | # "Graduation Year" 21 | graduation_year: "Rok ukończenia studiów" 22 | # "Institution" 23 | institution: "Uczelnia" 24 | # "issued on" 25 | issuance: "opublikowany w" 26 | # "Major" 27 | major: "Kierunek" 28 | # "Memberships" 29 | memberships: "Członkostwo" 30 | # "Other Personal Projects" 31 | other_projects: "Inne indywidualne projekty" 32 | # "Publications" 33 | papers: "Publikacje" 34 | # "Patents" 35 | patents: "Patenty" 36 | # "Research Experience" 37 | research_experience: "Doświadczenie badawcze" 38 | # "Technical Skills" 39 | skills: "Umiejętności techniczne" 40 | # "Qualifications summary" 41 | summary: "Podsumowanie kwalifikacji" 42 | # "Technologies got to work on" 43 | technology_used: "Środowisko techniczne" 44 | # "Undergraduate Courses Taken" 45 | undergrad_courses: "Studia licencjackie" 46 | -------------------------------------------------------------------------------- /locale/pt.yml: -------------------------------------------------------------------------------- 1 | --- 2 | pt: 3 | headings: 4 | # "Academic Achievements" 5 | acad_achievements: "Conquistas acadêmicas" 6 | # "Degree" 7 | degree: "Grau" 8 | # "Education" 9 | education: "Educação" 10 | # "Professional Experience" 11 | experience: "Experiência Profissional" 12 | # "Extra Curricular Awards" 13 | extra_curricular: "Prêmios extra-curriculares" 14 | # "GitHub Projects" 15 | github_projects: "Projetos GitHub" 16 | # GPA 17 | gpa: "GPA" 18 | # "Graduate Courses Taken" 19 | grad_courses: "Cursos de pós-graduação" 20 | # "Graduation Year" 21 | graduation_year: "Ano de Graduação" 22 | # "Institution" 23 | institution: "Instituição" 24 | # "issued on" 25 | issuance: "emitida em" 26 | # "Major" 27 | major: "Curso" 28 | # "Memberships" 29 | memberships: "Associações" 30 | # "Other Personal Projects" 31 | other_projects: "Outros Projetos Pessoais" 32 | # "Publications" 33 | papers: "Publicações" 34 | # "Patents" 35 | patents: "Patentes" 36 | # "Research Experience" 37 | research_experience: "Experiência de Pesquisa" 38 | # "Technical Skills" 39 | skills: "Habilidades Técnicas" 40 | # "Qualifications summary" 41 | summary: "Resumo de Qualificações" 42 | # "Technologies got to work on" 43 | technology_used: "Técnologias usadas" 44 | # "Undergraduate Courses Taken" 45 | undergrad_courses: "Cursos de graduação" 46 | -------------------------------------------------------------------------------- /locale/zh_cn.yml: -------------------------------------------------------------------------------- 1 | --- 2 | zh_cn: 3 | headings: 4 | # "Academic Achievements" 5 | acad_achievements: "学术成就" 6 | # "Degree" 7 | degree: "学位" 8 | # "Education" 9 | education: "教育经历" 10 | # "Professional Experience" 11 | experience: "专业经验" 12 | # "Extra Curricular Awards" 13 | extra_curricular: "课外奖励" 14 | # "GitHub Projects" 15 | github_projects: "GitHub 项目" 16 | # GPA 17 | gpa: "GPA" 18 | # "Graduate Courses Taken" 19 | grad_courses: "研究生课程" 20 | # "Graduation Year" 21 | graduation_year: "毕业时间" 22 | # "Institution" 23 | institution: "学校" 24 | # "issued on" 25 | issuance: "发表作品" 26 | # "Major" 27 | major: "专业" 28 | # "Memberships" 29 | memberships: "会员资格" 30 | # "Other Personal Projects" 31 | other_projects: "其他项目" 32 | # "Publications" 33 | papers: "论文" 34 | # "Patents" 35 | patents: "专利" 36 | # "Research Experience" 37 | research_experience: "科研经验" 38 | # "Technical Skills" 39 | skills: "专业技能" 40 | # "Qualifications summary" 41 | summary: "资质汇总" 42 | # "Technologies got to work on" 43 | technology_used: "涉及技术" 44 | # "Undergraduate Courses Taken" 45 | undergrad_courses: "本科课程" 46 | -------------------------------------------------------------------------------- /spec/json_resume/formatter_html_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | require 'json_resume/formatter_html' 3 | require 'json_resume/formatter' 4 | 5 | describe '#padder' do 6 | it 'pads a row if items are odd' do 7 | hash = { 'bio_data' => { 'test' => [ 8 | { 'name' => 'sub1', 'url' => 'url1' }, 9 | { 'name' => 'sub2', 'url' => 'url2' }, 10 | { 'name' => 'sub3', 'url' => 'url3' } 11 | ] } 12 | } 13 | formatter = JsonResume::FormatterHtml.new hash 14 | formatter.add_padding('test') 15 | expect(formatter.hash['bio_data']['test']['rows'].size).to eq(2) 16 | expect(formatter.hash['bio_data']['test']['rows'][-1]['columns'][-1]).to eq({}) 17 | end 18 | 19 | it 'doesn\'t pad a row if items are even' do 20 | subs = [ 21 | { 'name' => 'sub1', 'url' => 'url1' }, 22 | { 'name' => 'sub2', 'url' => 'url2' } 23 | ] 24 | hash = { 'bio_data' => { 'test' => subs } } 25 | formatter = JsonResume::FormatterHtml.new hash 26 | formatter.add_padding('test') 27 | expect(formatter.hash['bio_data']['test']['rows'].size).to eq(1) 28 | expect(formatter.hash['bio_data']['test']['rows'][0]['columns']).to eq(subs) 29 | end 30 | 31 | it 'ignores if data is null' do 32 | hash = { 'bio_data' => {} } 33 | formatter = JsonResume::FormatterHtml.new hash 34 | formatter.add_padding('test') 35 | expect(formatter.hash['bio_data']).to eq({}) 36 | end 37 | end 38 | 39 | describe '#urlformatter' do 40 | context 'when given a link for html output' do 41 | it 'converts link to href' do 42 | formatter = JsonResume::FormatterHtml.new({}) 43 | str = 'test [Hello](http://google.com)' 44 | formatter.format_link str 45 | expect(str).to eq('test Hello') 46 | end 47 | 48 | it 'converts autolink to url' do 49 | formatter = JsonResume::FormatterHtml.new({}) 50 | str = 'test <>' 51 | formatter.format_autolink str 52 | expect(str).to eq('test http://google.com') 53 | end 54 | 55 | it 'converts links and autolinks to url' do 56 | formatter = JsonResume::FormatterHtml.new({}) 57 | str = 'test <> [Hello](http://google.com) <>' 58 | formatter.format_string str 59 | expect(str).to eq('test http://google.com Hello http://google.com') 60 | end 61 | end 62 | end 63 | 64 | describe '#emphasis_formatting' do 65 | it 'italicizes on _text_' do 66 | formatter = JsonResume::FormatterHtml.new({}) 67 | str = 'Last word should be _italicized_' 68 | formatter.format_emphasis str 69 | expect(str).to eq('Last word should be italicized') 70 | end 71 | 72 | it 'bolds on **text**' do 73 | formatter = JsonResume::FormatterHtml.new({}) 74 | str = 'Last word should be **bold**' 75 | formatter.format_emphasis str 76 | expect(str).to eq('Last word should be bold') 77 | end 78 | 79 | it 'italicizes and bolds if given both' do 80 | formatter = JsonResume::FormatterHtml.new({}) 81 | str = 'Last word should _be **bold and italicized**_' 82 | formatter.format_emphasis str 83 | expect(str).to eq('Last word should be bold and italicized') 84 | end 85 | end 86 | 87 | describe '#format' do 88 | it 'calls parent format method' do 89 | formatter = JsonResume::FormatterHtml.new('bio_data' => {}) 90 | expect(formatter).to receive(:cleanse).and_return(nil) 91 | formatter.format 92 | end 93 | end 94 | -------------------------------------------------------------------------------- /spec/json_resume/formatter_latex_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | require 'json_resume/formatter_latex' 3 | 4 | describe '#urlformatter' do 5 | context 'when given a link for latex output' do 6 | it 'converts link to href' do 7 | formatter = JsonResume::FormatterLatex.new({}) 8 | str = 'test [Hello](http://google.com)' 9 | formatter.format_link str 10 | expect(str).to eq('test {\color{see} \href{http://google.com}{Hello}}') 11 | end 12 | 13 | it 'converts autolink to url' do 14 | formatter = JsonResume::FormatterLatex.new({}) 15 | str = 'test <>' 16 | formatter.format_autolink str 17 | expect(str).to eq('test {\color{see} \url{http://google.com}}') 18 | end 19 | 20 | it 'converts links and autolinks to url' do 21 | formatter = JsonResume::FormatterLatex.new({}) 22 | str = 'test <> [Hello](http://google.com) <>' 23 | formatter.format_string str 24 | expect(str).to eq('test {\color{see} \url{http://google.com}} {\color{see} \href{http://google.com}{Hello}} {\color{see} \url{http://google.com}}') 25 | end 26 | end 27 | end 28 | 29 | describe '#emphasis_formatting' do 30 | it 'italicizes on _text_' do 31 | formatter = JsonResume::FormatterLatex.new({}) 32 | str = 'Last word should be _italicized_' 33 | formatter.format_emphasis str 34 | expect(str).to eq('Last word should be \textit{italicized}') 35 | end 36 | 37 | it 'bolds on **text**' do 38 | formatter = JsonResume::FormatterLatex.new({}) 39 | str = 'Last word should be **bold**' 40 | formatter.format_emphasis str 41 | expect(str).to eq('Last word should be \textbf{bold}') 42 | end 43 | 44 | it 'italicizes and bolds if given both' do 45 | formatter = JsonResume::FormatterLatex.new({}) 46 | str = 'Last word should _be **bold and italicized**_' 47 | formatter.format_emphasis str 48 | expect(str).to eq('Last word should \textit{be \textbf{bold and italicized}}') 49 | end 50 | end 51 | -------------------------------------------------------------------------------- /spec/json_resume/formatter_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | require 'json_resume/formatter' 3 | 4 | describe '#cleanser' do 5 | context 'when given a hash' do 6 | it 'removes empty keys in a single level' do 7 | hash = { 'key1' => '', 'key2' => '' } 8 | formatter = JsonResume::Formatter.new hash 9 | expect(formatter.cleanse.hash).to eq({}) 10 | end 11 | 12 | it 'removes empty keys in a nested level' do 13 | hash = { 'key1' => 'non-empty', 'key2' => { 'key3' => [], 'key4' => '' } } 14 | formatter = JsonResume::Formatter.new hash 15 | expect(formatter.cleanse.hash).to eq('key1' => 'non-empty') 16 | end 17 | end 18 | end 19 | 20 | describe '#format_to_output_type' do 21 | it 'should make format calls to all valid strings' do 22 | hash = { 'key1' => 'non-empty', 'key2' => { 'key3' => ['test [Hello]{http://google.com}'] } } 23 | formatter = JsonResume::Formatter.new hash 24 | expect(formatter).to receive(:format_string).with('non-empty') 25 | expect(formatter).to receive(:format_string).with('test [Hello]{http://google.com}') 26 | formatter.format_to_output_type 27 | end 28 | end 29 | 30 | describe '#add_linkedin_github_url' do 31 | it 'creates linkedin url if id present' do 32 | hash = { 'linkedin_id' => 'xyz' } 33 | formatter = JsonResume::Formatter.new hash 34 | formatter.add_linkedin_github_url 35 | expect(formatter.hash['linkedin_url']).to eq('http://linkedin.com/in/xyz') 36 | end 37 | 38 | it 'creates github url if github id present' do 39 | hash = { 'github_id' => 'xyz' } 40 | formatter = JsonResume::Formatter.new hash 41 | formatter.add_linkedin_github_url 42 | expect(formatter.hash['github_url']).to eq('http://github.com/xyz') 43 | end 44 | 45 | it 'doesnt create url if id isnt present' do 46 | hash = {} 47 | formatter = JsonResume::Formatter.new hash 48 | formatter.add_linkedin_github_url 49 | expect(formatter.hash['linkedin_url']).to be_nil 50 | expect(formatter.hash['github_url']).to be_nil 51 | end 52 | end 53 | 54 | describe '#gpa_purger' do 55 | it 'removes gpa if not opted for' do 56 | hash = { 'bio_data' => { 'education' => { 'show_gpa' => false, 'schools' => [] } } } 57 | formatter = JsonResume::Formatter.new hash 58 | formatter.purge_gpa 59 | expect(formatter.hash['bio_data']['education']['show_gpa']).to be_nil 60 | end 61 | 62 | it 'removes gpa if gpa not mentioned' do 63 | hash = { 'bio_data' => { 'education' => { 'show_gpa' => true, 'schools' => [{}] } } } 64 | formatter = JsonResume::Formatter.new hash 65 | formatter.purge_gpa 66 | expect(formatter.hash['bio_data']['education']['show_gpa']).to be_nil 67 | end 68 | end 69 | -------------------------------------------------------------------------------- /spec/json_resume/reader_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | require 'json_resume/reader' 3 | require 'json_resume/formatter' 4 | 5 | describe '#reader' do 6 | context 'when given a json file name' do 7 | it 'reads in the file' do 8 | expect(File).to receive(:read).with('test.json').and_return("{\"test\":1}") 9 | reader = JsonResume::Reader.new 'test.json', {} 10 | expect(reader.hash).to eq('test' => 1) 11 | end 12 | end 13 | 14 | context 'when given a json string' do 15 | it 'reads in the string' do 16 | reader = JsonResume::Reader.new "{\"test\":1}", {} 17 | expect(reader.hash).to eq('test' => 1) 18 | end 19 | end 20 | 21 | context 'when doing a format!' do 22 | it 'updates the hash by calling the proper formatter' do 23 | expect_any_instance_of(JsonResume::FormatterHtml).to receive(:format).and_return(double(hash: {})) 24 | JsonResume::Reader.new("{\"test\":1}", {}).format! 25 | end 26 | 27 | it 'updates the hash by calling the proper formatter(Latex)' do 28 | expect_any_instance_of(JsonResume::FormatterLatex).to receive(:format).and_return(double(hash: {})) 29 | JsonResume::Reader.new("{\"test\":1}", output_type: 'latex').format! 30 | end 31 | end 32 | end 33 | -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | RSpec.configure do |config| 2 | config.expect_with :rspec do |c| 3 | c.syntax = :expect 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /templates/classic_tex.mustache: -------------------------------------------------------------------------------- 1 | {{=<% %>=}} 2 | \documentclass[letterpaper,11pt]{article} 3 | 4 | <%#bio_data%> 5 | %----------------------------------------------------------- 6 | \usepackage[empty]{fullpage} 7 | \usepackage{color} 8 | \definecolor{mygrey}{gray}{0.80} 9 | \raggedbottom 10 | \raggedright 11 | \setlength{\tabcolsep}{0in} 12 | 13 | % Adjust margins to 0.5in on all sides 14 | \addtolength{\oddsidemargin}{-0.5in} 15 | \addtolength{\evensidemargin}{-0.5in} 16 | \addtolength{\textwidth}{1.0in} 17 | \addtolength{\topmargin}{-0.5in} 18 | \addtolength{\textheight}{1.0in} 19 | \usepackage{multicol} 20 | \usepackage{hyperref} 21 | %----------------------------------------------------------- 22 | %Custom commands 23 | \newcommand{\resitem}[1]{\item #1 \vspace{-2pt}} 24 | \newcommand{\resheading}[1]{{\large \colorbox{mygrey}{\begin{minipage}{\textwidth}{\textbf{#1 \vphantom{p\^{E}}}}\end{minipage}}}} 25 | \newcommand{\ressubheading}[4]{ 26 | \begin{tabular*}{7.0in}{l@{\extracolsep{\fill}}r} 27 | \textbf{#1} & #2 \\ 28 | \textit{#3} & \textit{#4} \\ 29 | \end{tabular*}\vspace{-6pt}} 30 | %----------------------------------------------------------- 31 | 32 | % command and color used in this document, independently from moderncv 33 | \definecolor{see}{rgb}{0.5,0.5,0.5}% for web links 34 | 35 | \begin{document} 36 | 37 | \begin{tabular*}{7.5in}{l@{\extracolsep{\fill}}r} 38 | \textbf{\large <%&firstname%> <%&familyname%>} & <%#phone%><%.%> (phone)<%/phone%>\\ 39 | <%#stars%><%#items%><%name%><%^last%> $\star$ <%/last%><%/items%><%/stars%> & <%#email%><%.%><%/email%>\\ 40 | <%#website%> & <%& .%><%/website%>\\ 41 | \end{tabular*} 42 | \\ 43 | 44 | \vspace{0.1in} 45 | 46 | <%#summary%> 47 | \resheading{##summary##} 48 | \begin{itemize} 49 | <%#points%> 50 | \resitem{<%& .%>} 51 | <%/points%> 52 | \end{itemize} 53 | <%/summary%> 54 | 55 | 56 | <%#github_projects%> 57 | \resheading{##github_projects##} 58 | \begin{itemize} 59 | <%#details%> 60 | \item 61 | \ressubheading{\href{http://github.com/<%project_name%>}{<%project_name%>}}{}{<%#tagline%> - <%& .%><%/tagline%>}{} 62 | \begin{itemize} 63 | <%#description%> 64 | \resitem{<%& .%>} 65 | <%/description%> 66 | \end{itemize} 67 | <%/details%> 68 | \end{itemize} 69 | <%/github_projects%> 70 | 71 | <%#skills%> 72 | \resheading{##skills##} 73 | \begin{description} 74 | <%#details%> 75 | \item[<%type%>:] <%#items%><%name%><%^last%>, <%/last%><%/items%> 76 | <%/details%> 77 | \end{description} 78 | <%/skills%> 79 | 80 | <%#education%> 81 | \resheading{##education##} 82 | \begin{itemize} 83 | <%#schools%> 84 | \item 85 | \ressubheading{<%institution%>}{<%graduation_year%>}{<%degree%><%#major%>, <%major%><%/major%>}{<%#show_gpa%>##gpa##: <%gpa%><%/show_gpa%>} 86 | <%/schools%> 87 | \end{itemize} 88 | <%/education%> 89 | 90 | <%#acad_achievements%> 91 | \resheading{##acad_achievements##} 92 | \begin{itemize} 93 | <%#items%> 94 | \item{<%& .%>} 95 | <%/items%> 96 | \end{itemize} 97 | <%/acad_achievements%> 98 | 99 | <%#experience%> 100 | \resheading{##experience##} 101 | \begin{itemize} 102 | <%#items%> 103 | \item 104 | \ressubheading{<%organisation%>}{<%location%>}{<%title%>}{<%from%> – <%to%>} 105 | \begin{itemize} 106 | <%#details%>\resitem{<%& .%>}<%/details%> 107 | <%#technology_used%> 108 | \resitem{##technology_used##: <%#tools%><%name%><%^last%>, <%/last%><%/tools%>} 109 | <%/technology_used%> 110 | \end{itemize} 111 | <%/items%> 112 | 113 | \end{itemize} 114 | <%/experience%> 115 | 116 | <%#other_projects%> 117 | \resheading{##other_projects##} 118 | \begin{itemize} 119 | <%#items%> 120 | \resitem{<%& headline%>} 121 | \begin{itemize} 122 | <%#points%>\resitem{<%& .%>}<%/points%> 123 | <%#technology_used%> 124 | \resitem{##technology_used##: <%#tools%><%name%><%^last%>, <%/last%><%/tools%>} 125 | <%/technology_used%> 126 | \end{itemize} 127 | <%/items%> 128 | \end{itemize} 129 | <%/other_projects%> 130 | 131 | <%#grad_courses%> 132 | \resheading{##grad_courses##} 133 | \begin{multicols}{2} 134 | \begin{itemize} 135 | <%#rows%> 136 | <%#columns%> 137 | \item[] <%#name%>\href{<%& url%>}{<%name%>}<%/name%> 138 | <%/columns%> 139 | <%/rows%> 140 | \end{itemize} 141 | \end{multicols} 142 | <%/grad_courses%> 143 | 144 | <%#undergrad_courses%> 145 | \resheading{##undergrad_courses##} 146 | \begin{multicols}{2} 147 | \begin{itemize} 148 | <%#rows%> 149 | <%#columns%> 150 | \item[] <%#name%>\href{<%& url%>}{<%name%>}<%/name%> 151 | <%/columns%> 152 | <%/rows%> 153 | \end{itemize} 154 | \end{multicols} 155 | <%/undergrad_courses%> 156 | 157 | <%#research_experience%> 158 | \resheading{##research_experience##} 159 | \begin{itemize} 160 | <%#items%> 161 | \resitem{<%title%>, <%organisation%> <%location%> (<%from%> – <%to%>)} 162 | \begin{itemize} 163 | <%#points%>\resitem{<%& .%>}<%/points%> 164 | \end{itemize} 165 | <%/items%> 166 | \end{itemize} 167 | <%/research_experience%> 168 | 169 | 170 | <%#patents%> 171 | \resheading{##patents##} 172 | <%#items%> 173 | \begin{itemize} 174 | \resitem{<%patent_id%> - \textit{\href{<%url%>}{<%title%>}}<%#issuance_date%>, ##issuance## <%issuance_date%><%/issuance_date%>.} 175 | \end{itemize} 176 | <%/items%> 177 | <%/patents%> 178 | 179 | <%#papers%> 180 | \resheading{##papers##} 181 | \begin{description} 182 | <%#items%> 183 | \item["\href{<%url%>}{<%title%>}"] 184 | <%authors%>, \emph{<%&misc%>}. 185 | <%/items%> 186 | \end{description} 187 | <%/papers%> 188 | 189 | <%#memberships%> 190 | \resheading{##memberships##} 191 | \begin{itemize} 192 | <%#committees%> 193 | \resitem{<%& .%>} 194 | <%/committees%> 195 | \end{itemize} 196 | <%/memberships%> 197 | 198 | <%#extra_curricular%> 199 | \resheading{##extra_curricular##} 200 | \begin{itemize} 201 | <%#items%> 202 | \resitem{<%& .%>} 203 | <%/items%> 204 | \end{itemize} 205 | <%/extra_curricular%> 206 | 207 | <%/bio_data%> 208 | \end{document} 209 | %% end of file `page.tex'. 210 | -------------------------------------------------------------------------------- /templates/default_html.mustache: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | {{#bio_data}} 6 |
7 |
8 | {{#email}} 9 |
{{email}}
10 | {{/email}} 11 | {{#phone}} 12 |
{{phone}}
13 | {{/phone}} 14 | {{#website}} 15 |
{{website}} 16 | {{/website}} 17 |
18 |
19 | 20 |

{{firstname}} {{familyname}}

21 | {{#stars}} 22 | 23 | {{#items}} 24 | {{name}} {{^last}}
{{/last}} 25 | {{/items}} 26 |
27 | {{/stars}} 28 |

29 | 30 | {{#summary}} 31 |

##summary##

32 |
    33 | {{#points}} 34 |
  • {{{.}}}
  • 35 | {{/points}} 36 |
37 | {{/summary}} 38 | 39 | {{#github_projects}} 40 |

##github_projects##

41 |
    42 | {{#details}} 43 |
  • {{project_name}} 44 | {{#tagline}} » {{{tagline}}}{{/tagline}} 45 |
      46 | {{#description}} 47 |
    • {{{.}}}
    • 48 | {{/description}} 49 |
    50 |
  • 51 | {{/details}} 52 |
53 | {{/github_projects}} 54 | 55 | {{#skills}} 56 |

##skills##

57 |
    58 | {{#details}} 59 |
  • {{type}}: 60 | {{#items}} 61 | {{name}} 62 | {{/items}} 63 |
  • 64 | {{/details}} 65 |
66 | {{/skills}} 67 | 68 | {{#education}} 69 |

##education##

70 |
71 |
72 | 73 | 74 | {{#show_gpa}}{{/show_gpa}} 75 | 76 | {{#schools}} 77 | 78 | {{#show_gpa}}{{/show_gpa}} 79 | 80 | {{/schools}} 81 |
##degree####major####institution####graduation_year####gpa##
{{degree}}{{major}}{{institution}}{{graduation_year}}{{gpa}}
82 |
83 |
84 |
85 | 86 | 87 | {{#show_gpa}}{{/show_gpa}} 88 | 89 | {{#schools}} 90 | 91 | {{#show_gpa}}{{/show_gpa}} 92 | 93 | {{/schools}} 94 |
##degree####major####institution####graduation_year####gpa##
{{degree}}{{major}}{{institution}}{{graduation_year}}{{gpa}}
95 |
96 | {{/education}} 97 | 98 | {{#acad_achievements}} 99 |

##acad_achievements##

100 |
    101 | {{#items}} 102 |
  • {{{.}}}
  • 103 | {{/items}} 104 |
105 | {{/acad_achievements}} 106 | 107 | {{#experience}} 108 |

##experience##

109 |
    110 | {{#items}} 111 |
  • {{title}}, {{{organisation}}}{{#location}}, {{{location}}}{{/location}} 112 | ({{from}} – {{to}}) 113 |
      114 | {{#details}} 115 |
    • {{{.}}}
    • 116 | {{/details}} 117 | {{#technology_used}} 118 |
    • ##technology_used##: 119 | {{#tools}} 120 | {{name}} 121 | {{/tools}} 122 |
    • 123 | {{/technology_used}} 124 |
    125 |
  • 126 | {{/items}} 127 |
128 | {{/experience}} 129 | 130 | {{#other_projects}} 131 |

##other_projects##

132 |
    133 | {{#items}} 134 |
  • 135 | {{{headline}}} 136 |
      137 | {{#points}} 138 |
    • {{{.}}}
    • 139 | {{/points}} 140 | {{#technology_used}} 141 |
    • ##technology_used##: 142 | {{#tools}} 143 | {{name}} 144 | {{/tools}} 145 |
    • 146 | {{/technology_used}} 147 |
    148 |
  • 149 | {{/items}} 150 |
151 | {{/other_projects}} 152 | 153 | {{#grad_courses}} 154 |

##grad_courses##

155 | 156 | {{#rows}} 157 | 158 | {{#columns}} 159 | 160 | {{/columns}} 161 | 162 | {{/rows}} 163 |
{{name}}
164 | {{/grad_courses}} 165 | 166 | {{#undergrad_courses}} 167 |

##undergrad_courses##

168 | 169 | {{#rows}} 170 | 171 | {{#columns}} 172 | 173 | {{/columns}} 174 | 175 | {{/rows}} 176 |
{{name}}
177 | {{/undergrad_courses}} 178 | 179 | {{#research_experience}} 180 |

##research_experience##

181 |
    182 | {{#items}} 183 |
  • 184 | {{title}}, {{{organisation}}} 185 | ({{from}} – {{to}}) 186 |
      187 | {{#points}} 188 |
    • {{{.}}}
    • 189 | {{/points}} 190 |
    191 |
  • 192 | {{/items}} 193 |
194 | {{/research_experience}} 195 | 196 | {{#patents}} 197 |

##patents##

198 |
    199 | {{#items}} 200 |
  • {{patent_id}} 201 | {{title}} 202 | {{#issuance_date}}, ##issuance## {{issuance_date}}{{/issuance_date}}. 203 |
  • 204 | {{/items}} 205 |
206 | {{/patents}} 207 | 208 | {{#papers}} 209 |

##papers##

210 |
    211 | {{#items}} 212 |
  • {{authors}} 213 | {{title}}, 214 | {{{misc}}}. 215 |
  • 216 | {{/items}} 217 |
218 | {{/papers}} 219 | 220 | {{#memberships}} 221 |

##memberships##

222 |
    223 | {{#committees}} 224 |
  • {{{.}}}
  • 225 | {{/committees}} 226 |
227 | {{/memberships}} 228 | 229 | {{#extra_curricular}} 230 |

##extra_curricular##

231 |
    232 | {{#items}} 233 |
  • {{{.}}}
  • 234 | {{/items}} 235 |
236 | {{/extra_curricular}} 237 | 238 |
239 |
240 | {{#email}} 241 |
{{email}}
242 | {{/email}} 243 | {{#phone}} 244 |
{{phone}}
245 | {{/phone}} 246 | {{#website}} 247 |
{{website}} 248 | {{/website}} 249 |
250 |
251 | 252 | {{/bio_data}} 253 | 254 | {{#settings}} 255 | {{#icons}} 256 | 257 | {{/icons}} 258 | {{/settings}} 259 |
260 | -------------------------------------------------------------------------------- /templates/default_md.mustache: -------------------------------------------------------------------------------- 1 | {{#bio_data}} 2 | ##{{firstname}} {{familyname}} 3 | [{{website}}]({{website}}) {{#email}}`{{email}}`{{/email}} {{#phone}}`{{phone}}`{{/phone}} 4 | 5 | {{#stars}} 6 | {{#items}}{{name}}{{^last}} - {{/last}}{{/items}} 7 | {{/stars}} 8 | 9 | {{#summary}} 10 | ### ##summary## 11 | {{#points}} 12 | * {{{.}}} 13 | {{/points}} 14 | {{/summary}} 15 | 16 | {{#github_projects}} 17 | ### ##github_projects## 18 | {{#details}} 19 | * [{{project_name}}](http://github.com/{{project_name}}){{#tagline}} : {{tagline}}{{/tagline}} 20 | {{#description}} 21 | - {{{.}}} 22 | {{/description}} 23 | {{/details}} 24 | {{/github_projects}} 25 | 26 | {{#skills}} 27 | ### ##skills## 28 | {{#details}} 29 | * **{{type}}**: {{#items}}`{{name}}` {{/items}} 30 | {{/details}} 31 | {{/skills}} 32 | 33 | {{#education}} 34 | ### ##education## 35 | ##degree## | ##major## | ##institution## | ##graduation_year##{{#show_gpa}} | ##gpa##{{/show_gpa}} 36 | :--:|:--:|:--:|:--:{{#show_gpa}}|:--:{{/show_gpa}} 37 | {{#schools}} 38 | {{degree}} | {{major}} | {{institution}} | {{graduation_year}}{{#show_gpa}} | {{gpa}}{{/show_gpa}} 39 | {{/schools}} 40 | {{/education}} 41 | 42 | {{#acad_achievements}} 43 | ### ##acad_achievements## 44 | {{#items}} 45 | * {{{.}}} 46 | {{/items}} 47 | {{/acad_achievements}} 48 | 49 | {{#experience}} 50 | ### ##experience## 51 | {{#items}} 52 | * {{title}}, {{{organisation}}}{{#location}}, {{{location}}}{{/location}} ({{from}} – {{to}}) 53 | {{#details}} 54 | - {{{.}}} 55 | {{/details}} 56 | {{#technology_used}} 57 | - ##technology_used##: {{#tools}}`{{name}}` {{/tools}} 58 | {{/technology_used}} 59 | {{/items}} 60 | {{/experience}} 61 | 62 | {{#other_projects}} 63 | ### ##other_projects## 64 | {{#items}} 65 | * {{{headline}}} 66 | {{#points}} 67 | - {{{.}}} 68 | {{/points}} 69 | {{#technology_used}} 70 | - ##technology_used##: {{#tools}}`{{name}}` {{/tools}} 71 | {{/technology_used}} 72 | {{/items}} 73 | {{/other_projects}} 74 | 75 | {{#grad_courses}} 76 | ### ##grad_courses## 77 | {{#rows}} 78 | {{#columns}} 79 | {{#name}}* [{{name}}]({{url}}){{/name}} 80 | {{/columns}} 81 | {{/rows}} 82 | {{/grad_courses}} 83 | 84 | {{#undergrad_courses}} 85 | ### ##undergrad_courses## 86 | {{#rows}} 87 | {{#columns}} 88 | {{#name}}* [{{name}}]({{url}}){{/name}} 89 | {{/columns}} 90 | {{/rows}} 91 | {{/undergrad_courses}} 92 | 93 | {{#research_experience}} 94 | ### ##research_experience## 95 | {{#items}} 96 | * {{title}}, {{{organisation}}} ({{from}} – {{to}}) 97 | {{#points}} 98 | - {{{.}}} 99 | {{/points}} 100 | {{/items}} 101 | {{/research_experience}} 102 | 103 | {{#patents}} 104 | ### ##patents## 105 | {{#items}} 106 | * {{patent_id}} - **[{{title}}]({{url}})**{{#issuance_date}}, ##issuance## {{issuance_date}}{{/issuance_date}}. 107 | {{/items}} 108 | {{/patents}} 109 | 110 | {{#papers}} 111 | ### ##papers## 112 | {{#items}} 113 | * {{authors}} **[{{title}}]({{url}})** {{{misc}}}. 114 | {{/items}} 115 | {{/papers}} 116 | 117 | {{#memberships}} 118 | ### ##memberships## 119 | {{#committees}} 120 | * {{{.}}} 121 | {{/committees}} 122 | {{/memberships}} 123 | 124 | {{#extra_curricular}} 125 | ### ##extra_curricular## 126 | {{#items}} 127 | * {{{.}}} 128 | {{/items}} 129 | {{/extra_curricular}} 130 | {{/bio_data}} 131 | -------------------------------------------------------------------------------- /templates/default_tex.mustache: -------------------------------------------------------------------------------- 1 | {{=<% %>=}} 2 | \documentclass[11pt,a4paper]{moderncv} 3 | 4 | \moderncvtheme[black]{classic} 5 | 6 | \usepackage[utf8]{inputenc} 7 | \usepackage[scale=0.8]{geometry} 8 | 9 | <%#bio_data%> 10 | \firstname{<%&firstname%>} 11 | \familyname{\mbox{<%&familyname%>}} 12 | \title{\small <%#stars%><%#items%><%name%><%^last%> $\star$ <%/last%><%/items%><%/stars%>} 13 | <%#phone%>\phone{<%.%>}<%/phone%> 14 | <%#email%>\email{<%.%>}<%/email%> 15 | <%#raw_website%>\homepage{<%& .%>}<%/raw_website%> 16 | <%#linkedin_id%>\social[linkedin]{<%& .%>}<%/linkedin_id%> 17 | <%#github_id%>\social[github]{<%& .%>}<%/github_id%> 18 | 19 | % the ConTeXt symbol 20 | \def\ConTeXt{% 21 | C% 22 | \kern-.0333emo% 23 | \kern-.0333emn% 24 | \kern-.0667em\TeX% 25 | \kern-.0333emt} 26 | 27 | % command and color used in this document, independently from moderncv 28 | \definecolor{see}{rgb}{0.5,0.5,0.5}% for web links 29 | \newcommand{\up}[1]{\ensuremath{^\textrm{\scriptsize#1}}}% for text subscripts 30 | \renewcommand{\labelitemi}{$\circ$} 31 | 32 | %---------------------------------------------------------------------------------- 33 | % content 34 | %---------------------------------------------------------------------------------- 35 | \begin{document} 36 | \maketitle 37 | \vspace*{-1cm} 38 | 39 | <%#summary%> 40 | \section{\textsc{##summary##}} 41 | <%#points%> 42 | \cvitem{\textbullet}{<%& .%>} 43 | <%/points%> 44 | <%/summary%> 45 | 46 | <%#skills%> 47 | \section{\textsc{##skills##}} 48 | <%#details%> 49 | \cvitem{\textbullet}{\textbf{<%type%>}: <%#items%><%name%><%^last%>, <%/last%><%/items%>} 50 | <%/details%> 51 | <%/skills%> 52 | 53 | <%#github_projects%> 54 | \section{\textsc{##github_projects##}} 55 | <%#details%> 56 | \cvitem{\textbullet}{\textbf{\href{http://github.com/<%project_name%>}{<%project_name%>}}<%#tagline%> - <%& .%><%/tagline%>} 57 | \vspace*{-0.15cm} 58 | \cvitem{}{ 59 | {\footnotesize 60 | \begin{itemize} 61 | <%#description%>\item <%& .%><%/description%> 62 | \end{itemize} 63 | } 64 | } 65 | \vspace*{-0.5cm} 66 | <%/details%> 67 | <%/github_projects%> 68 | 69 | <%#experience%> 70 | \section{\textsc{##experience##}} 71 | % \cventry{years}{degree/job title}{institution/employer}{localization}{grade}{description} 72 | <%#items%> 73 | \cventry{<%from%> - <%to%>}{<%title%>}{<%organisation%>}{<%location%>}{}{ 74 | {\footnotesize 75 | \begin{itemize} 76 | <%#details%>\item <%& .%><%/details%> 77 | <%#technology_used%> 78 | \item ##technology_used##: 79 | <%#tools%><%name%><%^last%>, <%/last%><%/tools%> 80 | <%/technology_used%> 81 | \end{itemize} 82 | } 83 | } 84 | <%/items%> 85 | <%/experience%> 86 | 87 | <%#other_projects%> 88 | \section{\textsc{##other_projects##}} 89 | <%#items%> 90 | \cvitem{\textbullet}{<%& headline%>} 91 | \vspace*{-0.15cm} 92 | \cvitem{}{ 93 | {\footnotesize 94 | \begin{itemize} 95 | <%#points%>\item <%& .%><%/points%> 96 | <%#technology_used%> 97 | \item ##technology_used##: 98 | <%#tools%><%name%><%^last%>, <%/last%><%/tools%> 99 | <%/technology_used%> 100 | \end{itemize} 101 | } 102 | } 103 | \vspace*{-0.5cm} 104 | <%/items%> 105 | <%/other_projects%> 106 | 107 | <%#education%> 108 | \section{\textsc{##education##}} 109 | % \cventry{years}{degree/job title}{institution/employer}{localization}{grade}{description} 110 | <%#schools%> 111 | \cventry{<%graduation_year%>}{<%degree%><%#major%>, <%major%><%/major%>}{<%institution%>}{}{<%#show_gpa%>##gpa##: <%gpa%><%/show_gpa%>}{} 112 | <%/schools%> 113 | <%/education%> 114 | 115 | <%#acad_achievements%> 116 | \section{\textsc{##acad_achievements##}} 117 | <%#items%> 118 | % \cvitem{LHS}{RHS} 119 | \cvitem{\textbullet}{<%& .%>} 120 | <%/items%> 121 | <%/acad_achievements%> 122 | 123 | <%#grad_courses%> 124 | \section{\textsc{##grad_courses##}} 125 | <%#rows%> 126 | \cvlistdoubleitem 127 | <%#columns%>{<%#name%>\href{<%& url%>}{<%name%>}<%/name%>}<%/columns%> 128 | <%/rows%> 129 | <%/grad_courses%> 130 | 131 | <%#undergrad_courses%> 132 | \section{\textsc{##undergrad_courses##}} 133 | <%#rows%> 134 | \cvlistdoubleitem 135 | <%#columns%>{<%#name%>\href{<%& url%>}{<%name%>}<%/name%>}<%/columns%> 136 | <%/rows%> 137 | <%/undergrad_courses%> 138 | 139 | <%#research_experience%> 140 | \section{\textsc{##research_experience##}} 141 | <%#items%> 142 | \cventry{<%from%> - <%to%>}{<%title%>}{<%organisation%>}{<%location%>}{}{ 143 | {\footnotesize 144 | \begin{itemize} 145 | <%#points%>\item <%& .%><%/points%> 146 | \end{itemize} 147 | } 148 | } 149 | <%/items%> 150 | <%/research_experience%> 151 | 152 | <%#patents%> 153 | \section{\textsc{##patents##}} 154 | <%#items%> 155 | \cvitem{<%patent_id%>}{\textit{\href{<%url%>}{<%title%>}}<%#issuance_date%>, ##issuance## <%issuance_date%><%/issuance_date%>.} 156 | <%/items%> 157 | <%/patents%> 158 | 159 | <%#papers%> 160 | \section{\textsc{##papers##}} 161 | <%#items%> 162 | \cvitem{\textbullet}{<%authors%>, \textit{\href{<%url%>}{<%title%>}} <%& misc%>} 163 | <%/items%> 164 | <%/papers%> 165 | 166 | <%#memberships%> 167 | \section{\textsc{##memberships##}} 168 | <%#committees%> 169 | \cvitem{\textbullet}{<%& .%>} 170 | <%/committees%> 171 | <%/memberships%> 172 | 173 | <%#extra_curricular%> 174 | \section{\textsc{##extra_curricular##}} 175 | <%#items%> 176 | \cvitem{\textbullet}{<%& .%>} 177 | <%/items%> 178 | <%/extra_curricular%> 179 | 180 | <%/bio_data%> 181 | \end{document} 182 | %% end of file `page.tex'. 183 | --------------------------------------------------------------------------------