CINXE.COM
Unit 1 | Graphite
<!DOCTYPE html> <html lang="en-US"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=Edge"> <link rel="stylesheet" href="/assets/css/just-the-docs-default.css"> <script src="/assets/js/vendor/lunr.min.js"></script> <script src="/assets/js/just-the-docs.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="icon" href="/assets/images/favicon.ico" type="image/x-icon"> <!-- Begin Jekyll SEO tag v2.8.0 --> <title>Unit 1 | Graphite</title> <meta name="generator" content="Jekyll v4.3.2" /> <meta property="og:title" content="Unit 1" /> <meta property="og:locale" content="en_US" /> <meta name="description" content="Site for Graphite" /> <meta property="og:description" content="Site for Graphite" /> <link rel="canonical" href="https://silnrsi.github.io/graphite/tutorial/graide_tutorial1.html" /> <meta property="og:url" content="https://silnrsi.github.io/graphite/tutorial/graide_tutorial1.html" /> <meta property="og:site_name" content="Graphite" /> <meta property="og:type" content="website" /> <meta name="twitter:card" content="summary" /> <meta property="twitter:title" content="Unit 1" /> <script type="application/ld+json"> {"@context":"https://schema.org","@type":"WebPage","description":"Site for Graphite","headline":"Unit 1","url":"https://silnrsi.github.io/graphite/tutorial/graide_tutorial1.html"}</script> <!-- End Jekyll SEO tag --> </head> <body> <a class="skip-to-main" href="#main-content">Skip to main content</a> <svg xmlns="http://www.w3.org/2000/svg" class="d-none"> <symbol id="svg-link" viewBox="0 0 24 24"> <title>Link</title> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"> <path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path> </svg> </symbol> <symbol id="svg-menu" viewBox="0 0 24 24"> <title>Menu</title> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-menu"> <line x1="3" y1="12" x2="21" y2="12"></line><line x1="3" y1="6" x2="21" y2="6"></line><line x1="3" y1="18" x2="21" y2="18"></line> </svg> </symbol> <symbol id="svg-arrow-right" viewBox="0 0 24 24"> <title>Expand</title> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-chevron-right"> <polyline points="9 18 15 12 9 6"></polyline> </svg> </symbol> <!-- Feather. MIT License: https://github.com/feathericons/feather/blob/master/LICENSE --> <symbol id="svg-external-link" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-external-link"> <title id="svg-external-link-title">(external link)</title> <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1="10" y1="14" x2="21" y2="3"></line> </symbol> <symbol id="svg-doc" viewBox="0 0 24 24"> <title>Document</title> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-file"> <path d="M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z"></path><polyline points="13 2 13 9 20 9"></polyline> </svg> </symbol> <symbol id="svg-search" viewBox="0 0 24 24"> <title>Search</title> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-search"> <circle cx="11" cy="11" r="8"></circle><line x1="21" y1="21" x2="16.65" y2="16.65"></line> </svg> </symbol> <!-- Bootstrap Icons. MIT License: https://github.com/twbs/icons/blob/main/LICENSE.md --> <symbol id="svg-copy" viewBox="0 0 16 16"> <title>Copy</title> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-clipboard" viewBox="0 0 16 16"> <path d="M4 1.5H3a2 2 0 0 0-2 2V14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3.5a2 2 0 0 0-2-2h-1v1h1a1 1 0 0 1 1 1V14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3.5a1 1 0 0 1 1-1h1v-1z"/> <path d="M9.5 1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5h3zm-3-1A1.5 1.5 0 0 0 5 1.5v1A1.5 1.5 0 0 0 6.5 4h3A1.5 1.5 0 0 0 11 2.5v-1A1.5 1.5 0 0 0 9.5 0h-3z"/> </svg> </symbol> <symbol id="svg-copied" viewBox="0 0 16 16"> <title>Copied</title> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-clipboard-check-fill" viewBox="0 0 16 16"> <path d="M6.5 0A1.5 1.5 0 0 0 5 1.5v1A1.5 1.5 0 0 0 6.5 4h3A1.5 1.5 0 0 0 11 2.5v-1A1.5 1.5 0 0 0 9.5 0h-3Zm3 1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5h3Z"/> <path d="M4 1.5H3a2 2 0 0 0-2 2V14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3.5a2 2 0 0 0-2-2h-1v1A2.5 2.5 0 0 1 9.5 5h-3A2.5 2.5 0 0 1 4 2.5v-1Zm6.854 7.354-3 3a.5.5 0 0 1-.708 0l-1.5-1.5a.5.5 0 0 1 .708-.708L7.5 10.793l2.646-2.647a.5.5 0 0 1 .708.708Z"/> </svg> </symbol> </svg> <div class="side-bar"> <div class="site-header" role="banner"> <a href="/" class="site-title lh-tight"> Graphite </a> <button id="menu-button" class="site-button btn-reset" aria-label="Toggle menu" aria-pressed="false"> <svg viewBox="0 0 24 24" class="icon" aria-hidden="true"><use xlink:href="#svg-menu"></use></svg> </a> </div> <nav aria-label="Main" id="site-nav" class="site-nav"> <ul class="nav-list"><li class="nav-list-item"><a href="/" class="nav-list-link">Home</a></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="toggle items in About Graphite category" aria-pressed="false"> <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg> </button><a href="/graphite_about.html" class="nav-list-link">About Graphite</a><ul class="nav-list"><li class="nav-list-item "><a href="/graphite_aboutWhy.html" class="nav-list-link">Why was Graphite developed?</a></li><li class="nav-list-item "><button class="nav-list-expander btn-reset" aria-label="toggle items in Graphite and OpenType category" aria-pressed="false"> <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg> </button><a href="/graphite_aboutOT.html" class="nav-list-link">Graphite and OpenType</a><ul class="nav-list"><li class="nav-list-item "> <a href="/graphite_otcompare.html" class="nav-list-link">Comparison of OpenType and Graphite shaping speeds in a Nastaliq context</a> </li></ul></li><li class="nav-list-item "><a href="/graphite_techAbout.html" class="nav-list-link">Graphite technical overview</a></li></ul></li><li class="nav-list-item"><a href="/graphite_news.html" class="nav-list-link">News</a></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="toggle items in Using Graphite category" aria-pressed="false"> <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg> </button><a href="/graphite_appsParent.html" class="nav-list-link">Using Graphite</a><ul class="nav-list"><li class="nav-list-item "><a href="/graphite_apps.html" class="nav-list-link">Applications that support Graphite</a></li><li class="nav-list-item "><a href="/graphite_firefox.html" class="nav-list-link">Graphite and Firefox</a></li><li class="nav-list-item "><a href="/graphite_fontdemo.html" class="nav-list-link">Graphite Font Demo</a></li><li class="nav-list-item "><a href="/graphite_fonts.html" class="nav-list-link">Graphite-enabled Fonts</a></li></ul></li><li class="nav-list-item active"><button class="nav-list-expander btn-reset" aria-label="toggle items in Developers category" aria-pressed="true"> <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg> </button><a href="/graphite_dev.html" class="nav-list-link">Developers</a><ul class="nav-list"><li class="nav-list-item "><a href="/graphite_devFont.html" class="nav-list-link">Font Development</a></li><li class="nav-list-item "><a href="/graide.html" class="nav-list-link">Graide</a></li><li class="nav-list-item active"><button class="nav-list-expander btn-reset" aria-label="toggle items in Graphite Tutorial category" aria-pressed="true"> <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg> </button><a href="/graide_tutorial.html" class="nav-list-link">Graphite Tutorial</a><ul class="nav-list"><li class="nav-list-item active"> <a href="/tutorial/graide_tutorial1.html" class="nav-list-link active">Unit 1</a> </li><li class="nav-list-item "> <a href="/tutorial/graide_tutorial2.html" class="nav-list-link">Unit 2</a> </li><li class="nav-list-item "> <a href="/tutorial/graide_tutorial3.html" class="nav-list-link">Unit 3</a> </li><li class="nav-list-item "> <a href="/tutorial/graide_tutorial4.html" class="nav-list-link">Unit 4</a> </li><li class="nav-list-item "> <a href="/tutorial/graide_tutorial5.html" class="nav-list-link">Unit 5</a> </li><li class="nav-list-item "> <a href="/tutorial/graide_tutorial6.html" class="nav-list-link">Unit 6</a> </li><li class="nav-list-item "> <a href="/tutorial/graide_tutorial7.html" class="nav-list-link">Unit 7</a> </li><li class="nav-list-item "> <a href="/tutorial/graide_tutorial8.html" class="nav-list-link">Unit 8</a> </li><li class="nav-list-item "> <a href="/tutorial/graide_tutorial8a.html" class="nav-list-link">Intermission</a> </li><li class="nav-list-item "> <a href="/tutorial/graide_tutorial9.html" class="nav-list-link">Unit 9</a> </li><li class="nav-list-item "> <a href="/tutorial/graide_tutorial10.html" class="nav-list-link">Unit 10</a> </li><li class="nav-list-item "> <a href="/tutorial/graide_tutorial11.html" class="nav-list-link">Unit 11</a> </li><li class="nav-list-item "> <a href="/tutorial/graide_tutorial12.html" class="nav-list-link">Unit 12</a> </li><li class="nav-list-item "> <a href="/tutorial/graide_tutorial13.html" class="nav-list-link">Unit 13</a> </li><li class="nav-list-item "> <a href="/tutorial/graide_tutorial14.html" class="nav-list-link">Unit 14</a> </li><li class="nav-list-item "> <a href="/tutorial/graide_tutorial15.html" class="nav-list-link">Unit 15</a> </li><li class="nav-list-item "> <a href="/tutorial/graide_tutorial16.html" class="nav-list-link">Unit 16</a> </li><li class="nav-list-item "> <a href="/tutorial/graide_tutorial17.html" class="nav-list-link">Unit 17</a> </li><li class="nav-list-item "> <a href="/tutorial/graide_tutorial18.html" class="nav-list-link">Unit 18</a> </li><li class="nav-list-item "> <a href="/tutorial/graide_tutorial_end.html" class="nav-list-link">Conclusion</a> </li><li class="nav-list-item "> <a href="/tutorial/graphite_tut_solutions.html" class="nav-list-link">Solutions to Tutorial Exercises</a> </li></ul></li><li class="nav-list-item "><a href="/graphite_codeSnippets.html" class="nav-list-link">GDL Code Snippets</a></li><li class="nav-list-item "><a href="/graphite_devApp.html" class="nav-list-link">Adding Graphite to Your Application</a></li></ul></li><li class="nav-list-item"><a href="/graphite_download.html" class="nav-list-link">Download</a></li><li class="nav-list-item"><a href="/graphite_support.html" class="nav-list-link">Support</a></li><li class="nav-list-item"><a href="/graphite_contact.html" class="nav-list-link">Contact</a></li></ul> </nav> <footer class="site-footer"> This site uses <a href="https://github.com/just-the-docs/just-the-docs">Just the Docs</a>, a documentation theme for Jekyll. </footer> </div> <div class="main" id="top"> <div id="main-header" class="main-header"> <div class="search" role="search"> <div class="search-input-wrap"> <input type="text" id="search-input" class="search-input" tabindex="0" placeholder="Search Graphite site" aria-label="Search Graphite site" autocomplete="off"> <label for="search-input" class="search-label"><svg viewBox="0 0 24 24" class="search-icon"><use xlink:href="#svg-search"></use></svg></label> </div> <div id="search-results" class="search-results"></div> </div> <nav aria-label="Auxiliary" class="aux-nav"> <ul class="aux-nav-list"> <li class="aux-nav-list-item"> <a href="https://github.com/silnrsi/graphite" class="site-button" > Repository </a> </li> </ul> </nav> </div> <div id="main-content-wrap" class="main-content-wrap"> <nav aria-label="Breadcrumb" class="breadcrumb-nav"> <ol class="breadcrumb-nav-list"> <li class="breadcrumb-nav-list-item"><a href="/graphite_dev.html">Developers</a></li> <li class="breadcrumb-nav-list-item"><a href="/graide_tutorial.html">Graphite Tutorial</a></li> <li class="breadcrumb-nav-list-item"><span>Unit 1</span></li> </ol> </nav> <div id="main-content" class="main-content"> <main> <div class="table-wrapper"><table class="tut-nav-bar"> <tbody> <tr> <td><a href="../graide_tutorial#contents">▲ Contents</a></td> <td><a href="graide_tutorial2">Unit 2: A very simple GDL program ▶</a></td> </tr> </tbody> </table></div><hr /> <h1 id="unit-1-running-installing-and-debugging-with-graide"> <a href="#unit-1-running-installing-and-debugging-with-graide" class="anchor-heading" aria-labelledby="unit-1-running-installing-and-debugging-with-graide"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Unit 1: Running, installing, and debugging with Graide </h1> <p><a href="graide_tutorial1#exercise-1a">Exercises</a></p> <h2 id="discussion"> <a href="#discussion" class="anchor-heading" aria-labelledby="discussion"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Discussion </h2> <p>When you execute the Graide program with no arguments, the first step will be to create a configuration file indicating at minimum the following aspects of your project:</p> <ul> <li>Font (.TTF) file</li> <li>Graphite source code (.GDL) file</li> </ul> <p>Other files that are used or created by Graide include:</p> <ul> <li>Configuration (.CFG) file</li> <li>Test data (.XML) file</li> <li>Debugger (.GDX) file</li> <li>Font compilation error message file (gdlerr.txt)</li> </ul> <h2 id="exercise-1a"> <a href="#exercise-1a" class="anchor-heading" aria-labelledby="exercise-1a"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Exercise 1a </h2> <p><strong>Step 1.</strong> Download the tutorial package.</p> <p><a href="../assets/resources/GraphiteTutorialPkg_v6.zip" class="btn btn-blue">Download</a></p> <p>Create or locate a workspace folder for this tutorial; this is where your fonts and source code files will go. Copy the files called <strong>allcaps.gdl</strong> and <strong>DoulosGrTut.ttf</strong> from the tutorial materials folder into that folder. Make sure the file properties are set to read-write.</p> <p><strong>Step 2.</strong> Run graide.exe. Choose the <strong>Project > New Project</strong> menu option. You will be asked for a configuration file. Navigate to your workspace folder and enter the file name as tutorial.cfg. This will create a configuration file with that name.</p> <p><strong>Step 3.</strong> A dialog will appear requesting other project details.</p> <ul> <li>Set the Font File to the DoulosGrTut.ttf file you copied in Step 1.</li> <li>Set the GDL File to the allcaps.gdl file you copied in Step 1.</li> <li>Set the Tests File to tutorial_tests.xml.</li> </ul> <p class="image-tight"><img src="../assets/images/graide1_1_createProject.png" alt="Creating a Graide project" /></p> <figcaption>Creating a Graide project</figcaption> <p>Click OK. The contents of the <strong>allcaps.gdl</strong> file now appears in the code (upper right-hand) pane. In the lower right-hand pane, the Font tab shows the glyphs in the <strong>DoulosGrTut.ttf</strong> font.</p> <p><strong>Step 4.</strong> Check your workspace folder. A file has been created called <strong>tutorial.cfg</strong>.</p> <p>Once your .cfg file exists, you can indicate that Graide should use it initially by including the -p option when you start Graide: <code class="language-plaintext highlighter-rouge">graide -p tutorial.cfg</code>.</p> <p><strong>Step 5.</strong> Find the uppercase A in the Fonts tab (on the lower right-hand pane) and double-click on it. The left-hand pane switches to the Glyph tab and displays the information for the A glyph.</p> <p class="image-tight"><img src="../assets/images/graide1_2_glyphTab.png" alt="Graide Font and Glyph tabs" /></p> <figcaption>Graide Font and Glyph tabs </figcaption> <blockquote> </blockquote> <p><strong>Step 6.</strong> Build the Graphite tables into the font by clicking the gear icon associated with the code pane. In the lower pane, click on the Errors tab to double-check that there were no errors. (Normally the Error tab will be automatically brought into focus if there are errors.) You should see the text <strong>Compilation succeeded – 0 errors, 0 warnings</strong>. Your workspace folder should now contain a file called DoulosGrTut.gdx.</p> <p class="image-tight"><img src="../assets/images/graide1_3_buildSucceed.png" alt="Building a font in Graide" /></p> <figcaption>Building a font in Graide </figcaption> <p><strong>Step 7.</strong> Create some test data as follows: Click on the Tests tab again. In the middle (test data) pane, type: Hello world! Click the right-pointing arrow. The bottom (test results) pane shows the results of the Graphite rendering: <strong>HELLO WORLD!</strong></p> <p class="image-tight"><img src="../assets/images/graide1_4_runHelloWorld.png" alt="Running test data in Graide" /></p> <figcaption>Running test data in Graide</figcaption> <p><strong>Step 8.</strong> Graphite will show you which rules were run in the process of rendering. In the case of this font, there is only one rule in the GDL program. If the Passes tab is not selected, click on it. Double click on the box that says <strong>Pass: 1 - substitution</strong>. Then double-click on any box that says <strong>Rule: 0</strong>. Graide will display and highlight the single rule in the code pane:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>clsLowerCase > clsUpperCase; </code></pre></div></div> <p class="image-tight"><img src="../assets/images/graide1_5_clickRule.png" alt="Highlighting a rule that was fired" /></p> <figcaption>Highlighting a rule that was fired</figcaption> <p>We will begin to learn about rules in Unit 2.</p> <h2 id="exercise-1b"> <a href="#exercise-1b" class="anchor-heading" aria-labelledby="exercise-1b"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Exercise 1b </h2> <p>For the second exercise, we will deliberately introduce some errors into the <strong>allcaps.gdl</strong> program and discover how Graide assists in correcting them.</p> <p><strong>Step 1.</strong> Click on the Classes tab in the left-hand pane. Double-click on the cell labeled <strong>clsUpperCase</strong>. Notice how the following line is highlighted:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>clsUpperCase = codepoint(“ABCDEFGHIJKLMNOPQRSTUVWXYZ”); </code></pre></div></div> <p><strong>Step 2.</strong> Change the name of the class to clsUppercase and change the letter “L” in the codepoint function to “X”:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>clsUppercase = codepoint(“ABCDEFGHIJKXMNOPQRSTUVWXYZ”); </code></pre></div></div> <p>(Note that the line does not need to be highlighted in order to edit it; the highlighting is simply a convenient feature of Graide.)</p> <p>We have now introduced two bugs into the program: a syntactic error (incorrect class name) and a logical error (mismatch between the upper- and lower-case letters).</p> <p><strong>Step 3.</strong> Build the font by clicking on the gear icon. The Error tab becomes active with an error message indicating the syntax error:</p> <p><strong>allcaps.gdl(23):error(3139): Undefined class name: clsUpperCase</strong></p> <p>Double-click on error message, and the rule with the (now) incorrect class name is highlighted.</p> <p><strong>Step 4.</strong> Correct either the class definition or the rule so that the names match. Build again by clicking the gear icon. You should see a message saying <strong>Compilation succeeded</strong>.</p> <p><strong>Step 5.</strong> Click on the Tests tab in the left-hand pane. If your test data has disappeared from the middle pane, retype it: <code class="language-plaintext highlighter-rouge">Hello world!</code>. Click the right-pointing arrow icon. You will now see the result of Graphite’s rendering which includes the bug that was introduced: <strong>HEXXO WORXD!</strong></p> <p><strong>Step 6.</strong> If you like, fix the bug in the definition of <code class="language-plaintext highlighter-rouge">clsUppercase</code>, rebuild and rerun the test to see the correct results.</p> <div class="table-wrapper"><table class="tut-nav-bar"> <tbody> <tr> <td><a href="../graide_tutorial#contents">▲ Contents</a></td> <td><a href="graide_tutorial2">Unit 2: A very simple GDL program ▶</a></td> </tr> </tbody> </table></div> </main> <hr> <footer> <p class="text-small text-grey-dk-100 mb-0">Copyright © 2012-2023 SIL International and released under the <a href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution-ShareAlike 3.0 license (CC-BY-SA)</a> unless noted otherwise.</p> </footer> </div> </div> <div class="search-overlay"></div> </div> </body> </html>