Kaynağa Gözat

enhance: Display page property descriptions with markdown formatter

like we do for property values. Also fixed related schema property
values that had incorrect links that would now be visible
Gabriel Horner 2 yıl önce
ebeveyn
işleme
e052c2894a

+ 31 - 18
scripts/src/logseq/tasks/db_graph/create_graph_with_schema_org.cljs

@@ -33,12 +33,20 @@
       (throw (ex-info (str "No :block/uuid for " class-id) {}))))
       (throw (ex-info (str "No :block/uuid for " class-id) {}))))
 
 
 (defn- get-comment-string
 (defn- get-comment-string
-  [rdfs-comment]
-  (if (map? rdfs-comment)
-    (get rdfs-comment "@value")
-    rdfs-comment))
+  [rdfs-comment renamed-classes]
+  (let [desc* (if (map? rdfs-comment)
+                (get rdfs-comment "@value")
+                rdfs-comment)
+        ;; Update refs to renamed classes
+        regex (re-pattern (str "\\[\\[(" (string/join "|" (keys renamed-classes)) ")\\]\\]"))
+        desc (string/replace desc* regex #(str "[[" (get renamed-classes (second %)) "]]"))]
+    ;; Fix links to schema website docs
+    (string/replace desc #"\(/docs" "(https://schema.org/docs")))
 
 
-(defn- ->class-page [class-m class-db-ids class-uuids class-properties property-uuids {:keys [verbose]}]
+(defn- strip-schema-prefix [s]
+  (string/replace-first s "schema:" ""))
+
+(defn- ->class-page [class-m class-db-ids class-uuids class-properties property-uuids {:keys [verbose renamed-classes]}]
   (let [parent-class* (class-m "rdfs:subClassOf")
   (let [parent-class* (class-m "rdfs:subClassOf")
         parent-class (cond
         parent-class (cond
                        (map? parent-class*)
                        (map? parent-class*)
@@ -56,16 +64,16 @@
                                   "schema:DataType")
                                   "schema:DataType")
                        "schema:DataType")
                        "schema:DataType")
         properties (sort (class-properties (class-m "@id")))
         properties (sort (class-properties (class-m "@id")))
-        url (-> (class-m "@id")
-                (string/replace-first "schema:" "https://schema.org/")
-                (string/replace-first #"_Class$" ""))]
-    (cond-> {:block/original-name (string/replace-first (class-m "@id") "schema:" "")
+        inverted-renamed-classes (set/map-invert renamed-classes)
+        class-name (strip-schema-prefix (class-m "@id"))
+        url (str "https://schema.org/" (get inverted-renamed-classes class-name class-name))]
+    (cond-> {:block/original-name class-name
              :block/type "class"
              :block/type "class"
              :block/uuid (get-class-uuid class-uuids (class-m "@id"))
              :block/uuid (get-class-uuid class-uuids (class-m "@id"))
              :db/id (get-class-db-id class-db-ids (class-m "@id"))
              :db/id (get-class-db-id class-db-ids (class-m "@id"))
              :properties (cond-> {:url url}
              :properties (cond-> {:url url}
                            (class-m "rdfs:comment")
                            (class-m "rdfs:comment")
-                           (assoc :description (get-comment-string (class-m "rdfs:comment"))))}
+                           (assoc :description (get-comment-string (class-m "rdfs:comment") renamed-classes)))}
       parent-class
       parent-class
       (assoc :block/namespace {:db/id (get-class-db-id class-db-ids parent-class)})
       (assoc :block/namespace {:db/id (get-class-db-id class-db-ids parent-class)})
       (seq properties)
       (seq properties)
@@ -97,7 +105,7 @@
              (when (class-map %) :page))
              (when (class-map %) :page))
         range-includes))
         range-includes))
 
 
-(defn- ->property-page [property-m prop-uuid class-map class-uuids {:keys [verbose]}]
+(defn- ->property-page [property-m prop-uuid class-map class-uuids {:keys [verbose renamed-classes]}]
   (let [range-includes (get-range-includes property-m)
   (let [range-includes (get-range-includes property-m)
         schema-type (get-schema-type range-includes class-map)
         schema-type (get-schema-type range-includes class-map)
         ;; Pick first range to determine type as only one range is supported currently
         ;; Pick first range to determine type as only one range is supported currently
@@ -110,7 +118,7 @@
                  (= schema-type :page)
                  (= schema-type :page)
                  (assoc :cardinality :many)
                  (assoc :cardinality :many)
                  (property-m "rdfs:comment")
                  (property-m "rdfs:comment")
-                 (assoc :description (get-comment-string (property-m "rdfs:comment")))
+                 (assoc :description (get-comment-string (property-m "rdfs:comment") renamed-classes))
                  (= schema-type :page)
                  (= schema-type :page)
                  (assoc :classes (let [invalid-classes (remove class-uuids range-includes)
                  (assoc :classes (let [invalid-classes (remove class-uuids range-includes)
                                        _ (when (seq invalid-classes)
                                        _ (when (seq invalid-classes)
@@ -120,7 +128,7 @@
                                            (throw (ex-info (str "property " (pr-str (property-m "@id"))
                                            (throw (ex-info (str "property " (pr-str (property-m "@id"))
                                                                 " has DataType class values which aren't supported: " datatype-classes) {})))]
                                                                 " has DataType class values which aren't supported: " datatype-classes) {})))]
                                    (set (map class-uuids range-includes)))))]
                                    (set (map class-uuids range-includes)))))]
-    {(keyword (string/replace-first (property-m "@id") "schema:" ""))
+    {(keyword (strip-schema-prefix (property-m "@id")))
      {:block/uuid prop-uuid
      {:block/uuid prop-uuid
       :block/schema schema
       :block/schema schema
       :properties {:url (string/replace-first (property-m "@id") "schema:" "https://schema.org/")}}}))
       :properties {:url (string/replace-first (property-m "@id") "schema:" "https://schema.org/")}}}))
@@ -158,7 +166,7 @@
   "Properties and class names conflict in Logseq because schema.org names are
   "Properties and class names conflict in Logseq because schema.org names are
   case sensitive whereas Logseq's :block/name is case insensitive. This is dealt
   case sensitive whereas Logseq's :block/name is case insensitive. This is dealt
   with by appending a '_Class' suffix to conflicting classes.  If this strategy
   with by appending a '_Class' suffix to conflicting classes.  If this strategy
-  changes, be sure to update schema->logseq-data-types and ->class-page"
+  changes, be sure to update schema->logseq-data-types"
   [property-ids class-ids {:keys [verbose]}]
   [property-ids class-ids {:keys [verbose]}]
   (let [conflicts
   (let [conflicts
         (->> (concat property-ids class-ids)
         (->> (concat property-ids class-ids)
@@ -244,14 +252,19 @@
         all-classes (map rename-class-ids all-classes*)
         all-classes (map rename-class-ids all-classes*)
         ;; Updates keys like @id, @rangeIncludes, @domainIncludes
         ;; Updates keys like @id, @rangeIncludes, @domainIncludes
         all-properties (map rename-class-ids all-properties*)]
         all-properties (map rename-class-ids all-properties*)]
-    [all-classes all-properties]))
+    {:all-classes all-classes
+     :all-properties all-properties
+     :renamed-classes (->> renamed-classes
+                           (map (fn [[k v]] [(strip-schema-prefix k) (strip-schema-prefix v)]))
+                           (into {}))}))
 
 
 (defn- create-init-data [options]
 (defn- create-init-data [options]
   (let [schema-data (-> (str (fs/readFileSync "resources/schemaorg-current-https.json"))
   (let [schema-data (-> (str (fs/readFileSync "resources/schemaorg-current-https.json"))
                         js/JSON.parse
                         js/JSON.parse
                         (js->clj)
                         (js->clj)
                         (get "@graph"))
                         (get "@graph"))
-        [all-classes all-properties] (get-all-classes-and-properties schema-data options)
+        {:keys [all-classes all-properties renamed-classes]}
+        (get-all-classes-and-properties schema-data options)
         ;; Generate data shared across pages and properties
         ;; Generate data shared across pages and properties
         class-map (->> all-classes
         class-map (->> all-classes
                        (map #(vector (% "@id") %))
                        (map #(vector (% "@id") %))
@@ -273,10 +286,10 @@
         ;; Generate pages and properties
         ;; Generate pages and properties
         properties (generate-properties
         properties (generate-properties
                     (filter #(contains? select-properties (% "@id")) all-properties)
                     (filter #(contains? select-properties (% "@id")) all-properties)
-                    property-uuids class-map class-uuids options)
+                    property-uuids class-map class-uuids (assoc options :renamed-classes renamed-classes))
         pages (generate-pages
         pages (generate-pages
                (map #(class-map %) select-class-ids)
                (map #(class-map %) select-class-ids)
-               class-uuids class-to-properties property-uuids options)]
+               class-uuids class-to-properties property-uuids (assoc options :renamed-classes renamed-classes))]
     {:pages-and-blocks pages
     {:pages-and-blocks pages
      :properties properties}))
      :properties properties}))
 
 

+ 2 - 2
src/main/frontend/components/property.cljs

@@ -424,7 +424,7 @@
     @*namespaces))
     @*namespaces))
 
 
 (rum/defc properties-section < rum/reactive db-mixins/query
 (rum/defc properties-section < rum/reactive db-mixins/query
-  [block properties opts]
+  [block properties {:keys [inline-text] :as opts}]
   (when (seq properties)
   (when (seq properties)
     (for [[k v] properties]
     (for [[k v] properties]
       (when (uuid? k)
       (when (uuid? k)
@@ -445,7 +445,7 @@
              (if (and (:class-schema? opts) (:page-configure? opts))
              (if (and (:class-schema? opts) (:page-configure? opts))
                [:div.property-description.text-sm.opacity-70
                [:div.property-description.text-sm.opacity-70
                 {:class "col-span-3"}
                 {:class "col-span-3"}
-                (get-in property [:block/schema :description])]
+                (inline-text {} :markdown (get-in property [:block/schema :description]))]
                (when-not collapsed?
                (when-not collapsed?
                  [:div.property-value {:class (if block?
                  [:div.property-value {:class (if block?
                                                 "block-property-value"
                                                 "block-property-value"