{"id":24504354,"url":"https://github.com/vegardit/haxe-strings","last_synced_at":"2026-02-03T14:02:38.745Z","repository":{"id":37976872,"uuid":"60469583","full_name":"vegardit/haxe-strings","owner":"vegardit","description":"A haxelib for consistent cross-platform UTF-8 string manipulation.","archived":false,"fork":false,"pushed_at":"2025-10-18T20:12:08.000Z","size":1518,"stargazers_count":79,"open_issues_count":0,"forks_count":17,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-10-19T11:44:57.164Z","etag":null,"topics":["ansi","globbing","haxe","haxelib","random-string","semver","spell-checker","spellchecker","string-manipulation","string-manipulations","stringtools"],"latest_commit_sha":null,"homepage":"","language":"Haxe","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vegardit.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2016-06-05T16:28:03.000Z","updated_at":"2025-10-18T20:11:56.000Z","dependencies_parsed_at":"2023-02-09T19:16:25.789Z","dependency_job_id":"97680784-6e90-4d14-8885-3ffc2d11cb16","html_url":"https://github.com/vegardit/haxe-strings","commit_stats":{"total_commits":356,"total_committers":5,"mean_commits":71.2,"dds":"0.014044943820224698","last_synced_commit":"a026c8c1d652d0197067659210d054c73de3453c"},"previous_names":[],"tags_count":33,"template":false,"template_full_name":null,"purl":"pkg:github/vegardit/haxe-strings","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vegardit%2Fhaxe-strings","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vegardit%2Fhaxe-strings/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vegardit%2Fhaxe-strings/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vegardit%2Fhaxe-strings/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vegardit","download_url":"https://codeload.github.com/vegardit/haxe-strings/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vegardit%2Fhaxe-strings/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29047076,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-03T10:09:22.136Z","status":"ssl_error","status_checked_at":"2026-02-03T10:09:16.814Z","response_time":96,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansi","globbing","haxe","haxelib","random-string","semver","spell-checker","spellchecker","string-manipulation","string-manipulations","stringtools"],"created_at":"2025-01-21T23:23:14.338Z","updated_at":"2026-02-03T14:02:38.728Z","avatar_url":"https://github.com/vegardit.png","language":"Haxe","funding_links":[],"categories":[],"sub_categories":[],"readme":"# haxe-strings - [StringTools](http://api.haxe.org/StringTools.html) on steroids.\n\n[![Build Status](https://github.com/vegardit/haxe-strings/workflows/Build/badge.svg \"GitHub Actions\")](https://github.com/vegardit/haxe-strings/actions?query=workflow%3A%22Build%22)\n[![Release](https://img.shields.io/github/release/vegardit/haxe-strings.svg)](http://lib.haxe.org/p/haxe-strings)\n[![License](https://img.shields.io/github/license/vegardit/haxe-strings.svg?label=license)](#license)\n[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-v2.1%20adopted-ff69b4.svg)](CODE_OF_CONDUCT.md)\n\n1. [What is it?](#what-is-it)\n1. [The `Strings` utility class](#strings-class)\n1. [The `String8` type](#string8-type)\n1. [The spell checker](#spell-checker)\n1. [The string collection classes](#string-collections)\n1. [The `StringBuilder` class](#stringbuilder-class)\n1. [The `Ansi` class](#ansi-class)\n1. [Random string generation](#random-strings)\n1. [Semantic version parsing with the `Version` type](#version-type)\n1. [Installation](#installation)\n1. [Using the latest code](#latest)\n1. [License](#license)\n\n\n## \u003ca name=\"what-is-it\"\u003e\u003c/a\u003eWhat is it?\n\nA [haxelib](http://lib.haxe.org/documentation/using-haxelib/) for consistent cross-platform UTF-8 string manipulation.\n\nAll classes are located in the package `hx.strings` or below.\n\nThe library has been extensively unit tested (over 1,700 individual test cases) on the targets C++, C#, [Eval](https://haxe.org/blog/eval/), Flash, [HashLink](https://hashlink.haxe.org/),\nJava, JavaScript ([Node.js](https://nodejs.org) and PhantomJS), [Neko](https://nekovm.org/), [PHP](https://www.php.net/) 7 and [Python](https://www.python.org/) 3.\n\n**Note:**\n* When targeting PHP ensure the [php_mbstring](http://php.net/manual/en/book.mbstring.php) extension is enabled in the `php.ini` file. This extension is required for proper UTF-8 support.\n\n### Haxe compatiblity\n\n|haxe-strings    |Haxe           |\n|----------------|---------------|\n|1.0.0 to 4.0.0  |3.2.1 or higher|\n|5.0.0 to 5.2.4  |3.4.2 or higher|\n|6.0.0 or higher |4.0.5 or higher|\n\n\n## \u003ca name=\"strings-class\"\u003e\u003c/a\u003eThe `Strings` utility class\n\nThe [hx.strings.Strings](https://github.com/vegardit/haxe-strings/blob/main/src/hx/strings/Strings.hx) class provides handy utility methods for string manipulations.\n\nIt also contains improved implementations of functions provided by Haxe's [StringTools](http://api.haxe.org/StringTools.html) class.\n\nMethods ending with the letter `8` (e.g. `length8()`, `indexOf8()`, `toLowerCase8()`) are improved versions of similar methods\nprovided by Haxe's [String](http://api.haxe.org/String.html) class, offering UTF-8 support and consistent behavior across all platforms (including Neko).\n\nThe [hx.strings.Strings](https://github.com/vegardit/haxe-strings/blob/main/src/hx/strings/Strings.hx) class can also be used as a [static extension](http://haxe.org/manual/lf-static-extension.html).\n\n\n### \u003ca name=\"strings-examples\"\u003e\u003c/a\u003eSome examples\n\n```haxe\nusing hx.strings.Strings; // augment all Strings with new functions\n\nclass Test {\n\n   static function main() {\n      // Strings are extended:\n      \"\".isEmpty();      // returns true\n      \"   \".isBlank();   // returns true\n      \"123\".isDigits();  // returns true\n      \"a\".repeat(3);     // returns \"aaa\"\n      \"abc\".reverse();   // returns \"cba\"\n\n      // Int's are extended too:\n      32.toChar().isSpace();       // returns true\n      32.toChar().toString();      // returns \" \"\n      32.toChar().isAscii();       // returns true\n      6000.toChar().isAscii();     // returns false\n      6000.toChar().isUTF8();      // returns true\n      74.toHex();                  // returns \"4A\"\n\n      // all functions are null-safe:\n      var nullString:String = null;\n      nullString.length8();         // returns 0\n      nullString.contains(\"cat\");   // returns false\n\n      // all methods support UTF-8 on all platforms:\n      \"кот\".toUpperCase8();         // returns \"КОТ\"\n      \"кот\".toUpperCaseFirstChar(); // returns \"Кот\"\n      \"はいはい\".length8();          // returns 4\n\n      // ANSI escape sequence processing:\n      \"\\x1B[1;33mHello World!\\x1B[0m\".ansiToHtml();            // returns '\u003cspan style=\"color:yellow;font-weight:bold;\"\u003eHello World!\u003c/span\u003e'\n      \"\\x1B[1;33mHello World!\\x1B[0m\".ansiToHtml(CssClasses);  // returns '\u003cspan class=\"ansi_fg_yellow ansi_bold\"\u003eHello World!\u003c/span\u003e'\n      \"\\x1B[1mHello World!\\x1B[0m\".removeAnsi();               // returns \"Hello World!\"\n\n      // It is also possible to fully customize the css class names used using a callback:\n      \"\\x1B[1;33mHello World!\\x1B[0m\".ansiToHtml(CssClassesCallback(function(st:hx.strings.AnsiState):String {\n         var a : Array\u003cString\u003e = [];\n         if (st.fgcolor != null) a.push(\"someprefix_fg_\" + st.fgcolor + \"_somesuffix\");\n         if (st.bgcolor != null) a.push(\"someprefix_bg_\" + st.fgcolor);\n         if (st.bold)            a.push(\"someprefix_bold\");\n         if (st.underline)       a.push(\"someprefix_underline\");\n         if (st.blink)           a.push(\"someprefix_blink\");\n         return a.join(\" \");\n       })));  // returns '\u003cspan class=\"ansi_fg_yellow ansi_bold\"\u003eHello World!\u003c/span\u003e'\n\n      // case formatting:\n      \"look at me\".toUpperCamel();       // returns \"LookAtMe\"\n      \"MyCSSClass\".toLowerCamel();       // returns \"myCSSClass\"\n      \"MyCSSClass\".toLowerHyphen();      // returns \"my-css-class\"\n      \"MyCSSClass\".toLowerUnderscore();  // returns \"my_css_class\"\n      \"myCSSClass\".toUpperUnderscore();  // returns \"MY_CSS_CLASS\"\n\n      // ellipsizing strings:\n      \"The weather is very nice\".ellipsizeLeft(20);    // returns \"The weather is ve...\"\n      \"The weather is very nice\".ellipsizeMiddle(20);  // returns \"The weath...ery nice\"\n      \"The weather is very nice\".ellipsizeRight(20);   // returns \"...ther is very nice\"\n\n      // string differences:\n      \"It's green\".diffAt(\"It's red\"); // returns 5\n      \"It's green\".diff(\"It's red\");   // returns { left: 'green', right: 'red', at: 5 }\n\n      // hash codes:\n      \"Cool String\".hashCode();       // generate a platform specific hash code\n      \"Cool String\".hashCode(CRC32);  // generate a hash code using CRC32\n      \"Cool String\".hashCode(JAVA);   // generate a hash code using the Java hash algorithm\n\n      // cleanup:\n      \"/my/path/\".removeLeading(\"/\");       // returns \"my/path/\"\n      \"/my/path/\".removeTrailing(\"/\");      // returns \"/my/path\"\n      \"\u003ci\u003eSo\u003c/i\u003e \u003cb\u003enice\u003c/b\u003e\".removeTags(); // returns \"So nice\"\n   }\n}\n```\n\n## \u003ca name=\"string8-type\"\u003e\u003c/a\u003eThe `String8` type\n\nThe `hx.strings.String8` is an abstract type based on `String`. All exposed methods are UTF-8 compatible and have consistent behavior across platforms.\n\nIt can be used as a drop-in replacement for type String.\n\nExample usage:\n```haxe\nclass Test {\n   static function main() {\n      var str:String = \"はいはい\";  // create a string with UTF8 chars\n      str.length;  // will return different values depending on the default UTF8 support of the target platform\n\n      var str8:String8 = str; // we assign the string to a variable of type String8 - because of the nature of Haxe`s abstract types this will not result in the creation of a new object instance\n      str8.length;  // will return the correct character length on all platforms\n\n      str8.ellipsizeLeft(2); // the String8 type automatically has all utility string functions provided by the Strings class.\n   }\n}\n```\n\nThe type declaration in the Strings8.hx file is nearly empty because all methods are auto generated based on the static methods provided by the `hx.strings.Strings` class.\n\n## \u003ca name=\"spell-checker\"\u003e\u003c/a\u003eThe spell checker\n\nThe package [hx.strings.spelling](https://github.com/vegardit/haxe-strings/blob/main/src/hx/strings/spelling) contains an extensible spell checker implementation that is based on ideas outlined by Peter Norvig in his article [How to write a Spell Checker](http://www.norvig.com/spell-correct.html).\n\nThe [SpellChecker#correctWord()](https://github.com/vegardit/haxe-strings/blob/main/src/hx/strings/spelling/checker/SpellChecker.hx#L38) method can for example be used to implement a Google-like \"did you mean 'xyz'?\" feature for a custom search engine.\n\nNow let's do some spell checking...\n\n```haxe\nimport hx.strings.spelling.checker.*;\nimport hx.strings.spelling.dictionary.*;\nimport hx.strings.spelling.trainer.*;\n\nclass Test {\n   static function main() {\n      /*\n       * first we use the English spell checker with a pre-trained dictionary\n       * that is bundled with the library:\n       */\n      EnglishSpellChecker.INSTANCE.correctWord(\"speling\");  // returns \"spelling\"\n      EnglishSpellChecker.INSTANCE.correctWord(\"SPELING\");  // returns \"spelling\"\n      EnglishSpellChecker.INSTANCE.correctWord(\"SPELLING\"); // returns \"spelling\"\n      EnglishSpellChecker.INSTANCE.correctWord(\"spell1ng\"); // returns \"spelling\"\n      EnglishSpellChecker.INSTANCE.correctText(\"sometinG zEems realy vrong!\") // returns \"something seems really wrong!\"\n      EnglishSpellChecker.INSTANCE.suggestWords(\"absance\"); // returns [ \"absence\", \"advance\", \"balance\" ]\n\n      /*\n       * let's check the pre-trained German spell checker\n       */\n      GermanSpellChecker.INSTANCE.correctWord(\"schreibweise\");  // returns \"Schreibweise\"\n      GermanSpellChecker.INSTANCE.correctWord(\"Schreibwiese\");  // returns \"Schreibweise\"\n      GermanSpellChecker.INSTANCE.correctWord(\"SCHREIBWEISE\");  // returns \"Schreibweise\"\n      GermanSpellChecker.INSTANCE.correctWord(\"SCHRIBWEISE\");   // returns \"Schreibweise\"\n      GermanSpellChecker.INSTANCE.correctWord(\"Schre1bweise\");  // returns \"Schreibweise\"\n      GermanSpellChecker.INSTANCE.correctText(\"etwaz kohmische Aepfel ligen vör der Thür\"); // returns \"etwas komische Äpfel liegen vor der Tür\"\n      GermanSpellChecker.INSTANCE.suggestWords(\"Sistem\");       // returns[ \"System\", \"Sitte\", \"Sitten\" ]\n\n      /*\n       * now we train our own dictionary from scratch\n       */\n      var myDict = new InMemoryDictionary(\"English\");\n      // download some training text with good vocabular\n      var trainingText = haxe.Http.requestUrl(\"http://www.norvig.com/big.txt\");\n      // populating the dictionary might take a while:\n      EnglishDictionaryTrainer.INSTANCE.trainWithString(myDict, trainingText);\n      // let's use the trained dictionary with a spell checker\n      var mySpellChecker = new EnglishSpellChecker(myDict);\n      mySpellChecker.INSTANCE.correctWord(\"speling\");  // returns \"spelling\"\n\n      // since training a dictionary can be quite time consuming, we save\n      // the analyzed words and their popularity/frequency to a file\n      myDict.exportWordsToFile(\"myDict.txt\");\n\n      // the word list can later be loaded using\n      myDict.loadWordsFromFile(\"myDict.txt\");\n   }\n}\n```\n\n\n## \u003ca name=\"string-collections\"\u003e\u003c/a\u003eThe string collection classes\n\nThe package [hx.strings.collection](https://github.com/vegardit/haxe-strings/blob/main/src/hx/strings/collection) contains some useful collection classes for strings.\n\n1. [StringSet](https://github.com/vegardit/haxe-strings/blob/main/src/hx/strings/collection/StringSet.hx) is a collection of unique strings. Each string is guaranteed to only exists once within the collection.\n   ```haxe\n   var set = new hx.strings.collection.StringSet();\n   set.add(\"a\");\n   set.add(\"a\");\n   set.add(\"b\");\n   set.add(\"b\");\n   // at this point the set only contains two elements: one 'a' and one 'b'\n   ```\n\n2. [SortedStringSet](https://github.com/vegardit/haxe-strings/blob/main/src/hx/strings/collection/SortedStringSet.hx) is a sorted collection of unique strings. A custom comparator can be provided for using different sorting algorithm.\n\n3. [SortedStringMap](https://github.com/vegardit/haxe-strings/blob/main/src/hx/strings/collection/SortedStringMap.hx) is a map that is sorted by there keys (which are of type [String](http://api.haxe.org/String.html)).\n\n\n## \u003ca name=\"stringbuilder-class\"\u003e\u003c/a\u003eThe `StringBuilder` class\n\nThe [hx.strings.StringBuilder](https://github.com/vegardit/haxe-strings/blob/main/src/hx/strings/StringBuilder.hx) class is an alternative to the built-in [StringBuf](http://api.haxe.org/StringBuf.html).\nIt provides an fluent API, cross-platform UTF-8 support and the ability to insert Strings at arbitrary positions.\n\n```haxe\nimport hx.strings.StringBuilder;\n\nclass Test {\n   static function main() {\n      // create a new instance with initial content\n      var sb = new StringBuilder(\"def\");\n\n      // insert / add some strings via fluent API calls\n      sb.insert(0, \"abc\")\n         .newLine()   // appends \"\\n\"\n         .add(\"ghi\")\n         .addChar(106);\n\n      sb.toString();  // returns \"abcdef\\nghij\\n\"\n\n      sb.clear();     // reset the internal state\n\n      sb.addAll([\"a\", 1, true, null]);\n\n      sb.toString();  // returns \"a1truenull\"\n   }\n}\n```\n\n\n## \u003ca name=\"ansi-class\"\u003e\u003c/a\u003eThe `Ansi` class\n\nThe [hx.strings.ansi.Ansi](https://github.com/vegardit/haxe-strings/blob/main/src/hx/strings/ansi/Ansi.hx) class provides functionalities to write [ANSI escape sequences](https://en.wikipedia.org/wiki/ANSI_escape_code) in a type-safe manner.\n\n```haxe\nimport hx.strings.ansi.Ansi;\n\nclass Test {\n   static function main() {\n      var stdout = Sys.stdout();\n\n      stdout.writeString(Ansi.fg(RED));           // set the text foreground color to red\n      stdout.writeString(Ansi.bg(WHITE));         // set the text background color to white\n      stdout.writeString(Ansi.attr(BOLD));        // make the text bold\n      stdout.writeString(Ansi.attr(RESET));       // reset all color or text attributes\n      stdout.writeString(Ansi.clearScreen());     // clears the screen\n      stdout.writeString(Ansi.cursor(MoveUp(2))); // moves the cursor 2 lines up\n\n      // now let's work with the fluent API:\n      var writer = Ansi.writer(stdout); // supports StringBuf, haxe.io.Ouput and hx.strings.StringBuilder\n      writer\n         .clearScreen()\n         .cursor(GoToPos(10,10))\n         .fg(GREEN).bg(BLACK).attr(ITALIC).write(\"How are you?\").attr(RESET)\n         .cursor(MoveUp(2))\n         .fg(RED).bg(WHITE).attr(UNDERLINE).write(\"Hello World!\").attr(UNDERLINE_OFF)\n         .flush();\n   }\n}\n```\n\n## \u003ca name=\"random-strings\"\u003e\u003c/a\u003eRandom string generation\n\nThe `hx.strings.RandomStrings` class contains methods to generate different types of random strings,\ne.g. UUIDs or alpha-numeric sequences.\n\n```haxe\nimport hx.strings.RandomStrings;\nusing hx.strings.Strings;\n\nclass Test {\n   static function main() {\n      RandomStrings.randomUUIDv4(); // generates a UUID according to RFC 4122 UUID Version 4, e.g. \"f3cdf7a7-a179-464b-ae98-83f6659ae33f\"\n      RandomStrings.randomDigits(4); // generates a 4-char numeric strings, e.g. \"4832\"\n      RandomStrings.randomAsciiAlphaNumeric(8); // generates a 8-char ascii alph numeric strings, e.g. \"aZvDF34L\"\n      RandomStrings.randomSubstring(\"abcdefghijlkmn\", 4); // returns a random 4-char substring of the given string, e.g. \"defg\"\n   }\n}\n````\n\n## \u003ca name=\"version-type\"\u003e\u003c/a\u003eSemantic version parsing with the `Version` type\n\nThe [hx.strings.Version](https://github.com/vegardit/haxe-strings/blob/main/src/hx/strings/Version.hx) type provides functionalities for parsing of and working with version strings following the [SemVer 2.0 Specification](https://semver.org).\n\n```haxe\nimport hx.strings.Version;\n\nclass Test {\n   static function main() {\n\n      var ver:Version;\n\n      ver = new Version(11, 2, 4);\n      ver.major;                  // returns 11\n      ver.minor;                  // returns 2\n      ver.patch;                  // returns 4\n      ver.toString();             // returns '11.2.4'\n      ver.nextPatch().toString(); // returns '11.2.5'\n      ver.nextMinor().toString(); // returns '11.3.0'\n      ver.nextMajor().toString(); // returns '12.0.0'\n\n      ver = Version.of(\"11.2.4-alpha.2+exp.sha.141d2f7\");\n      ver.major;            // returns 11\n      ver.minor;            // returns 2\n      ver.patch;            // returns 4\n      ver.isPreRelease;     // returns true\n      ver.preRelease;       // returns 'alpha.2'\n      ver.buildMetadata;    // returns 'exp.sha.141d2f7'\n      ver.hasBuildMetadata; // returns true\n      ver.nextPreRelease().toString(); // returns \"11.2.4-alpha.3\"\n\n      var v1_0_0:Version = \"1.0.0\";\n      var v1_0_1:Version = \"1.0.1\";\n\n      v1_0_0 \u003c v1_0_1;       // returns true\n      v1_0_1 \u003e= v1_0_0;      // returns true\n\n      v1_0_1.isGreaterThan(v1_0_0); // returns true\n      v1_0_1.isLessThan(Version.of(\"1.0.0\"); // returns false\n\n      Version.isValid(\"foobar\"); // returns false\n   }\n}\n```\n\n\n## \u003ca name=\"installation\"\u003e\u003c/a\u003eInstallation\n\n1. install the library via haxelib using the command:\n   ```\n   haxelib install haxe-strings\n   ```\n\n2. use in your Haxe project\n\n   * for [OpenFL](http://www.openfl.org/)/[Lime](https://github.com/openfl/lime) projects add `\u003chaxelib name=\"haxe-strings\" /\u003e` to your [project.xml](http://www.openfl.org/documentation/projects/project-files/xml-format/)\n   * for free-style projects add `-lib haxe-strings`  to `your *.hxml` file or as command line option when running the [Haxe compiler](http://haxe.org/manual/compiler-usage.html)\n\n\n## \u003ca name=\"latest\"\u003e\u003c/a\u003eUsing the latest code\n\n### Using `haxelib git`\n\n```\nhaxelib git haxe-strings https://github.com/vegardit/haxe-strings main D:\\haxe-projects\\haxe-strings\n```\n\n###  Using Git\n\n1. check-out the main branch\n    ```\n    git clone https://github.com/vegardit/haxe-strings --branch main --single-branch D:\\haxe-projects\\haxe-strings --depth=1\n    ```\n\n2. register the development release with haxe\n    ```\n    haxelib dev haxe-strings D:\\haxe-projects\\haxe-strings\n    ```\n\n\n## \u003ca name=\"license\"\u003e\u003c/a\u003eLicense\n\nAll files are released under the [Apache License 2.0](LICENSE.txt).\n\nIndividual files contain the following tag instead of the full license text:\n```\nSPDX-License-Identifier: Apache-2.0\n```\n\nThis enables machine processing of license information based on the SPDX License Identifiers that are available here: https://spdx.org/licenses/.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvegardit%2Fhaxe-strings","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvegardit%2Fhaxe-strings","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvegardit%2Fhaxe-strings/lists"}