{ "__schema" : "4.1", "__type" : "page", "children" : { "__type" : "snippets", "items" : [ { "__type" : "textSnippet", "children" : { "__type" : "snippets", "items" : [ ] }, "createEmail" : { "__type" : "email", "emailString" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-06-11T18:18:58.358497+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "editTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-06-11T18:19:44.830424+02:00" } }, "uid" : { "__type" : "uid", "uidString" : "n4phA5CdDQC/rbQ7A8ExpA==" }, "paragraphStyle" : { "__type" : "textStyle" }, "string" : "After the doozy that is setting up LanguageLink, you might think that making a custom snippet type is going to be even more effort. I’ve got good news for you." }, { "__type" : "textSnippet", "children" : { "__type" : "snippets", "items" : [ ] }, "createEmail" : { "__type" : "email", "emailString" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-06-11T18:19:51.016989+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "editTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-06-11T18:25:16.445558+02:00" } }, "uid" : { "__type" : "uid", "uidString" : "Occ9KZCdDQCAEXGwA8ExpA==" }, "paragraphStyle" : { "__type" : "textStyle" }, "string" : "Creating a snippet type is actually quite simple. Almost all of the code for Carp is in the Carp package, under the tag Lepiter (TODO: gtPackage annotation would be great). The most important class is likely {{gtClass:LeCarpSnippet}}, because like {{gtClass:CarpApplication}} for LanguageLink, this class is the central player around which the rest of the team organizes." }, { "__type" : "textSnippet", "children" : { "__type" : "snippets", "items" : [ ] }, "createEmail" : { "__type" : "email", "emailString" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-06-11T18:25:29.637968+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "editTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-06-11T18:29:42.230718+02:00" } }, "uid" : { "__type" : "uid", "uidString" : "pS1HPZCdDQCAOUdiA8ExpA==" }, "paragraphStyle" : { "__type" : "textStyle" }, "string" : "Most of the code you will write will just be specialization over readily-available Lepiter classes. The only things that will be truly custom will most likely be your version of {{gtClass:LeExternalServerStrategy}} (in the case of Carp that is {{gtClass:LeCarpApplicationStrategy}}), which will bridge the gap between your LanguageLink application and the snippet itself, and your {{gtClass:GtSourceCoder}} ({{gtClass:GtCarpCoderModel}})." }, { "__type" : "textSnippet", "children" : { "__type" : "snippets", "items" : [ ] }, "createEmail" : { "__type" : "email", "emailString" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-06-11T18:28:08.711515+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "editTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-06-11T18:28:15.191912+02:00" } }, "uid" : { "__type" : "uid", "uidString" : "Dv7PRJCdDQCASGWFA8ExpA==" }, "paragraphStyle" : { "__type" : "textStyle" }, "string" : "But more about that in the next section!" } ] }, "createEmail" : { "__type" : "email", "emailString" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-06-11T18:09:14.768068+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "editTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-06-11T18:09:14.768068+02:00" } }, "pageType" : { "__type" : "namedPage", "title" : "A custom snippet type" }, "uid" : { "__type" : "uuid", "uuid" : "6ad66003-909d-0d00-bfac-dd3803c131a4" } }