;;; ox-hugocv.el --- LaTeX hugocv Back-End for Org Export Engine -*- lexical-binding: t; -*- ;; Copyright (C) 2018 Free Software Foundation, Inc. ;; Author: Oscar Najera ;; Keywords: org, wp, tex ;; This file is not part of GNU Emacs. ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 3, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;; Boston, MA 02110-1301, USA. ;;; Commentary: ;; ;; This library implements a LaTeX hugocv back-end, derived from the ;; LaTeX one. ;;; Code: (require 'ox-hugo) (require 'org-cv-utils) ;;; User-Configurable Variables (defgroup org-export-hugocv nil "Options for exporting Org mode files to Hugo-compatible Markdown" :tag "Org Export Hugo CV" :group 'org-export :version "25.3") ;;; Define Back-End (org-export-define-derived-backend 'hugocv 'hugo :options-alist '( (:mobile "MOBILE" nil nil parse) (:homepage "HOMEPAGE" nil nil parse) (:address "ADDRESS" nil nil newline) (:photo "PHOTO" nil nil parse) (:with-email nil "email" t t) ) :translate-alist '((headline . org-hugocv-headline) (inner-template . org-hugocv-inner-template))) (setq org-hugocv--recognized-social-networks '((:url "https://www.github.com/" :icon "fa-github") (:url "https://www.gitlab.com/" :icon "fa-gitlab") (:url "https://www.linkedin.com/in/" :icon "fa-linkedin") (:url "https://twitter.com/" :icon "fa-twitter") (:url "https://facebook.com/" :icon "fa-facebook") (:url "https://www.instagram.com/" :icon "fa-instagram"))) (defun org-hugocv--crop-edges (x) "String is so remove first and last chars." (let ((le (- (length x) 1))) (substring x 1 le))) (defun org-hugocv--format-cventry (headline contents info) "Format HEADLINE as as cventry. CONTENTS holds the contents of the headline. INFO is a plist used as a communication channel." (let* ((entry (org-cv-utils--parse-cventry headline info)) (loffset (string-to-number (plist-get info :hugo-level-offset))) ;"" -> 0, "0" -> 0, "1" -> 1, .. (level (org-export-get-relative-level headline info)) (title (concat (make-string (+ loffset level) ?#) " " (alist-get 'title entry)))) (format "\n%s %s " title (alist-get 'employer entry) (alist-get 'location entry) (org-cv-utils--format-time-window (alist-get 'from-date entry) (alist-get 'to-date entry)) contents))) (defun social-entry (icon url handle) (let* ((nw-handle (string-trim handle)) (icon-wrap (if (org-string-nw-p icon) (format " %s" icon nw-handle) nw-handle))) (format "%s" url nw-handle icon-wrap))) (defun org-hugocv--unknown-social-channels (headline contents info) (let ((icon (org-export-data (org-element-property :ICON headline) info)) (url (org-export-data (org-element-property :URL headline) info)) (handle (org-export-data contents info))) (concat (if (org-string-nw-p icon) "" (concat (org-export-data (org-element-property :title headline) info) " : ")) (social-entry icon url handle)))) (defun org-hugocv--pick-social-network (channel contents) (-any (lambda (network) (when (string-match-p channel (plist-get network :url)) (social-entry (plist-get network :icon) (plist-get network :url) contents))) recognized-social-networks)) (defun org-hugocv--format-socialchannels (headline contents info) (let* ((channel (downcase (org-export-data (org-element-property :title headline) info))) (entry (org-hugocv--pick-social-network channel contents))) (cond (entry entry) ((org-element-property :URL headline) (org-hugocv--unknown-social-channels headline contents info)) ((org-export-with-backend 'hugo headline contents info))))) ;;;; Headline (defun org-hugocv-headline (headline contents info) "Transcode HEADLINE element into hugocv code. CONTENTS is the contents of the headline. INFO is a plist used as a communication channel." (unless (org-element-property :footnote-section-p headline) (let ((environment (let ((env (org-export-get-category headline info))) (or (org-string-nw-p env) "block")))) (cond ;; is a cv entry ((equal environment "cventry") (org-hugocv--format-cventry headline contents info)) ((equal environment "social") (org-hugocv--format-socialchannels headline contents info)) ((org-export-with-backend 'hugo headline contents info)))))) (defun org-hugocv-inner-template (contents info) "Return body of document after converting it to Hugo-compatible Markdown. CONTENTS is the transcoded contents string. INFO is a plist holding export options." (concat "\n\n" (org-hugo-inner-template contents info))) (provide 'ox-hugocv) ;;; ox-hugocv ends here