{"id":11514,"date":"2016-03-15T08:00:22","date_gmt":"2016-03-15T15:00:22","guid":{"rendered":"https:\/\/www.sapien.com\/blog\/?p=11514"},"modified":"2016-03-15T12:40:34","modified_gmt":"2016-03-15T19:40:34","slug":"powershell-studio-2016-custom-primalsense","status":"publish","type":"post","link":"https:\/\/dev.sapien.com\/blog\/2016\/03\/15\/powershell-studio-2016-custom-primalsense\/","title":{"rendered":"PowerShell Studio 2016: Custom PrimalSense"},"content":{"rendered":"<p>We&#8217;ve written a series of blog posts to introduce you to the newest features of PowerShell Studio 2016. In this blog, Part 4, we cover new customizable PrimalSense in PowerShell Studio 2016.<\/p>\n<p>But, there&#8217;s more:<\/p>\n<ul>\n<li>In <a href=\"https:\/\/www.sapien.com\/blog\/2016\/02\/29\/powershell-studio-2016-released-whats-new-part-1\/\">Part 1<\/a>, we review the new UI features, including our new dark themes.<\/li>\n<li> In <a href=\"https:\/\/www.sapien.com\/blog\/2016\/03\/02\/powershell-studio-2016-whats-new-part-2\/\" target=\"_new\">Part 2<\/a>, we introduce our new debugging features, including variable and function breakpoints and improvements to the Variables pane.<\/li>\n<li>In <a href=\"https:\/\/www.sapien.com\/blog\/2016\/03\/07\/powershell-studio-2016-whats-new-part-3\/\" target=\"_blank\">Part 3<\/a>, we look at some of the new editor features of PowerShell Studio 2016.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h3><strong>Custom PrimalSense Lists<\/strong><\/h3>\n<p>The new customizable PrimalSense feature allows users to tailor their PrimalSense experience. The contents of the custom PrimalSense can be derived from a static list or from a dynamically created list using a PowerShell script.<\/p>\n<p>These custom PrimalSense lists can be triggered via a shortcut name, similar to snippet shortcuts. For example, if you type the following shortcut:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"display: inline; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2016\/03\/image-2.png\" alt=\"image\" width=\"327\" height=\"58\" border=\"0\" \/><\/p>\n<p>To display the custom PrimalSense list, press [Ctrl + Alt + P] or [TAB].<\/p>\n<p><a href=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2016\/03\/image-3.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"display: inline; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2016\/03\/image_thumb-1.png\" alt=\"image\" width=\"244\" height=\"199\" border=\"0\" \/><\/a><\/p>\n<p>The shortcut will be replaced with the selected item in the PrimalSense list.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"display: inline; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2016\/03\/image-4.png\" alt=\"image\" width=\"251\" height=\"56\" border=\"0\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>In addition, custom PrimalSense lists can be triggered by typing a particular cmdlet \/ parameter combination or a specific parameter regardless of command.<\/p>\n<p><a href=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2016\/03\/image-5.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"display: inline; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2016\/03\/image_thumb-2.png\" alt=\"image\" width=\"244\" height=\"167\" border=\"0\" \/><\/a><\/p>\n<p>The custom list in this case is triggered when the user presses [SPACE] after typing the <strong>Name<\/strong> parameter of <strong>Get-Process<\/strong>.<\/p>\n<p>Let&#8217;s look at the types of lists in more detail.<\/p>\n<p>&nbsp;<\/p>\n<h3><strong>Static Lists<\/strong><\/h3>\n<p>Static lists are the simplest method for creating a custom PrimalSense list. These lists are simply read from a static data file source, such as a CSV file, when the list is triggered. Let\u2019s look at the supported data file formats.<\/p>\n<p>&nbsp;<\/p>\n<h3><strong>Data File Formats<\/strong><\/h3>\n<p>There are two supported data file formats: CSV and XML files.<\/p>\n<p><strong>CSV Format<\/strong><\/p>\n<p>The CSV is the simplest format. It can consist of simple list where there can only be one list item per line.<\/p>\n<p>For example, GetProcess_Name.csv data file contains the following:<\/p>\n<p><a href=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2016\/03\/image-6.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"display: inline; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2016\/03\/image_thumb-3.png\" alt=\"image\" width=\"244\" height=\"145\" border=\"0\" \/><\/a><\/p>\n<p><em>Note: Since this is a CSV file format, you must escape double quotes using another double quote &#8220;&#8221;.<\/em><\/p>\n<p>You have the option to associate each item with a pre-defined picture (via index) and a value using the following format:<\/p>\n<blockquote><p><em>Name, Index, Value<\/em><\/p><\/blockquote>\n<ul>\n<li><strong>Name<\/strong> \u2013 This is the text displayed in the PrimalSense list.<\/li>\n<li><strong>Index<\/strong> \u2013 (Optional) The numeric index of the image you that will be displayed next to the name in the PrimalSense list. Use \u20131 if you do not wish to associate an image. See below for a list of image indexes.<\/li>\n<li><strong>Value<\/strong> \u2013 (Optional) The value that is inserted into the editor when the item is selected from the PrimalSense list.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Here is an example csv that uses images and values:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"display: inline; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2016\/03\/image-7.png\" alt=\"image\" width=\"420\" height=\"120\" border=\"0\" \/><\/p>\n<p>The resulting PrimalSense list:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"display: inline; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2016\/03\/image-8.png\" alt=\"image\" width=\"225\" height=\"124\" border=\"0\" \/><\/p>\n<p>The inserted value:<\/p>\n<p><a href=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2016\/03\/image-9.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"display: inline; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2016\/03\/image_thumb-4.png\" alt=\"image\" width=\"296\" height=\"72\" border=\"0\" \/><\/a><\/p>\n<p>The following table contains the list of supported image indexes:<\/p>\n<table class=\"nicetable\" border=\"1\" width=\"397\" cellspacing=\"0\" cellpadding=\"2\">\n<tbody>\n<tr>\n<td valign=\"top\" width=\"90\"><strong>Index<\/strong><\/td>\n<td valign=\"top\" width=\"305\"><strong>Image<\/strong><\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"93\">0<\/td>\n<td valign=\"top\" width=\"303\">Keyword<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"95\">1<\/td>\n<td valign=\"top\" width=\"302\">Folder<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"96\">2<\/td>\n<td valign=\"top\" width=\"301\">Code Snippet<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"97\">3<\/td>\n<td valign=\"top\" width=\"300\">Namespace<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">4<\/td>\n<td valign=\"top\" width=\"300\">Assembly<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">5<\/td>\n<td valign=\"top\" width=\"300\">Assembly Checked<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">6<\/td>\n<td valign=\"top\" width=\"300\">Public Class<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">7<\/td>\n<td valign=\"top\" width=\"300\">Private Class<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">8<\/td>\n<td valign=\"top\" width=\"300\">Public Property<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">9<\/td>\n<td valign=\"top\" width=\"300\">Public Field<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">10<\/td>\n<td valign=\"top\" width=\"300\">Public Interface<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">11<\/td>\n<td valign=\"top\" width=\"300\">Public Delegate<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">12<\/td>\n<td valign=\"top\" width=\"300\">Public Structure<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">13<\/td>\n<td valign=\"top\" width=\"300\">Public Method<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">14<\/td>\n<td valign=\"top\" width=\"300\">Public Enumeration<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">15<\/td>\n<td valign=\"top\" width=\"300\">Enumeration Item<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">16<\/td>\n<td valign=\"top\" width=\"300\">Cmdlet<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">17<\/td>\n<td valign=\"top\" width=\"300\">Alias<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">18<\/td>\n<td valign=\"top\" width=\"300\">Variable<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">19<\/td>\n<td valign=\"top\" width=\"300\">Function<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">20<\/td>\n<td valign=\"top\" width=\"300\">Document Function<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">21<\/td>\n<td valign=\"top\" width=\"300\">Global Function<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">22<\/td>\n<td valign=\"top\" width=\"300\">Static Method<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">23<\/td>\n<td valign=\"top\" width=\"300\">Static Property<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">24<\/td>\n<td valign=\"top\" width=\"300\">Static Field<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">25<\/td>\n<td valign=\"top\" width=\"300\">Snapin<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">26<\/td>\n<td valign=\"top\" width=\"300\">Module<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">27<\/td>\n<td valign=\"top\" width=\"300\">Operator<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">28<\/td>\n<td valign=\"top\" width=\"300\">Help<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">29<\/td>\n<td valign=\"top\" width=\"300\">Object Browser<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">30<\/td>\n<td valign=\"top\" width=\"300\">Parameter<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">31<\/td>\n<td valign=\"top\" width=\"300\">Parameter Alias<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">32<\/td>\n<td valign=\"top\" width=\"300\">Job<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">33<\/td>\n<td valign=\"top\" width=\"300\">File<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">34<\/td>\n<td valign=\"top\" width=\"300\">External Tool<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">35<\/td>\n<td valign=\"top\" width=\"300\">Workflow<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">36<\/td>\n<td valign=\"top\" width=\"300\">Configuration<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">37<\/td>\n<td valign=\"top\" width=\"300\">Event<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">38<\/td>\n<td valign=\"top\" width=\"300\">Breakpoint<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">39<\/td>\n<td valign=\"top\" width=\"300\">Tracepoint<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">40<\/td>\n<td valign=\"top\" width=\"300\">Caret<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">41<\/td>\n<td valign=\"top\" width=\"300\">Last Edit Position<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">42<\/td>\n<td valign=\"top\" width=\"300\">Syntax Error<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">43<\/td>\n<td valign=\"top\" width=\"300\">Debug Position<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">44<\/td>\n<td valign=\"top\" width=\"300\">Region<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">45<\/td>\n<td valign=\"top\" width=\"300\">Bookmark<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">46<\/td>\n<td valign=\"top\" width=\"300\">Parameter Set<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">47<\/td>\n<td valign=\"top\" width=\"300\">Task<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">48<\/td>\n<td valign=\"top\" width=\"300\">Task Completed<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">49<\/td>\n<td valign=\"top\" width=\"300\">Computer<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"98\">50<\/td>\n<td valign=\"top\" width=\"300\">Gear<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><strong>XML Format<\/strong><\/p>\n<p>The second supported data format is XML. Use the XML file format to insert more complex values, such as a multiple line script.<\/p>\n<p><a href=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2016\/03\/image-10.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"display: inline; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2016\/03\/image_thumb-5.png\" alt=\"image\" width=\"304\" height=\"86\" border=\"0\" \/><\/a><\/p>\n<p>The XML file consists of a root element named <strong>List<\/strong>, which contains a child element for each item named <strong>Item<\/strong>.<\/p>\n<p>The item element contains the following attributes:<\/p>\n<ul>\n<li><strong>name<\/strong> &#8211; contains the display name of the item in the PrimalSense list.<\/li>\n<li><strong>image<\/strong> &#8211; contains the image index of the item.<\/li>\n<\/ul>\n<p>A <strong>CDATA<\/strong> block contains the multi-line text that is inserted when the item is selected in the PrimalSense list.<\/p>\n<p>For example, the <strong>functions<\/strong> shortcut triggers the following list of functions:<\/p>\n<p><a href=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2016\/03\/image-11.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"display: inline; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2016\/03\/image_thumb-6.png\" alt=\"image\" width=\"195\" height=\"108\" border=\"0\" \/><\/a><\/p>\n<p>When an item is selected, a complete function is inserted:<\/p>\n<p><a href=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2016\/03\/image-12.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"display: inline; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2016\/03\/image_thumb-7.png\" alt=\"image\" width=\"304\" height=\"123\" border=\"0\" \/><\/a><\/p>\n<h3><\/h3>\n<h3><strong>Dynamic Lists<\/strong><\/h3>\n<p>For the cases where a static list isn\u2019t enough, PowerShell Studio gives you the option to dynamically create the data file before displaying it in the PrimalSense list. This is accomplished, by running a custom PowerShell script that generates the necessary data file. Next, we will look at how to configure triggers and create scripts that generate dynamic lists.<\/p>\n<p>&nbsp;<\/p>\n<h3><strong>Configuring Triggers<\/strong><\/h3>\n<p>The custom PrimalSense list triggers are stored in the following XML file:<\/p>\n<blockquote><p>C:\\ProgramData\\SAPIEN\\PowerShell Studio 2016\\CustomSense\\Triggers.xml<\/p><\/blockquote>\n<p>The XML file is made up of a <b>Triggers<\/b> root element and each individual list trigger is defined by a child element named <b>Trigger.<\/b><\/p>\n<p><a href=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2016\/03\/image-13.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" style=\"display: inline; border-width: 0px;\" title=\"image\" src=\"https:\/\/www.sapien.com\/blog\/wp-content\/uploads\/2016\/03\/image_thumb-8.png\" alt=\"image\" width=\"604\" height=\"66\" border=\"0\" \/><\/a><\/p>\n<p>Each <strong>Trigger<\/strong> element has the following attributes:<\/p>\n<ul>\n<li><strong>shortcut<\/strong> \u2013 (Optional) The shortcut name that triggers the custom PrimalSense list when the user presses [Ctrl + Alt + P]. The shortcut must not contain spaces.<\/li>\n<li><strong>command<\/strong> &#8211; (Optional) The command\/cmdlet that the trigger is bound to. Use an asterisk <b>*<\/b> to denote all commands. This field requires the <b>parameter<\/b> attribute.<\/li>\n<li><strong>parameter<\/strong> &#8211; (Optional) The parameter that triggers the custom PrimalSense list. This field requires the <b>command<\/b> attribute.<\/li>\n<li><strong>type<\/strong> \u2013 [<em>cached<\/em>|<em>dynamic<\/em>] (Default: <em>cached<\/em>) Determines if the list is cached in memory or is read every time the list is triggered.<\/li>\n<li><strong>datafile<\/strong> &#8211; (Required) Specifies the data file that is to be loaded (CSV or XML).<\/li>\n<li><strong>elevated<\/strong> &#8211; (Optional) (Default: <em>False<\/em>) Determines if the script needs to be elevated.<\/li>\n<li><strong>timeout<\/strong> \u2013 How long PowerShell Studio should wait for the process to complete before quitting.<\/li>\n<li><strong>autoquote<\/strong> &#8211; [<em>True<\/em>|<em>False<\/em>] (Default: True) If set to <i>True,<\/i> PowerShell Studio will automatically wrap quotes around the values contained in a CSV file when necessary.<\/li>\n<li><strong>scriptfile<\/strong> \u2013 Specifies the script to run in order to create the data file.<\/li>\n<\/ul>\n<p><em>Note: If you modify the Triggers.xml file, you will need to reload PowerShell Studio in order for the changes to take effect.<\/em><\/p>\n<p>&nbsp;<\/p>\n<h3><strong>Script Files<\/strong><\/h3>\n<p>When you specify a script file in the triggers XML file, PowerShell Studio will execute said script when the list is triggered.<\/p>\n<p>Let us look at the contents of the sample GetProcess_Names.ps1 script:<\/p>\n<pre lang=\"PowerShell\"> Get-Process | Select-Object -ExpandProperty Name -Unique &gt; \"$CustomSensePath\\GetProcess_Name.csv\"<\/pre>\n<p>The script simply pipes out the results of Get-Process to a basic csv file. Notice the $CustomSensePath variable, this is a special variable that contains path information. You can utilize the following variables in your script:<\/p>\n<p>&nbsp;<\/p>\n<p><strong>$CustomSensePath<\/strong><\/p>\n<p>This variable contains the path to the CustomSense folder. For example:<\/p>\n<blockquote><p>C:\\ProgramData\\SAPIEN\\PowerShell Studio 2016\\CustomSense\\<\/p><\/blockquote>\n<p><em>Note: The data file must be located in the same folder as the triggers.xml.<\/em><\/p>\n<p><strong>$CurrentFile<\/strong><\/p>\n<p>This variable contains the file path to the active script in PowerShell Studio. This value will be empty for new unsaved files.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>You should now have a better understanding of how to use PowerShell Studio\u2019s Custom PrimalSense feature. This feature is another tool you can use to tailor PowerShell Studio to fit your specific needs.<\/p>\n<p>If you have any comments or feedback, please feel free to post in our <a href=\"https:\/\/www.sapien.com\/forums\/viewforum.php?f=12\">PowerShell Studio<\/a> product forum.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>We&#8217;ve written a series of blog posts to introduce you to the newest features of PowerShell Studio 2016. In this blog, Part 4, we cover new customizable PrimalSense in PowerShell Studio 2016. But, there&#8217;s more: In Part 1, we review the new UI features, including our new dark themes. In Part 2, we introduce our [&hellip;]<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[703,21,632,25],"tags":[28,1068,645,141],"class_list":["post-11514","post","type-post","status-publish","format-standard","hentry","category-powershell-studio","category-software-news","category-whats-new-software-news","category-windows-powershell","tag-powershell","tag-powershell-studio-2016","tag-service-build-2","tag-whats-new"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/dev.sapien.com\/blog\/wp-json\/wp\/v2\/posts\/11514","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dev.sapien.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dev.sapien.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dev.sapien.com\/blog\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/dev.sapien.com\/blog\/wp-json\/wp\/v2\/comments?post=11514"}],"version-history":[{"count":13,"href":"https:\/\/dev.sapien.com\/blog\/wp-json\/wp\/v2\/posts\/11514\/revisions"}],"predecessor-version":[{"id":11661,"href":"https:\/\/dev.sapien.com\/blog\/wp-json\/wp\/v2\/posts\/11514\/revisions\/11661"}],"wp:attachment":[{"href":"https:\/\/dev.sapien.com\/blog\/wp-json\/wp\/v2\/media?parent=11514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dev.sapien.com\/blog\/wp-json\/wp\/v2\/categories?post=11514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dev.sapien.com\/blog\/wp-json\/wp\/v2\/tags?post=11514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}