xmlresume2x 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,72 @@
1
+ # Configuration for the resume converter -*- ruby -*-
2
+ # Language file
3
+
4
+ keyword(
5
+ # general keywords
6
+ :Resume => 'Résumé',
7
+ :Of => 'of',
8
+ :In => 'in',
9
+ :And => 'and',
10
+ :AdditionalInformation => 'Additional Information',
11
+ :Phone => 'Phone',
12
+ :Phone_Home => 'Home Phone',
13
+ :Phone_Work => 'Work Phone',
14
+ :Phone_Mobile => 'Mobile Phone',
15
+ :Fax => 'Fax',
16
+ :Fax_Home => 'Home Fax',
17
+ :Fax_Work => 'Work Fax',
18
+ :Pager => 'Pager',
19
+ :IM_Aim => 'AIM',
20
+ :IM_Icq => 'ICQ',
21
+ :IM_Irc => 'IRC',
22
+ :IM_Jabber => 'Jabber',
23
+ :IM_Msn => 'MSN Messenger',
24
+ :IM_Yahoo => 'Yahoo! Messenger',
25
+ :Email => 'Email',
26
+ :Url => 'URL',
27
+ :Projects => 'Projects',
28
+ :Dates => 'Dates',
29
+ :LastModified => 'Last modified',
30
+ :Present => 'Present',
31
+
32
+ # for job history
33
+ :History_Title => 'Work Experience',
34
+ :History_Employer => 'Name and address of employer',
35
+ :History_Occupation => 'Occupation or position held',
36
+ :History_MainActivities => 'Main activities and responsibilities',
37
+ :History_Achievements => 'Achievements',
38
+
39
+ # for education
40
+ :Education_Title => 'Education And Training',
41
+ :Education_Organization => 'Name and type of organization providing education and training',
42
+ :Education_Level => 'Title of qualification awarded',
43
+ :Education_MajorStudies => 'Major Studies',
44
+ :Education_MinorStudies => 'Minor Studies',
45
+ :Education_Minor => 'minor',
46
+ :Education_Minors => 'minors',
47
+ :Education_Gpa => 'Grade Point Average (GPA)',
48
+ :Education_Gpa_Overall => 'Overall',
49
+ :Education_Gpa_Major => 'Major',
50
+ :Education_Gpa_Outof => 'out of',
51
+ :Education_Subjects => 'Subjects',
52
+
53
+ # for skills
54
+ :Skills_Title => 'Skills',
55
+
56
+ # for publications
57
+ :Publications_Title => 'Publications',
58
+ :Publications_In => 'in',
59
+
60
+ # for interests
61
+ :Interests_Title => 'Interests',
62
+
63
+ # for security clearances
64
+ :SecurityClearances_Title => 'Security Clearances',
65
+
66
+ # for awards
67
+ :Awards_Title => 'Awards',
68
+
69
+ # for referees
70
+ :Referees_Title => 'References'
71
+
72
+ )
@@ -0,0 +1,73 @@
1
+ # Configuration for the resume converter -*- ruby -*-
2
+ # Language file
3
+ # Thanks to Eva Langthaler for helping me with the translations
4
+
5
+ keyword(
6
+ # general keywords
7
+ :Resume => 'Curriculum Vitae',
8
+ :Of => 'de',
9
+ :In => 'en',
10
+ :And => 'et',
11
+ :AdditionalInformation => 'Informations Supplémentaires',
12
+ :Phone => 'Téléphone',
13
+ :Phone_Home => 'Téléphone privé',
14
+ :Phone_Work => 'Téléphone au travail',
15
+ :Phone_Mobile => 'Téléphone GSM',
16
+ :Fax => 'Télécopie',
17
+ :Fax_Home => 'Télécopie privé',
18
+ :Fax_Work => 'Télécopie au travail',
19
+ :Pager => 'Pager',
20
+ :IM_Aim => 'AIM',
21
+ :IM_Icq => 'ICQ',
22
+ :IM_Irc => 'IRC',
23
+ :IM_Jabber => 'Jabber',
24
+ :IM_Msn => 'MSN Messenger',
25
+ :IM_Yahoo => 'Yahoo! Messenger',
26
+ :Email => 'Courrier électronique',
27
+ :Url => 'URL',
28
+ :Projects => 'Projets',
29
+ :Dates => 'Dates',
30
+ :LastModified => 'Dernier modification',
31
+ :Present => 'Présent',
32
+
33
+ # for job history
34
+ :History_Title => 'Expérience Professionnelle',
35
+ :History_Employer => 'Nom et adresse de l''employeur',
36
+ :History_Occupation => 'Fonction ou poste occupé',
37
+ :History_MainActivities => 'Principales activités et responsabilités',
38
+ :History_Achievements => 'Réalisations',
39
+
40
+ # for education
41
+ :Education_Title => 'Education et Formation',
42
+ :Education_Organization => 'Nom et type de l''établissement disposant l''enseignement ou la formation',
43
+ :Education_Level => 'Intitulé du certificat ou diplôme délivré',
44
+ :Education_MajorStudies => 'Matières principales',
45
+ :Education_MinorStudies => 'Matières secondaires',
46
+ :Education_Minor => 'Matière secondaire',
47
+ :Education_Minors => 'Matières secondaires',
48
+ :Education_Gpa => 'Terme moyen des notes',
49
+ :Education_Gpa_Overall => 'Terme moyen des toutes les notes',
50
+ :Education_Gpa_Major => 'Terme moyen des notes des matières principales',
51
+ :Education_Gpa_Outof => 'de',
52
+ :Education_Subjects => 'Matières',
53
+
54
+ # for skills
55
+ :Skills_Title => 'Capacité',
56
+
57
+ # for publications
58
+ :Publications_Title => 'Publications',
59
+ :Publications_In => 'Dans',
60
+
61
+ # for interests
62
+ :Interests_Title => 'Intérêts',
63
+
64
+ # for security clearances
65
+ :SecurityClearances_Title => 'Compétence de sécurité',
66
+
67
+ # for awards
68
+ :Awards_Title => 'Distinctions',
69
+
70
+ # for referees
71
+ :Referees_Title => 'Références'
72
+
73
+ )
@@ -0,0 +1,137 @@
1
+ html {
2
+ margin: 0px 5%;
3
+ background-color: #eee;
4
+ }
5
+
6
+ body {
7
+ margin: 0px;
8
+ padding: 0px;
9
+ background-color: #fff;
10
+ font-size: 12px;
11
+ font-family: Verdana, Arial, Helvetica;
12
+ }
13
+
14
+ /* General layout of the page */
15
+
16
+ #header, #footer {
17
+ width: 100%;
18
+ background-color: #58b;
19
+ color: #fff;
20
+ }
21
+
22
+ #menu {
23
+ float: left;
24
+ width: 230px;
25
+ padding: 20px 0px 0px 20px;
26
+ border: 3px solid #58b;
27
+ }
28
+
29
+ #body {
30
+ margin-left: 250px;
31
+ padding: 20px;
32
+ }
33
+
34
+ #footer {
35
+ clear: both;
36
+ padding: 5px 0px;
37
+ text-align: center;
38
+ }
39
+
40
+
41
+ /* styling the header */
42
+
43
+ #headerbar {
44
+ width: 100%;
45
+ font-size: 90%;
46
+ }
47
+
48
+ span#navbar, span#languages {
49
+ padding: 3px;
50
+ width: 45%;
51
+ }
52
+
53
+ span#navbar {
54
+ float: left;
55
+ text-align: left;
56
+ }
57
+
58
+ span#languages {
59
+ float: right;
60
+ text-align: right;
61
+ }
62
+
63
+ div#header h1, h2 {
64
+ margin: 0px;
65
+ padding: 15px 50px 0px;
66
+
67
+ font-size: 300%;
68
+ font-style: italic;
69
+ font-weight: normal;
70
+ }
71
+
72
+ div#header h2 {
73
+ padding-top: 0px;
74
+ padding-bottom: 15px;
75
+ font-size: 100%;
76
+ }
77
+
78
+ /* styling the menu */
79
+
80
+ #menu a {
81
+ text-decoration: none;
82
+ color: #b55;
83
+ font-weight: bold;
84
+ font-size: 130%;
85
+ }
86
+
87
+ #menu a:hover {
88
+ text-decoration: underline;
89
+ }
90
+
91
+ #menu .webgen-menuitem-selected {
92
+ border-left: 3px solid #58b;
93
+ }
94
+
95
+ #menu .webgen-submenu {
96
+ }
97
+
98
+ #menu ul {
99
+ list-style-type: none;
100
+ padding: 0px;
101
+ margin-left: 10px;
102
+ }
103
+
104
+ #menu li > ul {
105
+ font-size: 95%;
106
+ }
107
+
108
+ #menu li {
109
+ margin: 0.0em 0px;
110
+ padding: 2px 0px;
111
+ padding-left: 5px;
112
+ border-left: 3px solid #CCCCCC;
113
+ }
114
+
115
+ /* styling the content */
116
+
117
+ div.section {
118
+ margin-bottom: 30px;
119
+ }
120
+
121
+ h2.section_header {
122
+ padding: 0px;
123
+ border-bottom: 3px double #8b5;
124
+
125
+ letter-spacing: 0.2em;
126
+ font-size: 150%;
127
+ font-weight: bold;
128
+ color: #8b5;
129
+ }
130
+
131
+ pre.webgen-file {
132
+ padding-left: 10px;
133
+ margin: 0px 10px;
134
+ border-left: 3px solid #8b5;
135
+ }
136
+
137
+ }
@@ -0,0 +1,33 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+ <title>XMLResume2x: {title: }</title>
7
+ <link href="{relocatable: default.css}" rel="stylesheet" />
8
+ </head>
9
+ <body>
10
+ <div id="header">
11
+ <h1>{title: }</h1>
12
+ <h2>xmlresume2x: converts an xml resume to various output formats</h2>
13
+ <div id="headerbar">
14
+ <span id="navbar">{navbar: }</span>
15
+ <span id="languages">{lang: }</span>
16
+ <div style="clear: both; border-top: 1px solid #58b"></div>
17
+ </div>
18
+ </div>
19
+
20
+ <div id="menu">
21
+ {menu: }
22
+ </div>
23
+
24
+ <div id="body">
25
+ {content: }
26
+ </div>
27
+
28
+ <div id="footer">
29
+ generated with <em><b><a href="http://webgen.rubyforge.org">webgen</a></b></em> on <b>{date: }</b>
30
+ </div>
31
+
32
+ </body>
33
+ </html>
@@ -0,0 +1,40 @@
1
+ <div class="section">
2
+ <h2 class="section_header">Download</h2>
3
+ <p>The newest version of xmlresume2x can be downloaded from Rubyforge.</p>
4
+ <p>Homepage: <a href="http://xmlresume2x.rubyforge.org">xmlresume2x.rubyforge.org</a><br />
5
+ Download: <a href="http://rubyforge.org/frs/?group_id=459">http://rubyforge.org/frs/?group_id=459</a>
6
+ </p>
7
+ </div>
8
+
9
+ <div class="section">
10
+ <h2 class="section_header">Dependencies</h2>
11
+ <p>None</p>
12
+ </div>
13
+
14
+ <div class="section">
15
+ <h2 class="section_header">Installation</h2>
16
+
17
+ You can use the standard way to install xmlresume2x. Download the package, open up a terminal and
18
+ change into the package root. Then do the following:
19
+ <pre>
20
+ $ ruby setup.rb config
21
+ $ ruby setup.rb setup
22
+ $ ruby setup.rb install
23
+ </pre>
24
+
25
+ Or you could use Rake and substitute the above commands with this:
26
+ <pre>
27
+ $ rake install
28
+ </pre>
29
+
30
+ Or you could use the RPA way:
31
+ <pre>
32
+ $ rpa install xmlresume2x
33
+ </pre>
34
+
35
+ Or you could use the GEM way:
36
+ <pre>
37
+ $ gem install xmlresume2x
38
+ </pre>
39
+
40
+ </div>
@@ -0,0 +1,24 @@
1
+ <div class="section">
2
+ <h2 class="section_header">Example files</h2>
3
+ <p>Here are the results when xmlresume2x is used for converting the two example résumés provided by
4
+ xmlresume.sf.net</p>
5
+ </div>
6
+
7
+ <div class="section">
8
+ <h2 class="section_header">Example1</h2>
9
+ <ul>
10
+ <li><a href="examples/example1.xml">XML source</a></li>
11
+ <li><a href="examples/example1.pdf">PDF version</a></li>
12
+ <li><a href="examples/example1.html">HTML version (without stylesheet)</a></li>
13
+ </ul>
14
+ </div>
15
+
16
+ <div class="section">
17
+ <h2 class="section_header">Example2</h2>
18
+ <ul>
19
+ <li><a href="examples/example2.xml">XML source</a></li>
20
+ <li><a href="examples/example2.pdf">PDF version</a></li>
21
+ <li><a href="examples/example2.html">HTML version (without stylesheet)</a></li>
22
+ </ul>
23
+
24
+ </div>
@@ -0,0 +1,9 @@
1
+ <div class="section">
2
+ <h2 class="section_header">Feature list</h2>
3
+ <ul>
4
+ <li>Uses the XML standard for résumés provided by <a href="http://xmlresume.sf.net">xmlresume.sf.net</a></li>
5
+ <li>Configuration files are pure Ruby - unleash the power!</li>
6
+ <li>Publish your résumé in PDF (using a good looking LaTeX template) or HTML!</li>
7
+ <li>Easily extendable</li>
8
+ </ul>
9
+ </div>
@@ -0,0 +1,29 @@
1
+ <div class="section">
2
+ <h2 class="section_header">Welcome</h2>
3
+ <p>... to the homepage of <i><b>xmlresume2x</b></i>, a converter for xml resumes.</p>
4
+ <p>Have a look around the site!</p>
5
+ </div>
6
+
7
+ <div class="section">
8
+ <h2 class="section_header">Description</h2>
9
+ <p>The <a href="http://xmlresume.sourceforge.net">"XML Résumé Library"</a> provides a way for storing
10
+ one's résumé data in a consistent way. The XML résumé can be transformed to various output formats,
11
+ including text, HTML and PDF by utilizing XSLT.</p>
12
+
13
+ <p>I came across the <a href="http://www.cedefop.eu.int/transparency/cv.asp">European Curriculum
14
+ Vitae</a> format which provides a standard for CVs in Europe. Nicola Vitacolonna has used this
15
+ information to provide a LaTeX class - <a
16
+ href="http://www.ctan.org/tex-archive/help/Catalogue/entries/europecv.html">europecv</a> - which
17
+ (nearly) conforms to this standard. As the XML Résumé Library does not have a converter for this, I
18
+ wrote this program to convert an XML résumé to a LaTeX file which uses the europecv class.</p>
19
+
20
+ <p>During the development process I realized that it would be useful to add support for other output
21
+ formats. Therefore I changed the conversion process to use configuration files so that this program
22
+ can be used to transform a résumé to any output format.</p>
23
+
24
+ </div>
25
+
26
+ <div class="section">
27
+ <h2 class="section_header">And so ...</h2>
28
+ <p>... have fun!</p>
29
+ </div>
@@ -0,0 +1,135 @@
1
+ <p align="center" style="font-size: Large; font-weight: bold">This manual is for version {includeFile: ../../VERSION} of xmlresume2x!</p>
2
+
3
+ <div class="section">
4
+ <h2 class="section_header">How To Use xmlresume2x?</h2>
5
+ <p>xmlresume2x is a CLI application, ie. you can only use it from the command line. You need to
6
+ specify the XML resume file which you want to convert, the output format and the language, like this:</p>
7
+ <pre>
8
+ xmlresume2x -f latex-europecv -l en myresume.xml
9
+ </pre>
10
+ <p>The former converts the resume <code>myresume.xml</code> into a LaTeX file which uses the
11
+ latex-europecv class. Have a look at the help screen for other available options.</p>
12
+
13
+ <p>If you are not satisfied with the way some things are transformed or named, you can specify your
14
+ own configuration file. This allows you to override the default transformation settings.</p>
15
+ <p>The resume files have to conform to XML resume >=1.5.1, must not use deprecated elements and have
16
+ to use the element <code>&lt;resume&gt;</code> as root element!</p>
17
+ </div>
18
+
19
+ <div class="section">
20
+ <h2 class="section_header">How It Works</h2>
21
+ <p>The application itself is rather simple, the power lies in the configuration files. There are two
22
+ types of configuration files, for formats and for languages. A format file is the equivalent to an
23
+ XSL file: it defines how the XML file is translated. A language file contains phrases in a specific
24
+ language which are then used in the format files.</p>
25
+
26
+ <p>When xmlresume2x is started, the given format and language files are read and the input file is
27
+ translated accordingly.</p>
28
+ </div>
29
+
30
+ <div class="section">
31
+ <h2 class="section_header">Currently Available Formats And Languages</h2>
32
+ <dl>
33
+ <dt>Formats</dt>
34
+ <dd>latex-europecv (for producing PDF and other formats supported by LaTeX), xhtml</dd>
35
+
36
+ <dt>Languages</dt>
37
+ <dd>English (en), German (de), French (fr)</dd>
38
+ </dl>
39
+ </div>
40
+
41
+
42
+ <div class="section">
43
+ <h2 class="section_header">Configuration Files</h2>
44
+ <p>The configuration files are pure Ruby files, so you can use the full power of Ruby!</p>
45
+
46
+ <p>Basically, all you do in a configuration file is:</p>
47
+ <ol>
48
+ <li>Define processors for specific XML elements</li>
49
+ <li>Define keywords for a specific language</li>
50
+ </ol>
51
+ <p>Normally, these two actions are separated from each other and put into different files: one or
52
+ more format files and one or more language files. This separation does not have to occur, as
53
+ processors and keywords can be defined in any configuration file. However, this separation makes it
54
+ easier to combine languages and formats.</p>
55
+
56
+ <p>The configuration files are normally located in the <code>/usr/share/xmlresume2x</code>
57
+ directory. Format files should go into the sub directory <code>format</code> and language files in
58
+ the sub directory <code>lang</code>.</p>
59
+
60
+
61
+ <h3>List of available commands</h3>
62
+ <p>This is a list of additional commands that can and should be used in configuration files (<a
63
+ href="rdoc/classes/XMLResume2x/ResumeProcessor.html">here</a> is a description of them):</p>
64
+ <ul>
65
+ <li>add_processor</li>
66
+ <li>processor</li>
67
+ <li>call_processor</li>
68
+ <li>keyword</li>
69
+ <li>get_value</li>
70
+ <li>get_children_value</li>
71
+ <li>load_config</li>
72
+ </ul>
73
+
74
+ <h3>Processors</h3>
75
+
76
+ <p>Processors are the heart of the transformation process. You can create an unlimited number of
77
+ processors which can be assigned to specific XML elements. Each processor defines how an XML element
78
+ should be transformed (the XSL equivalent would be <code>xsl:template</code>). Let's take a look at
79
+ an example:</p>
80
+ <pre>
81
+ processor 'contact' => 'ContactProcessor' do |contact|
82
+ str = ''
83
+ str &lt;&lt; contact.phone.collect {|phone| "#{phone_location(phone._location)}: #{phone}" }.join( NEWLINE ) if contact.phone
84
+ str &lt;&lt; NEWLINE + contact.fax.collect {|fax| "#{fax_location(fax._location)}: #{fax}" }.join( NEWLINE ) if contact.fax
85
+ str &lt;&lt; NEWLINE + contact.pager.collect {|pager| "#{keyword(:Pager)}: #{pager}" }.join( NEWLINE ) if contact.pager
86
+ str &lt;&lt; NEWLINE + contact.email.collect {|email| "#{keyword(:Email)}: \\url{#{email}}" }.join( NEWLINE ) if contact.email
87
+ str &lt;&lt; NEWLINE + contact.url.collect {|url| "#{keyword(:Url)}: \\url{#{url}}" }.join( NEWLINE ) if contact.url
88
+ str &lt;&lt; NEWLINE + contact.instantMessage.collect {|im| "#{im_service(im._service)}: #{im}" }.join( NEWLINE ) if contact.instantMessage
89
+ str
90
+ end
91
+ </pre>
92
+ <p>This defines a processor <code>ContactProcessor</code> which is assigned to the element
93
+ <code>contact</code>. All the format files shipped with xmlresume2x use a convention for the
94
+ processor names: <code>&lt;capitalized element name&gt;Processor</code> (useful when overriding a
95
+ processor with a user defined one). The first parameter is always the element which should be
96
+ transformed (there is an optional second parameter for passing options). The associated block
97
+ defines how the <code>contact</code> is transformed.</p>
98
+
99
+ <p>REXML is used for reading in the XML resume. Two wrapper classes are used to simplify the use of
100
+ the XML elements: ElementWrapper wraps a single REXML::Element objecct and ElementWrapperList wraps
101
+ a bunch of them. Using these wrappers, you can do the following:</p>
102
+ <ul>
103
+ <li>Access the first <code>phone</code> subelement from contact: <code>contact.phone</code></li>
104
+ <li>Join all phones: <code>contact.phone.join(', ')</code></li>
105
+ <li>Access the attribute <code>location</code> of the first <code>phone</code> subelement: <code>contact.phone._location</code></li>
106
+ </ul>
107
+
108
+ <p>So, subelements of an element are accessed by using the name of the subelement as method name. If
109
+ there is more than one subelement of the same type, you can use the bracket notation to access the
110
+ others: <code>contact.phone[1]</code>. Attributes of an element are accessed by prepending an
111
+ underscore to the attribute name and using that as method name.</p>
112
+
113
+ <h3>Keywords</h3>
114
+
115
+ <p>Not all words in the result document are directly taken from the XML resume file. Some words,
116
+ e.g. headers like <code>Additional Information</code>, are inserted to make reading easier.
117
+ Naturally, these words are not the same in every language and therefore they have to be defined
118
+ somewhere.</p>
119
+
120
+ <p>These keywords are normally defined in the language files. These files are Ruby source files too
121
+ and contain statements like this:</p>
122
+ <pre>
123
+ keyword(
124
+ # general keywords
125
+ :Resume => 'Resume',
126
+ :Of => 'of',
127
+ :AdditionalInformation => 'Additional Information',
128
+ )
129
+ </pre>
130
+ <p>The <code>keyword</code> function takes a Hash as argument to define new keywords or overwrite
131
+ already defined ones. The key has to be a Symbol and the value has to be a String in UTF8 format. Any
132
+ keyword can be defined this way and later, in a configuration file, used by calling the
133
+ <code>keyword</code> function with a Symbol as argument.</p>
134
+
135
+ </div>