Menu

Skip to content
AppleScriptの穴
  • Home
  • Products
  • Books
  • Docs
  • Events
  • Forum
  • About This Blog
  • License
  • 仕事依頼

AppleScriptの穴

Useful & Practical AppleScript archive. Click '★Click Here to Open This Script' Link to download each AppleScript

タブでインデントしたテキストをOutLineViewで表示できるデータ形式に変換

Posted on 10月 10 by Takaaki Naganoya

タブでインデントしたテキストを、NSOutlineViewで表示できるデータ形式に変換するAppleScriptです。

主に、Keynote書類の各スライド(ページ)上のタイトルを、そのマスタースライド名をもとにインデントレベルを仮想的に判定し、PDFのTOCを作成する際の「プレビュー」を行うべく、NSOutLineViewで表示するために作成したものです。

当初はChatGPTに書かせたものですが、途中から(再利用可能な形式に)全面的に書き換えました。処理速度が速いとか遅いとかいったことには留意していません。ただ、ひたすらChatGPTの出してきたコードの添削を行うことに留意しました(動かないコードが出てくることが多いので)。

これ自体は、テストデータ(テキスト)からNSOutLineView表示用のデータを作成する「使い捨てプログラム」だったのですが、ほかにも用途がありそうなので掲載しておきます。

ただし、ChatGPTとのやりとりで終始していたので、Tabが1個の階層までしかサポートしていません。Tab n個のn階層データには未対応です。

表紙
目次
広告1
広告2
広告3
1章 入門編
	AppleScriptでGUIつきアプリケーションを作ろう!
	本書の目標到達点
	Xcode概論
裏表紙

こんなデータを、

{{|name|:"表紙", isLeaf:true, children:{}}, {|name|:"目次", isLeaf:true, children:{}}, {|name|:"広告1", isLeaf:true, children:{}}, {|name|:"広告2", isLeaf:true, children:{}}, {|name|:"広告3", isLeaf:true, children:{}}, {|name|:"1章 入門編", isLeaf:false, children:{{|name|:"AppleScriptでGUIつきアプリケーションを作ろう!", isLeaf:true, children:{}}, {|name|:"本書の目標到達点", isLeaf:true, children:{}}, {|name|:"Xcode概論", isLeaf:true, children:{}}}}, {|name|:"裏表紙", isLeaf:true, children:{}}}

のように変換します。

本来は、Keynote書類の各スライドのタイトルとマスタースライド名を読み取り、そこから上記のデータを作成するフローなのですが、毎回Keynote書類を読み取らせる方式だとテストが大変な感じだったので、テキストからテストデータを作成できると便利なのではないかと。

AppleScript名:タブでインデントしたテキストをOutLineViewで表示できるデータ形式に変換 v2.scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/10/09
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

use AppleScript version "2.8"
use framework "Foundation"
use scripting additions

— サンプル入力(ここを実際のテキストに置き換えてください)
set srcText to "表紙
目次
広告1
広告2
広告3
1章 入門編
  AppleScriptでGUIつきアプリケーションを作ろう!
  本書の目標到達点
  Xcode概論
裏表紙"

set aRec to convStrToStructuredRec(srcText) of me
–> {{|name|:"表紙", isLeaf:true, children:{}}, {|name|:"目次", isLeaf:true, children:{}}, {|name|:"広告1", isLeaf:true, children:{}}, {|name|:"広告2", isLeaf:true, children:{}}, {|name|:"広告3", isLeaf:true, children:{}}, {|name|:"1章 入門編", isLeaf:false, children:{{|name|:"AppleScriptでGUIつきアプリケーションを作ろう!", isLeaf:true, children:{}}, {|name|:"本書の目標到達点", isLeaf:true, children:{}}, {|name|:"Xcode概論", isLeaf:true, children:{}}}}, {|name|:"裏表紙", isLeaf:true, children:{}}}

— 2階層(タブ0/タブ1)対応の変換関数
on convStrToStructuredRec(srcText)
  — 行分割(改行種類を問わない)
  
set nsText to current application’s NSString’s stringWithString:srcText
  
set lineArray to nsText’s componentsSeparatedByCharactersInSet:(current application’s NSCharacterSet’s newlineCharacterSet())
  
  
set topList to {} — トップレベルのリスト(返却値)
  
set currentParentIndex to 0 — 直近のトップレベル要素の添字(0 = まだ無し)
  
  
repeat with nsLine in lineArray
    — 行が空白のみならスキップ(処理終了ではない)
    
set trimmedForEmpty to ((nsLine’s stringByTrimmingCharactersInSet:(current application’s NSCharacterSet’s whitespaceAndNewlineCharacterSet())) as text)
    
if trimmedForEmpty is "" then
      — 空行は無視して次へ
    else
      — Cocoa(NSString)で行頭のタブ数を数える
      
set len to (nsLine’s |length|()) as integer
      
set tabCount to 0
      
repeat with idx from 0 to (len – 1)
        set ch to (nsLine’s characterAtIndex:idx)
        
— 文字コード 9 がタブ
        
if (ch as integer) = 9 then
          set tabCount to tabCount + 1
        else
          exit repeat
        end if
      end repeat
      
      
— 先頭のタブを取り除いた文字列を取得
      
if len > tabCount then
        set contentNS to (nsLine’s substringFromIndex:(tabCount))
      else
        set contentNS to (current application’s NSString’s stringWithString:"")
      end if
      
set contentText to (contentNS as text)
      
      
if tabCount = 0 then
        — トップレベル(親)要素:初期は isLeaf:true, children:{} にする
        
set newRec to {|name|:contentText, isLeaf:true, children:{}}
        
set end of topList to newRec
        
set currentParentIndex to (count of topList)
      else
        — タブあり = 子要素(直近のトップレベルに追加)
        
— 親が無い場合は安全のためプレースホルダ親を作る(あなたのデータには不要なはず)
        
if currentParentIndex = 0 then
          set placeholder to {|name|:"", isLeaf:false, children:{}}
          
set end of topList to placeholder
          
set currentParentIndex to (count of topList)
        end if
        
        
— 子レコードを作り、親の children に追加。親の isLeaf を false にする
        
set childRec to {|name|:contentText, isLeaf:true, children:{}}
        
set parentRec to item currentParentIndex of topList
        
set parentChildren to parentRec’s children
        
set end of parentChildren to childRec
        
set parentRec’s children to parentChildren
        
set parentRec’s isLeaf to false
        
— 更新した親レコードをリストに戻す
        
set item currentParentIndex of topList to parentRec
      end if
    end if
  end repeat
  
  
return topList
end convStrToStructuredRec

★Click Here to Open This Script 

(Visited 1 times, 1 visits today)
Posted in GUI list Record Text | Leave a comment

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

電子書籍(PDF)をオンラインストアで販売中!

Google Search

Popular posts

  • Numbersで選択範囲のセルの前後の空白を削除
  • macOS 26, Tahoe
  • macOS 15でも変化したText to Speech環境
  • KagiのWebブラウザ、Orion
  • Script Debuggerの開発と販売が2025年に終了
  • 【続報】macOS 15.5で特定ファイル名パターンのfileをaliasにcastすると100%クラッシュするバグ
  • macOS 15 リモートApple Eventsにバグ?
  • NSObjectのクラス名を取得 v2.1
  • 2024年に書いた価値あるAppleScript
  • 有害ではなくなっていたSpaces
  • macOS 15:スクリプトエディタのAppleScript用語辞書を確認できない
  • Xcode上のAppleScriptObjCのプログラムから、Xcodeのログ欄へのメッセージ出力を実行
  • (確認中)AppleScript Dropletのバグっぽい動作が解消?
  • AVSpeechSynthesizerで読み上げテスト
  • AppleScript Dropletのバグっぽい動作が「復活」(macOS 15.5β)
  • 指定フォルダ以下の画像のMD5チェックサムを求めて、重複しているものをピックアップ
  • macOS 26, 15.5でShortcuts.app「AppleScriptを実行」アクションのバグが修正される
  • Numbersで選択中の2列のセルを比較して並べ直して書き戻す v2
  • Apple、macOS標準搭載アプリ「写真」のバージョン表記を間違える
  • Script DebuggerがmacOS 15.x上で起動せず→起動

Tags

10.11savvy (1101) 10.12savvy (1242) 10.13savvy (1391) 10.14savvy (587) 10.15savvy (438) 11.0savvy (283) 12.0savvy (212) 13.0savvy (204) 14.0savvy (159) 15.0savvy (154) CotEditor (66) Finder (52) Keynote (119) NSAlert (61) NSArray (51) NSBitmapImageRep (20) NSBundle (20) NSButton (34) NSColor (53) NSDictionary (28) NSFileManager (23) NSFont (21) NSImage (41) NSJSONSerialization (21) NSMutableArray (63) NSMutableDictionary (22) NSPredicate (36) NSRunningApplication (56) NSScreen (30) NSScrollView (22) NSString (119) NSURL (98) NSURLRequest (23) NSUTF8StringEncoding (30) NSView (33) NSWorkspace (20) Numbers (76) Pages (56) Pixelmator Pro (20) Safari (44) Script Editor (27) WKUserContentController (21) WKUserScript (20) WKWebView (23) WKWebViewConfiguration (22)

カテゴリー

  • 2D Bin Packing
  • 3D
  • AirDrop
  • AirPlay
  • Animation
  • AppleScript Application on Xcode
  • Beginner
  • Benchmark
  • beta
  • Bluetooth
  • Books
  • boolean
  • bounds
  • Bug
  • Calendar
  • call by reference
  • check sum
  • Clipboard
  • Cocoa-AppleScript Applet
  • Code Sign
  • Color
  • Custom Class
  • date
  • dialog
  • diff
  • drive
  • Droplet
  • exif
  • file
  • File path
  • filter
  • folder
  • Font
  • Font
  • GAME
  • geolocation
  • GUI
  • GUI Scripting
  • Hex
  • History
  • How To
  • iCloud
  • Icon
  • Image
  • Input Method
  • Internet
  • iOS App
  • JavaScript
  • JSON
  • JXA
  • Keychain
  • Keychain
  • Language
  • Library
  • list
  • Locale
  • Localize
  • Machine Learning
  • Map
  • Markdown
  • Menu
  • Metadata
  • MIDI
  • MIME
  • Natural Language Processing
  • Network
  • news
  • Newt On Project
  • Noification
  • Notarization
  • Number
  • Object control
  • OCR
  • OSA
  • parallel processing
  • PDF
  • Peripheral
  • process
  • PRODUCTS
  • QR Code
  • Raw AppleEvent Code
  • Record
  • rectangle
  • recursive call
  • regexp
  • Release
  • Remote Control
  • Require Control-Command-R to run
  • REST API
  • Review
  • RTF
  • Sandbox
  • Screen Saver
  • Script Libraries
  • Scripting Additions
  • sdef
  • search
  • Security
  • selection
  • shell script
  • Shortcuts Workflow
  • Sort
  • Sound
  • Spellchecker
  • Spotlight
  • SVG
  • System
  • Tag
  • Telephony
  • Text
  • Text to Speech
  • timezone
  • Tools
  • Update
  • URL
  • UTI
  • Web Contents Control
  • WiFi
  • XML
  • XML-RPC
  • イベント(Event)
  • 未分類

アーカイブ

  • 2025年10月
  • 2025年9月
  • 2025年8月
  • 2025年7月
  • 2025年6月
  • 2025年5月
  • 2025年4月
  • 2025年3月
  • 2025年2月
  • 2025年1月
  • 2024年12月
  • 2024年11月
  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年6月
  • 2024年5月
  • 2024年4月
  • 2024年3月
  • 2024年2月
  • 2024年1月
  • 2023年12月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年6月
  • 2023年5月
  • 2023年4月
  • 2023年3月
  • 2023年2月
  • 2023年1月
  • 2022年12月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年10月
  • 2021年9月
  • 2021年8月
  • 2021年7月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年12月
  • 2019年11月
  • 2019年10月
  • 2019年9月
  • 2019年8月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年11月
  • 2018年10月
  • 2018年9月
  • 2018年8月
  • 2018年7月
  • 2018年6月
  • 2018年5月
  • 2018年4月
  • 2018年3月
  • 2018年2月

https://piyomarusoft.booth.pm/items/301502

メタ情報

  • ログイン
  • 投稿フィード
  • コメントフィード
  • WordPress.org

Forum Posts

  • 人気のトピック
  • 返信がないトピック

メタ情報

  • ログイン
  • 投稿フィード
  • コメントフィード
  • WordPress.org
Proudly powered by WordPress
Theme: Flint by Star Verte LLC