├── .gitignore ├── .gitmodules ├── README ├── _Illustrator ├── ai_anchor_infomation.js ├── ai_checkitem.js ├── ai_collect_infomation.js ├── ai_color_check_test.js ├── ai_get_properties.js ├── ai_mask_placeditem.js ├── ai_move_layer_to_beginning.js ├── ai_press_expand │ └── compress_and_expand.js ├── ai_replace_psdjpg2eps.js ├── ai_saveas │ ├── ai_save_as_eps.js │ └── ai_update_regacy_ai.js └── ai_swatch_add.js ├── _photoshop ├── convert_pdf_to_eps_psd.js └── selection_fill_opacity50.js ├── book ├── add_to_book.js └── export_pdf_from_book.js ├── builtin_dialog └── builtin_dialog_template.js ├── env ├── change_guide_color.js ├── check_doc.js ├── check_doc_fullpath.js ├── check_pathtype.js ├── check_style_existence.jsx ├── create_stray_anchorpoints.js ├── get_parent_page.jsx ├── interaction_test.js ├── live_preflight_onoff.js ├── locale_test.js ├── reset_guide_color.js ├── send_growl_notify.js ├── set_app_and_doc_unit.js ├── stroke_style.js ├── switch_convert2TF_enabler.js ├── which_column_belongs.js └── writeln_for_app │ ├── .gitignore │ ├── test.js │ └── writeln_for_app.js ├── eventlitener ├── addevent_git_commit_after_save.js ├── addevent_printable.js ├── addevent_show_guides_after_open.js └── removeeventlister_sample.js ├── export ├── export_png.js ├── inx_export_convert_to_indd.js ├── jpeg_export.js ├── jpeg_export_per_pageItem.js ├── package_and_pdf.js ├── pdf_export_each.jsx └── svg_export.js ├── find_replace ├── find_anchored_object.js ├── find_and_change_template.js └── result_with_zoom.js ├── fonts ├── composit_font_template.js ├── create_fonts_sample.js └── fetch_fonts.js ├── functions ├── array_de.js └── shuffle_test.js ├── glitch ├── charcode_shift.js ├── charcode_shift_palette.js ├── convert_hex_and_sift.js ├── create_circling_objects_part1.js ├── create_circling_objects_part2.js ├── create_clock_flip_book.js ├── create_curly_hairs.js ├── create_dots.js ├── create_gathering_pattern.js ├── create_line_wave.js ├── create_pattern_by_scriptui.js ├── create_prickly_or_hairy_objects.js ├── create_ring_by_beads.js ├── create_smooth_kushu.js ├── create_thing_like_beads.js ├── create_warmy_or_curly_locus.js ├── decay_wave.js ├── draw_brute_lines_of_selected_path.js ├── exclude_overlap_path.js ├── exclude_overlap_path_gui.js ├── fill_glyph_pattern_to_frame.js ├── fill_selection_with_kushu.js ├── generate_text_pattern.js ├── kaku_blend.js ├── kushuku-01.js ├── kushuku-05.js ├── random_paint.js ├── round_text.js ├── text_slice_ui.js └── voice_wave.js ├── import └── excel_import.js ├── layer └── insert_layer_option.js ├── library_snippet ├── add_to_library_w_name.js └── place_snippet.js ├── link ├── check_link_missing_modified.jsx ├── relink_broken.js └── rename_and_relink.jsx ├── pdf_hyperlink └── create_hyperlink.js ├── scriptui ├── auto_layout.js ├── colorme.js ├── counting_plt.js ├── custom_color_and_font.jsx ├── flexible_dialog_test.js ├── progress_with_color.js ├── remember_dialog_setting.js ├── scriptui_bold_text.js ├── scriptui_copiable_alert.js ├── switch_button_font.js ├── tabbed_panel_scriptui.js ├── window_test1.js └── window_test2.js ├── shape ├── add_pathpoint_index.js ├── adjust_polygon.js ├── convert_linear_line_to_swirling_curve.js ├── convert_selection_warmy.js ├── convert_shape.js └── fatten_the_line_like_a_calligraphy.js ├── style ├── create_obj_style_w_anchored_obj.js ├── deactivate_basic_paragraph_style.js ├── get_nested_style.js ├── paragraphstyle_apply_test.js └── relative_size_checker.js ├── swatch_color ├── create_gradient_swatch.js ├── invert_color.js ├── rename_gradient.js └── unreserved_swatch.js ├── table_and_cell ├── cell_merge.js ├── cell_merge_cs2.js ├── export_contents_to_plaintext.js ├── insert_text_to_table.js ├── is_cells_merged.js ├── set_cells_size_keep_whole.js └── set_cells_size_w_calc.js ├── tagged_text ├── export_tagged_text_and_putback.js └── hira_kata_upcase.js ├── text_edit ├── add_parenthesis_pair.js ├── each_outline.js ├── export_mojikumi_diff.js ├── get_current_line.js ├── import_text_skip_anchored_obj.js ├── increase_decrease_textscale.js ├── replace_parenthesis_pair.js ├── set_aki_to_selected_text.js ├── specialcharacter.js └── unicode_salogate_pair.js ├── textframe ├── break_textchain.js └── convert_to_graphic_frame.js └── window ├── close_all_with_saving.js ├── close_all_without_save.js ├── display_setting.js └── goto_page_in_new_window.js /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/milligramme/extendscript_snippets/b03434466b9991b610ae3f038a26e1c598a57b85/.gitmodules -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | ## clone with submodule 2 | cd /path/to/anywhere 3 | git clone --recursive git://github.com/milligramme/extendscript_snippets.git 4 | 5 | ## update all submodules at onece 6 | git submodule foreach 'git checkout master; git pull origin master' 7 | -------------------------------------------------------------------------------- /_Illustrator/ai_anchor_infomation.js: -------------------------------------------------------------------------------- 1 | #target "Illustrator" 2 | 3 | var doc = app.documents[0]; 4 | var sel = doc.selection; 5 | 6 | var p_point = sel[0].pathPoints; 7 | for (var pi=0, piL=p_point.length; pi < piL ; pi++) { 8 | $.writeln(p_point[pi].leftDirection); 9 | $.writeln(p_point[pi].anchor); 10 | $.writeln(p_point[pi].rightDirection); 11 | if (p_point[pi].pointType == PointType.CORNER){ 12 | p_point[pi].pointType = PointType.SMOOTH; 13 | } 14 | }; -------------------------------------------------------------------------------- /_Illustrator/ai_checkitem.js: -------------------------------------------------------------------------------- 1 | #target "Illustrator" 2 | 3 | var check_obj = app.activeDocument; 4 | var CR = String.fromCharCode(13); 5 | var result = ""; 6 | for (i in check_obj) { 7 | try { 8 | result = result + i+" = "+check_obj[i] + CR; 9 | } 10 | catch(e){ 11 | result = result + CR; 12 | } 13 | } 14 | var page_obj = app.documents.add(); 15 | var txt_obj = page_obj.textFrames.add(); 16 | txt_obj.visibleBounds = ["2cm","2cm","27cm","19cm"]; 17 | txt_obj.contents = result; 18 | 19 | -------------------------------------------------------------------------------- /_Illustrator/ai_get_properties.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | var o = app.activeDocument.activeDataSet; 3 | (function(o){ 4 | for(var i in o){ 5 | try{ 6 | i += ':' + o[i] 7 | } 8 | catch(e){ 9 | i += ':' + e 10 | } 11 | $.writeln(i) 12 | } 13 | })(o); 14 | })() -------------------------------------------------------------------------------- /_Illustrator/ai_mask_placeditem.js: -------------------------------------------------------------------------------- 1 | #target "Illustrator" 2 | 3 | /** 4 | * mask placed items 5 | */ 6 | 7 | (function(){ 8 | var doc = app.documents.length === 0 ? (function () {alert("open any document");})() : app.documents[0]; 9 | if (! doc) {return}; 10 | 11 | var sel = app.selection; 12 | for (var si=0, siL=sel.length; si < siL ; si++) { 13 | if (sel[si].typename === "PlacedItem") { 14 | var pic_top = sel[si].top; 15 | var pic_left = sel[si].left; 16 | var pic_w = sel[si].width; 17 | var pic_h = sel[si].height; 18 | var rect = doc.pathItems.rectangle(pic_top, pic_left, pic_w, pic_h); 19 | rect.filled = false; 20 | rect.stroked = false; 21 | rect.selected = false; 22 | rect.clipping = true; 23 | var gr = doc.groupItems.add(); 24 | gr.move(sel[si], ElementPlacement.PLACEBEFORE) 25 | rect.move(gr, ElementPlacement.PLACEATBEGINNING); 26 | sel[si].move(gr, ElementPlacement.PLACEATEND); 27 | gr.clipped = true; 28 | }; 29 | }; 30 | })() 31 | -------------------------------------------------------------------------------- /_Illustrator/ai_move_layer_to_beginning.js: -------------------------------------------------------------------------------- 1 | #target "Illustrator" 2 | 3 | var lay_obj1 = activeDocument.layers["AA"]; 4 | var lay_obj2 = activeDocument.layers["BB"]; 5 | for(var i=lay_obj1.pageItems.length-1; i>=0; i--){ 6 | lay_obj1.pageItems[i].moveToBeginning(lay_obj2); 7 | } -------------------------------------------------------------------------------- /_Illustrator/ai_replace_psdjpg2eps.js: -------------------------------------------------------------------------------- 1 | #target "Illustrator" 2 | 3 | var doc = app.documents; 4 | for(var i = 0, L = doc.length ; i < L; i++){ 5 | var place_item = doc[i].placedItems; 6 | for(var ii = 0, LL = place_item.length; ii < LL; ii++){ 7 | place_item[ii].lock = false; 8 | var place_file_path = place_item[ii].file.toString().replace(/\.jpg|\.psd/,".eps"); 9 | var docede_path = File.decode(place_file_path); 10 | 11 | if(new File(docede_path)){ 12 | place_item[ii].file = new File(docede_path); 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /_Illustrator/ai_saveas/ai_save_as_eps.js: -------------------------------------------------------------------------------- 1 | #target "Illustrator" 2 | 3 | /** 4 | * save as eps 5 | * 6 | * @param {Object} doc_obj Document 7 | * @param {Number} eps_prev_mode EPS preview mode 8 | * 1 : None => 9 | * 2 : BWMACINTOSH => Mac 1Bit 10 | * 3 : COLORMACINTOSH => Mac 8Bit 11 | * 4 : BWTIFF => TIFF 1Bit 12 | * 5 : TRANSPARENTCOLORTIFF => TIFFカラー(透明) 13 | * 6 : COLORTIFF => TIFFカラー(不透明) 14 | * @example 15 | * save_ai2eps (app.activeDocument, 1); 16 | */ 17 | function save_ai2eps (doc_obj, eps_prev_mode) { 18 | // var doc_obj = app.activeDocument; 19 | var doc_ver = app.version.split('.')[0] 20 | var rm_extension = doc_obj.name.toString().replace(/\..{2,4}$/,"");//拡張子をとる 21 | var old_name = rm_extension.replace(/ \[更新済み\]?/,"");// [更新済み]があるならとる 22 | var new_path = doc_obj.path.toString()+"/"+rm_extension+".eps"; 23 | var save_path = new File(new_path); 24 | 25 | var save_opt = new EPSSaveOptions(); 26 | //保存オプション 27 | save_opt.compatibility = Compatibility['ILLUSTRATOR' + doc_ver]; 28 | switch(eps_prev_mode){ 29 | case 1: 30 | save_opt.preview = EPSPreview.None;//None 31 | break; 32 | case 2: 33 | save_opt.preview = EPSPreview.BWMACINTOSH;//Mac 1Bit 34 | break; 35 | case 3: 36 | save_opt.preview = EPSPreview.COLORMACINTOSH;//Mac 8Bit 37 | break; 38 | case 4: 39 | save_opt.preview = EPSPreview.BWTIFF;//TIFF 1Bit 40 | break; 41 | case 5: 42 | save_opt.preview = EPSPreview.TRANSPARENTCOLORTIFF;//TIFFカラー(透明) 43 | break; 44 | case 6: 45 | save_opt.preview = EPSPreview.COLORTIFF;//TIFFカラー(不透明) 46 | break; 47 | default: ; break; 48 | } 49 | save_opt.overPrint = PDFOverprint.PRESERVEPDFOVERPRINT;//オーバープリント保持 50 | save_opt.embedAllFonts = true; 51 | save_opt.embedLinkedFiles = true;//配置画像を含む 52 | save_opt.includeDocumentThumbnails = true; 53 | save_opt.cmykPostScript = true; 54 | save_opt.compatibleGradientPrinting = false; 55 | // save_opt.flattenOutput = OutputFlattening.PRESERVEAPPEARANCE// 56 | save_opt.EPSPostScriptLevelEnum = EPSPostScriptLevelEnum.LEVEL3//ポストスクリプトレベル3 57 | 58 | //別名保存、元データは保存せずに閉じる 59 | doc_obj.saveAs(save_path, save_opt); 60 | doc_obj.close(SaveOptions.DONOTSAVECHANGES); 61 | } 62 | -------------------------------------------------------------------------------- /_Illustrator/ai_swatch_add.js: -------------------------------------------------------------------------------- 1 | #target "Illustrator" 2 | 3 | var doc = documents[0]; 4 | var sw = doc.swatches; 5 | for (var i = 0; i < doc.swatches.length; i++){ 6 | $.writeln(sw[i].name); 7 | } 8 | 9 | var b = new CMYKColor (); 10 | b.black = 100; 11 | b.ctan = 0; 12 | b.magenta = 0; 13 | b.yellow = 0; 14 | 15 | var bsw = sw.add({color : b, name : "Black" }); 16 | $.writeln(bsw.color); // => [GrayColor] 17 | $.writeln(b); // => [CMYKColor] 18 | -------------------------------------------------------------------------------- /_photoshop/convert_pdf_to_eps_psd.js: -------------------------------------------------------------------------------- 1 | #target "Photoshop" 2 | //pdfを希望解像度で拡大縮小してepsとかpsdとかの画像にするスクリプト 3 | // 4 | //実行すると、変換するPDFフォルダ、書き出し先フォルダをきいてくるので 5 | //選択、パラメーターの書き換えでEPS、PSD、拡大縮小率、解像度を指定します。 6 | 7 | //パラメーター 8 | var finalResolutionSetting = 400; //最終的に希望する解像度 9 | var devideWithPer = 0.25; //希望する拡大縮小率 10 | var saveAsEPS = false; //trueならEPS, falseならばPSD 11 | 12 | //pdfがある対象フォルダを選択 13 | var targetFolder = Folder.selectDialog ("select target folder"); 14 | if(targetFolder != null){ 15 | //書き出し先のフォルダを選択 16 | var exportFolder = Folder.selectDialog ("select export folder"); 17 | if(exportFolder != null){ 18 | setPref(); //設定Fnへ 19 | if(saveAsEPS == true){ //EPS書き出しFnへ 20 | convertPDF2EPS(targetFolder, exportFolder, pdfOpenOpt, epsSaveOpt); 21 | } 22 | else{ //PSD書き出しFnへ 23 | convertPDF2PSD(targetFolder, exportFolder, pdfOpenOpt, psdSaveOpt); 24 | } 25 | } 26 | } 27 | 28 | //PDF、EPS、PSDの入出力の設定をする 29 | function setPref (){ 30 | pdfOpenOpt = new PDFOpenOptions(); 31 | with(pdfOpenOpt){ 32 | antiAlias = true; 33 | cropPage = CropToType.MEDIABOX; 34 | //Deprecated for Adobe Photoshop CS3 / 非推奨で反映されないプロパティ 35 | //constrainProportions = ; 36 | //width = ; 37 | //height = ; 38 | resolution = finalResolutionSetting * devideWithPer; 39 | mode = OpenDocumentMode.CMYK; 40 | bitPerChannel = BitsPerChannelType.EIGHT; 41 | page = 1; 42 | suppressWargings = true; //警告を非表示 43 | usePageNumber = true; //falseならば画像の番号になる。 44 | } 45 | 46 | epsSaveOpt = new EPSSaveOptions(); 47 | with(epsSaveOpt){ 48 | embedColorProfile = true; 49 | encoding = SaveEncoding.JPEGMAXIMUM; 50 | halftoneScreen = false; 51 | interpolation = false; 52 | preview = Preview.EIGHTBITTIFF; //DOM Libraryのうそつき(MacPreviewType)? 53 | psColorManagement = false; 54 | transferFunction = false; 55 | transparentWhites = false; 56 | vectorData = false; 57 | } 58 | 59 | psdSaveOpt = new PhotoshopSaveOptions(); 60 | with(psdSaveOpt){ 61 | alphaChannels = true; 62 | annotations = true; 63 | embedColorProfile = false; 64 | layers = false; 65 | spotColors = false; 66 | } 67 | return pdfOpenOpt, epsSaveOpt, psdSaveOpt 68 | } 69 | 70 | //EPSにする 71 | function convertPDF2EPS(targetFolder, exportFolder, pdfOpenOpt, epsSaveOpt){ 72 | var pdfPath = new File(targetFolder).fsName; 73 | var pdfFileList = File(pdfPath).getFiles( 74 | function (file){ 75 | return /^[^\.]+\.pdf$/i.test(file.name) 76 | }); 77 | for(var i=0, L=pdfFileList.length; i < L; i++){ 78 | app.open(pdfFileList[i], pdfOpenOpt); 79 | var fileObj = new File(exportFolder+"/"+pdfFileList[i].name.replace(/\.pdf/,".eps")); 80 | activeDocument.resizeImage (undefined, undefined, finalResolutionSetting, ResampleMethod.NONE); 81 | activeDocument.saveAs(fileObj, epsSaveOpt, true, Extension.LOWERCASE); 82 | activeDocument.close(SaveOptions.DONOTSAVECHANGES); //DOM Libraryのうそつき(SaveOptionsType)? 83 | } 84 | } 85 | 86 | //PSDにする 87 | function convertPDF2PSD(targetFolder, exportFolder, pdfOpenOpt, psdSaveOpt){ 88 | pdfPath = new File(targetFolder).fsName; 89 | pdfFileList = File(pdfPath).getFiles( 90 | function (file){ 91 | return /^[^\.]+\.pdf$/i.test(file.name) 92 | }); 93 | for(var i=0, L=pdfFileList.length; i < L; i++){ 94 | app.open(pdfFileList[i], pdfOpenOpt); 95 | var fileObj = new File(exportFolder+"/"+pdfFileList[i].name.replace(/\.pdf/,".psd")); 96 | activeDocument.resizeImage (undefined, undefined, finalResolutionSetting, ResampleMethod.NONE); 97 | activeDocument.flatten(); //画像を統合 98 | activeDocument.saveAs(fileObj, psdSaveOpt, true, Extension.LOWERCASE); 99 | activeDocument.close(SaveOptions.DONOTSAVECHANGES); //DOM Libraryのうそつき(SaveOptionsType)? 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /_photoshop/selection_fill_opacity50.js: -------------------------------------------------------------------------------- 1 | /** 2 | * for Photoshop opacty50 + save as for web 3 | */ 4 | 5 | var doc_obj = app.activeDocument; 6 | var sel_obj = doc_obj.selection; 7 | sel_obj.invert(); 8 | var lay_obj = doc_obj.artLayers.add(); 9 | 10 | RGBColor = new SolidColor(); 11 | RGBColor.red = 0; 12 | RGBColor.green = 0; 13 | RGBColor.blue = 0; 14 | 15 | sel_obj.fill(RGBColor, ColorBlendMode.NORMAL, 50, false); 16 | 17 | /* 18 | ColorBlendMode.BEHIND 19 | ColorBlendMode.CLEAR 消去 20 | ColorBlendMode.COLOR カラー 21 | ColorBlendMode.COLORBURN 焼き込みカラー 22 | ColorBlendMode.COLORDODGE 覆い焼きカラー 23 | ColorBlendMode.DARKEN 比較(暗) 24 | ColorBlendMode.DIFFERENCE 差の絶対値 25 | ColorBlendMode.DISSOLVE ディザ合成 26 | ColorBlendMode.EXCLUSION 除外 27 | ColorBlendMode.HARDLIGHT ハードライト 28 | ColorBlendMode.HUE 色相 29 | ColorBlendMode.LIGHTEN 比較(明) 30 | ColorBlendMode.LINEARBURN 焼き込み(リニア) 31 | ColorBlendMode.LINEARDODGE 覆い焼き(リニア) 32 | ColorBlendMode.LINEARLIGHT リニアライト 33 | ColorBlendMode.LUMINOSITY 輝度 34 | ColorBlendMode.MULTIPLY 乗算 35 | ColorBlendMode.NORMAL 通常 36 | ColorBlendMode.OVERLAY オーバーレイ 37 | ColorBlendMode.PASSTHROUGH 38 | ColorBlendMode.PINLIGHT ピンライト 39 | ColorBlendMode.SATURATION 彩度 40 | ColorBlendMode.SCREEN スクリーン 41 | ColorBlendMode.SOFTLIGHT ソフトライト 42 | ColorBlendMode.VIVIDLIGHT ビビッドライト 43 | */ 44 | 45 | doc_obj.flatten(); -------------------------------------------------------------------------------- /book/add_to_book.js: -------------------------------------------------------------------------------- 1 | app.scriptPreferences.userInteractionLevel = UserInteractionLevels.NEVER_INTERACT; 2 | 3 | var book_dest = "~/Desktop/test.indb"; 4 | 5 | var target_f = Folder.selectDialog("indd folder"); 6 | if (target_f) { 7 | var target_f_path = target_f.fsName; 8 | var indd_file_list = File(target_f_path).getFiles( 9 | function (file){ return /^[^\.]+\.indd$/i.test(file.name);} 10 | ); 11 | add_to_book_w_autopagenate (book_dest, indd_file_list, true); 12 | }; 13 | app.scriptPreferences.userInteractionLevel = UserInteractionLevels.INTERACT_WITH_ALL; 14 | 15 | /** 16 | * indd add to book, and pagenate? 17 | * 18 | * @param {String} book_dest file FilePath of Book Object 19 | * @param {Array} indd_file_list Array of indd 20 | * @param {Boolean} pagenate If true, Do Automatic Pagenation 21 | */ 22 | function add_to_book_w_autopagenate (book_dest, indd_file_list, pagenate) { 23 | // var book_dest = "~/Desktop/test.indb"; 24 | var book_name = book_dest.split('/').pop(); 25 | 26 | var book_obj = app.books.item(book_name) === null ? app.books.add(File(book_dest)) : app.books.item(book_name); 27 | 28 | with (book_obj){ 29 | automaticDocumentConversion = false; 30 | automaticPagination = pagenate ? true : false; 31 | insertBlankPage = false; 32 | mergeIdenticalLayers = true; 33 | repaginationOption = RepaginateOption.NEXT_PAGE; 34 | } 35 | 36 | for (var i=0, iL=indd_file_list.length; i < iL ; i++) { 37 | book_obj.bookContents.add(File(indd_file_list[i].fullName), -1); 38 | }; 39 | if (pagenate) { 40 | var bookcont_obj = book_obj.bookContents; 41 | for (var bci=1, bciL=bookcont_obj.length; bci < bciL ; bci++) { 42 | var doc = app.open(File(bookcont_obj[bci].fullName), false); 43 | var section_obj = doc.sections; 44 | for (var sci=0, sciL=section_obj.length; sci < sciL ; sci++) { 45 | section_obj[sci].continueNumbering = true; 46 | }; 47 | doc.close(SaveOptions.yes); 48 | }; 49 | book_obj.repaginate(); 50 | }; 51 | 52 | // book_obj is not yet saved 53 | // if you want, do below 54 | // book_obj.save(); 55 | // book_obj.close(SaveOptions.yes); 56 | } 57 | -------------------------------------------------------------------------------- /book/export_pdf_from_book.js: -------------------------------------------------------------------------------- 1 | // export pdf from book 2 | 3 | var book_obj = app.books[0]; 4 | export_pdf_per_n (book_obj, "[高品質印刷]", 6); 5 | 6 | /** 7 | * export pdf each? 8 | * 9 | * @param {Object} book_obj Book object 10 | * @param {String} preset_name PDF Preset name 11 | * @param {Number} indd_per_pdf Export each n indd 12 | */ 13 | function export_pdf_per_n (book_obj, preset_name, indd_per_pdf) { 14 | var bookcont_obj = book_obj.bookContents; 15 | if (indd_per_pdf === undefined) {indd_per_pdf = bookcont_obj.length}; 16 | var sliced_arr = split_get_start_end(bookcont_obj.everyItem().index, indd_per_pdf); 17 | 18 | for (var sli=0, sliL=sliced_arr.length; sli < sliL ; sli++) { 19 | book_obj.exportFile( 20 | File(book_obj.fullName.toString()+"_"+sliced_arr[sli].join('-')+".pdf"), 21 | false, 22 | app.pdfExportPresets.item(preset_name), 23 | bookcont_obj.itemByRange(sliced_arr[sli][0], sliced_arr[sli][1]) 24 | ); 25 | }; 26 | } 27 | 28 | /** 29 | * @param {Array} array [1,2,3,4,5,6,7,8.....] 30 | * @param {Number} per Slice each n 31 | * @returns {Array} Array of Array 32 | */ 33 | function split_get_start_end (array, per) { 34 | var arr = []; 35 | var result = []; 36 | for (var i=0, iL=Math.ceil(array.length/per); i < iL ; i++) { 37 | arr.push(array.slice(i*per, (i+1)*per)); 38 | }; 39 | for (var j=0; j < arr.length; j++) { 40 | result.push([arr[j][0],arr[j][arr[j].length-1]]); 41 | }; 42 | return result; // [ [start,end],[start,end],,,,] 43 | } -------------------------------------------------------------------------------- /env/change_guide_color.js: -------------------------------------------------------------------------------- 1 | /** 2 | 選択ガイドの色を変える 3 | "change color of guides" 4 | 5 | 使い方: 6 | ガイドを選択して実行。ガイドの色を変えます。 7 | 8 | 動作確認:OS10.4.11 InDesign CS3 9 | 10 | milligramme 11 | www.milligramme.cc 12 | */ 13 | if(app.documents.length==0 || app.selection.length==0){ 14 | alert("select any guide"); 15 | exit(); 16 | } 17 | 18 | var selObj=app.selection; 19 | if(selObj[0].constructor.name=="Guide"){ 20 | main(selObj); 21 | } 22 | else{alert("select any guide");} 23 | 24 | function main(selObj){ 25 | var UICList=["LIGHT_BLUE", "RED", "GREEN", "BLUE", "YELLOW", 26 | "MAGENTA", "CYAN", "GRAY", "BLACK", "ORANGE", "DARK_GREEN", 27 | "TEAL", "TAN", "BROWN", "VIOLET", "GOLD", "DARK_BLUE", "PINK", 28 | "LAVENDER", "BRICK_RED", "OLIVE_GREEN", "PEACH", "BURGUNDY", 29 | "GRASS_GREEN", "OCHRE", "PURPLE", "LIGHT_GRAY", "CHARCOAL", 30 | "GRID_BLUE", "GRID_ORANGE", "FIESTA", "LIGHT_OLIVE", "LIPSTICK", 31 | "CUTE_TEAL", "SULPHUR", "GRID_GREEN", "WHITE"]; 32 | var dlg=new Window('dialog', 'change!' , [0, 0, 160, 96]); 33 | dlg.center(); 34 | dlg.ddList=dlg.add('dropdownlist' , [12, 28, 148, 44] , UICList); 35 | dlg.ddList.selection=6;// CYAN 36 | dlg.add('statictext' , [12, 10, 148, 27] , 'choose color'); 37 | dlg.cancelButton=dlg.add('button' , [84, 62, 148, 77] , 'cancel' , {name: 'cancel'}); 38 | dlg.okButton=dlg.add('button' , [12, 62, 76, 77] , 'ok' , {name: 'ok'}); 39 | 40 | var flag; 41 | dlg.okButton.onClick=function(){ 42 | flag=true 43 | dlg.close(); 44 | } 45 | dlg.cancelButton.onClick=function(){ 46 | dlg.close(); 47 | } 48 | dlg.show(); 49 | 50 | if(flag==true){ 51 | var col=dlg.ddList.selection.text 52 | for(var i=0; i < selObj.length; i++){ 53 | selObj[i].guideColor=UIColors[col]; 54 | } 55 | } 56 | } -------------------------------------------------------------------------------- /env/check_doc.js: -------------------------------------------------------------------------------- 1 | /** 2 | * check indesign condition 3 | */ 4 | $.writeln( check_env()['doc_opened'] ); // true => ドキュメントが開いてる 5 | $.writeln( check_env().something_selected ); // undefined => 何も選択していない 6 | 7 | function check_env() { 8 | var obj = {}; 9 | // ドキュメントが何かしら開いてる 10 | obj['doc_opened'] = app.documents.length !== 0; 11 | 12 | if ( obj['doc_opened'] ) { 13 | // ドキュメントが一つ以上開いていて、かつ何かオブジェクトを選択している 14 | obj['something_selected'] = app.selection.length > 0; 15 | 16 | // テキストオブジェクトを選択している(テキストフレームは含まない) 17 | obj['text_obj_selected'] = app.selection.length === 1 && app.selection[0].hasOwnProperty('baseline'); 18 | 19 | // 表、セルを選択している 20 | obj['table_obj_selected'] = app.selection.length === 1 && app.selection[0].hasOwnProperty('cells'); 21 | }; 22 | return obj 23 | } 24 | 25 | /** 26 | * check existing styles or objects by name 27 | */ 28 | 29 | // ドキュメントが開いてなければつくる。あれば利用する 30 | // var doc = app.documents.length === 0 ? app.documents.add() : app.documents[0]; 31 | var doc = app.documents.length === 0 ? exit() : app.documents[0]; 32 | 33 | // 所定のスタイルなどがあるか? 34 | var p_name = "Pu"; // 段落スタイル 35 | var c_name = "Bold"; // 文字スタイル 36 | var tb_name = "Grid"; // 表スタイル 37 | var cl_name = "Gate"; // セルスタイル 38 | var ob_name = "Anchored" // オブジェクトスタイル 39 | var swatch_name = "Amber"; // スウォッチ 40 | 41 | var p_style = doc.paragraphStyles; // 段落スタイル 42 | var c_style = doc.characterStyles; // 文字スタイル 43 | var tb_style = doc.tableStyles; // 表スタイル 44 | var cl_style = doc.cellStyles; // セルスタイル 45 | var ob_style = doc.objectStyles; // オブジェクトスタイル 46 | var swatch_obj = doc.swatches; // スウォッチ 47 | 48 | named_obj_exist(p_style, p_name); 49 | named_obj_exist(c_style, c_name); 50 | named_obj_exist(tb_style, tb_name); 51 | named_obj_exist(cl_style, cl_name); 52 | named_obj_exist(ob_style, ob_name); 53 | named_obj_exist(swatch_obj, swatch_name); 54 | 55 | // スウォッチがなければつくる。あれば利用する 56 | var marker_swatch = named_obj_exist(swatch_obj, "Rebuild") 57 | ? swatch_obj.item("Rebuild") 58 | : doc.colors.add({ 59 | model:ColorModel.PROCESS, 60 | space:ColorSpace.CMYK, 61 | colorValue:[3,11,14,46], 62 | name:"Rebuild"}); 63 | 64 | var marker_swatch; 65 | try { 66 | marker_swatch = doc.colors.add({model:ColorModel.PROCESS, space:ColorSpace.CMYK, colorValue:[3,11,14,46], name:"Rebuild"}); 67 | } 68 | catch(e){ 69 | marker_swatch = swatch_obj.item("Rebuild"); 70 | } 71 | 72 | function named_obj_exist(style, style_name) { 73 | flg = false; 74 | for (var i=0, iL=style.length; i < iL; i++) {if (style[i].name === style_name) {flg = true;};}; 75 | return flg 76 | } 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /env/check_doc_fullpath.js: -------------------------------------------------------------------------------- 1 | /** 2 | * is document saved at least once? 3 | */ 4 | function has_fullpath (doc) { 5 | return doc.properties['fullName'] !== undefined 6 | } 7 | -------------------------------------------------------------------------------- /env/check_pathtype.js: -------------------------------------------------------------------------------- 1 | // check path type 2 | var doc = app.documents[0]; 3 | 4 | var f = new File(doc.fullName); 5 | alert("Paths\r" + 6 | "fsName(環境依存のフルパス)\r\t" + f.fsName +"\r"+ 7 | "fullName(URIフルパス)\r\t" + f.fullName +"\r"+ 8 | "absoluteURI(URIフルパス)\r\t" + f.absoluteURI +"\r"+ 9 | "relativeURI(カレントフォルダからの相対パス)\r\t" + f.relativeURI 10 | ); 11 | -------------------------------------------------------------------------------- /env/check_style_existence.jsx: -------------------------------------------------------------------------------- 1 | /** 2 | * does named style exist? 3 | * 4 | * @param {Object} app_or_doc app or app.documents[0] 5 | * @param {String} style Instance 6 | * @param {String} name Style name to check 7 | * @param {Boolean} include_group if true can use stylegroupname::stylename for name 8 | * 9 | */ 10 | var check_style_existence = function (app_or_doc, style, name, include_group) { 11 | var flg = false; 12 | 13 | if (include_group) { 14 | var _grp = style.replace(/Styles$/,"StyleGroups"); 15 | var style_group = app_or_doc[_grp]; 16 | for (var i=0, iL=style_group.length; i < iL ; i++) { 17 | var obj_style = style_group[i][style]; 18 | for (var j=0, jL=obj_style.length; j < jL ; j++) { 19 | if ([ style_group[i].name, obj_style[j].name ].join("::") == name) { 20 | flg = true; 21 | }; 22 | }; 23 | }; 24 | } 25 | else { 26 | var _all_style = "all" + style[0].toUpperCase() + style.slice(1); 27 | var style_ary = app_or_doc[_all_style]; 28 | for (var i=0, iL=style_ary.length; i < iL ; i++) { 29 | if (style_ary[i].name == name) { 30 | flg = true; 31 | }; 32 | }; 33 | } 34 | return flg; 35 | } 36 | -------------------------------------------------------------------------------- /env/create_stray_anchorpoints.js: -------------------------------------------------------------------------------- 1 | #target 'InDesign' 2 | //generate stray anchor points 3 | //for test to remove stray anchor points with scripting 4 | 5 | var doc_obj = app.documents[0]; 6 | var page_obj = doc_obj.pages; 7 | 8 | for(var pg=0; pg < page_obj.length; pg++){ 9 | var grp = []; 10 | for(var i=0; i < 100; i++){ 11 | var poi = page_obj[pg].graphicLines.add(); 12 | poi.paths[0].pathPoints[1].remove(); 13 | poi.move([ 14 | doc_obj.documentPreferences.pageWidth * Math.random() , 15 | doc_obj.documentPreferences.pageHeight * Math.random() 16 | ]) 17 | if(i%20 == 0){grp.push(poi);} 18 | } 19 | page_obj[pg].groups.add(grp); 20 | } -------------------------------------------------------------------------------- /env/get_parent_page.jsx: -------------------------------------------------------------------------------- 1 | /** 2 | * return parent page no with section marker 3 | * 4 | * @param {Object} obj PageItem(TextFrame or Frame object such as Rectangle, Oval, Polygon...) 5 | * @returns {String} Page name 6 | */ 7 | get_parent_page = function (obj){ 8 | if (app.version.split('.')[0] >= 7) { 9 | if (obj.parentPage !== null) { 10 | return obj.parentPage.appliedSection.name + obj.parentPage.name; 11 | } 12 | else { 13 | return "PB"; 14 | } 15 | } 16 | else { 17 | var pc = obj.parent.constructor.name; 18 | switch(pc){ 19 | case "Page": 20 | return obj.parent.appliedSection.name + obj.parent.name; 21 | break; 22 | case "Spread": // Pasteboard 23 | return "PB"; 24 | break; 25 | case "Character": // Anchored Object 26 | return get_parent_page(obj.parent.parentTextFrames[0]); 27 | break; 28 | case "Story": // Texts 29 | return get_parent_page(obj.parent.textContainers[0]); 30 | break; 31 | default: 32 | return get_parent_page(obj.parent); 33 | break; 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /env/interaction_test.js: -------------------------------------------------------------------------------- 1 | /** 2 | * user interaction level test 3 | * 4 | * Created by mg on 2010-10-07. 5 | */ 6 | 7 | //all 8 | app.scriptPreferences.userInteractionLevel = UserInteractionLevels.INTERACT_WITH_ALL; 9 | testPack ("all"); 10 | //アラート、プロンプト、確認ダイアログ、フォルダ選択、ダイアログでる 11 | //エラーメッセージでる 12 | 13 | app.scriptPreferences.userInteractionLevel = UserInteractionLevels.INTERACT_WITH_ALL; 14 | 15 | //never 16 | app.scriptPreferences.userInteractionLevel = UserInteractionLevels.NEVER_INTERACT; 17 | testPack ("never"); 18 | //アラート、プロンプト、確認ダイアログ、フォルダ選択 19 | //ダイアログでない 20 | //エラーメッセージでない 21 | app.scriptPreferences.userInteractionLevel = UserInteractionLevels.INTERACT_WITH_ALL; 22 | 23 | //alert 24 | app.scriptPreferences.userInteractionLevel = UserInteractionLevels.INTERACT_WITH_ALERTS; 25 | testPack ("alert"); 26 | //アラート、プロンプト、確認ダイアログ、フォルダ選択 27 | //ダイアログでない 28 | //エラーメッセージでない 29 | app.scriptPreferences.userInteractionLevel = UserInteractionLevels.INTERACT_WITH_ALL; 30 | 31 | 32 | function testPack (string) { 33 | alert(string); 34 | prompt(string,string); 35 | confirm(string,true); 36 | Folder.selectDialog(); 37 | 38 | //dialog step will be skipped 39 | var dn = app.dialogs.add({name:string}); 40 | dn.show(); 41 | dn.destroy(); 42 | if (string === "never" || string === "alert") { 43 | //indd has invalid fonts and links 44 | app.open(File("~/Desktop/temp/alert_test.indd")); 45 | //skipped modal dialog 46 | $.sleep(1000); 47 | app.documents[0].close(); 48 | }; 49 | 50 | } -------------------------------------------------------------------------------- /env/live_preflight_onoff.js: -------------------------------------------------------------------------------- 1 | /** 2 | * InDesign CS4 LivePreflight 3 | */ 4 | 5 | //Target: Application = All Documents 6 | //turn Live Preflight on 7 | app.preflightOptions.preflightOff = false; 8 | 9 | //turn Live Preflight off 10 | app.preflightOptions.preflightOff = true; 11 | 12 | //Mostfront Document 13 | //turn Live Preflight on 14 | app.documents[0].preflightOptions.preflightOff = false; 15 | 16 | //turn Live Preflight off 17 | app.documents[0].preflightOptions.preflightOff = true; -------------------------------------------------------------------------------- /env/locale_test.js: -------------------------------------------------------------------------------- 1 | alert($.locale); 2 | var ob = { 3 | en:"helloworld", 4 | ja:"こんにちわーるど", 5 | fr: "bonjour monde" 6 | }; 7 | 8 | $.localize = true; 9 | 10 | $.locale = 'en_EN'; 11 | alert(ob); 12 | 13 | $.locale ='ja_JP'; 14 | alert(ob); 15 | 16 | $.locale ='fr_FR'; 17 | alert(ob); 18 | 19 | $.locale=null 20 | alert($.locale);// => ja_JP -------------------------------------------------------------------------------- /env/reset_guide_color.js: -------------------------------------------------------------------------------- 1 | //ガイドの色のリセット 2 | //ドキュメント上のガイド全部リセット 3 | app.documents[0].guides.everyItem().guideColor = UIColors.CYAN; 4 | //ドキュメントページだけリセット 5 | app.documents[0].pages.everyItem().guides.everyItem().guideColor = UIColors.CYAN; 6 | //マスターページだけリセット(再描画させないと反映されない?) 7 | app.documents[0].masterSpreads.everyItem().guides.everyItem().guideColor = UIColors.CYAN; -------------------------------------------------------------------------------- /env/send_growl_notify.js: -------------------------------------------------------------------------------- 1 | /** 2 | * indesign send growl notify 3 | * 4 | * InDesignのJavaScriptからGrowlに通知を出す【OSX】 - なにする?DTP+WEB 5 | * http://d.hatena.ne.jp/kamiseto/20090328/1238215781 6 | * 7 | * @param {String} title Title 8 | * @param {String} description Description 9 | * @example 10 | * #include /path/to/send_growl_notify.js 11 | * send_growl_notify("Info", "Done!"); 12 | * 13 | */ 14 | function send_growl_notify(title, description){ 15 | var app_ver_name = {"50":"CS3", "60":"CS4", "70":"CS5", "75":"CS5.5"}; 16 | var app_cs_ver_name = app_ver_name[app.version.split('.')[0]+app.version.split('.')[1]]; 17 | var growlNotify = [ 18 | 'tell application "GrowlHelperApp"', 19 | 'set the allNotificationsList to {"indesign"}', 20 | 'set the enabledNotificationsList to {"indesign"}', 21 | 'register as application "Indesign Notify" all notifications allNotificationsList default notifications enabledNotificationsList icon of application "Adobe InDesign '+app_cs_ver_name+'"', 22 | 'notify with name "indesign" title "' + title + '" description "' + description + '" application name "Indesign Notify"', 23 | 'end tell' 24 | ].join('\r'); 25 | app.doScript(growlNotify , ScriptLanguage.APPLESCRIPT_LANGUAGE); 26 | } -------------------------------------------------------------------------------- /env/stroke_style.js: -------------------------------------------------------------------------------- 1 | /** 2 | * stroke style 3 | */ 4 | 5 | var doc = app.documents[0]; 6 | // doc.strokeStyles.everyItem().properties; 7 | presets = [ 8 | {strokeStyleType:"",name:"三重線",id:45082,index:0}, 9 | {strokeStyleType:"",name:"太い - 細い - 太い",id:45065,index:1}, 10 | {strokeStyleType:"",name:"細い - 太い - 細い",id:45064,index:2}, 11 | {strokeStyleType:"",name:"太い - 太い",id:45063,index:3}, 12 | {strokeStyleType:"",name:"太い - 細い",id:45062,index:4}, 13 | {strokeStyleType:"",name:"細い - 太い",id:45061,index:5}, 14 | {strokeStyleType:"",name:"二重線",id:45060,index:6}, 15 | {strokeStyleType:"",name:"句点", id:23103, index:7}, 16 | {strokeStyleType:"",name:"ホワイトダイヤモンド", id:23102, index:8}, 17 | {strokeStyleType:"",name:"左斜線ハッシュ", id:23101, index:9}, 18 | {strokeStyleType:"",name:"右斜線ハッシュ", id:23100, index:10}, 19 | {strokeStyleType:"",name:"直線ハッシュ", id:23099, index:11}, 20 | {strokeStyleType:"",name:"波状", id:23098, index:12}, 21 | {strokeStyleType:"",name:"点", id:23097, index:13}, 22 | {strokeStyleType:"",name:"点線 (3 & 2)", id:23096, index:14}, 23 | {strokeStyleType:"",name:"点線 (4 & 4)", id:23095, index:15}, 24 | {strokeStyleType:"",name:"点線", id:23082, index:16}, 25 | {strokeStyleType:"",name:"ベタ", id:23081, index:17} 26 | ]; 27 | 28 | doc.dashedStrokeStyles.add({ 29 | dashArray:[2,4,6,8],// 30 | endCap:EndCap./*BUTT_END_CAP,*/PROJECTING_END_CAP/*,ROUND_END_CAP*/, 31 | name:"dashed", 32 | strokeCornerAdjustment: StrokeCornerAdjustment.DASHES/*,GAP,DASHES_AND_GAPS,NONE*/ 33 | }); 34 | 35 | doc.dottedStrokeStyles.add({ 36 | dotArray:[1,2,3,4], 37 | name:"dotted", 38 | strokeCornerAdjustment: StrokeCornerAdjustment./*DASHES,GAP,*/DASHES_AND_GAPS/*,NONE*/ 39 | }); 40 | 41 | doc.stripedStrokeStyles.add({ 42 | stripeArray:[0,25,50,75],// length must be even, 43 | name:"striped" 44 | }) 45 | 46 | 47 | -------------------------------------------------------------------------------- /env/switch_convert2TF_enabler.js: -------------------------------------------------------------------------------- 1 | //実行するごとに 2 | //「文字ツールでフレームをテキストフレームに変換」の有効/無効を切り替える。 3 | 4 | $.localize = true; 5 | 6 | var conv2tf_inactive = {en: "Type Tool Converts Frames to Text Frames", ja: "文字ツールでフレームをテキストフレームに変換できます"}; 7 | var conv2tf_active = {en: "Type Tool Doesn't Convert Frames to Text Frames", ja: "文字ツールでフレームをテキストフレームに変換しません"}; 8 | 9 | if(app.textEditingPreferences.singleClickConvertsFramesToTextFrames == true){ 10 | app.textEditingPreferences.singleClickConvertsFramesToTextFrames = false; 11 | alert( "invalid\r"+conv2tf_active); 12 | } 13 | else{ 14 | app.textEditingPreferences.singleClickConvertsFramesToTextFrames = true; 15 | alert( "valid\r"+ conv2tf_inactive); 16 | } -------------------------------------------------------------------------------- /env/which_column_belongs.js: -------------------------------------------------------------------------------- 1 | /** 2 | * which column Selection text is belonging to 3 | */ 4 | if (app.selection.length === 1 && app.selection[0].hasOwnProperty('baseline')) { 5 | var sel = app.selection[0]; 6 | alert(which_column(sel)); 7 | }; 8 | 9 | function which_column(sel){ 10 | var sel_indx = sel.texts[0].index; 11 | var parent_tx_column = sel.parentTextFrames[0].textColumns; 12 | var columns_count = sel.parentTextFrames[0].textFramePreferences.textColumnCount; 13 | for (var i=0, iL=parent_tx_column.length; i < iL ; i++) { 14 | if (sel_indx < parent_tx_column[i].characters[-1].index){ 15 | var is_span_column = sel.spanColumnType === SpanColumnTypeOptions.SPAN_COLUMNS ? " (SpanColumn)" : ""; 16 | var result = "in Column No."+(i+1)+is_span_column; 17 | return result 18 | } 19 | }; 20 | }; 21 | -------------------------------------------------------------------------------- /env/writeln_for_app/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /env/writeln_for_app/test.js: -------------------------------------------------------------------------------- 1 | #include 'writeln_for_app.js' 2 | var wo = app.selection[0].words; 3 | 4 | for (var i=0, iL=wo.length; i < iL ; i++) { 5 | if (wo[i].contents.charAt(0) === "c"){ 6 | wo[i].fillColor = "Paper"; 7 | wo[i].strokeWeight = "0.2pt"; 8 | wo[i].strokeColor = "Black"; 9 | swriteln (wo[i].contents); 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /env/writeln_for_app/writeln_for_app.js: -------------------------------------------------------------------------------- 1 | #targetengine "m-session" 2 | /** 3 | * $.writeln for app 4 | * 5 | */ 6 | var watcher = create_console(); 7 | watcher.show(); 8 | 9 | function create_console () { 10 | var win = new Window('window', 's.writeln'); 11 | // win.margins = 5; 12 | win.p_store = win.add('edittext', [0,0,270,180], "", {multiline: true}); 13 | return win; 14 | } 15 | /** 16 | * @param {String} logs any string 17 | */ 18 | function swriteln (logs) { 19 | watcher.p_store.text = logs+"\n" + watcher.p_store.text; 20 | watcher.p_store.active = true; 21 | } 22 | 23 | -------------------------------------------------------------------------------- /eventlitener/addevent_git_commit_after_save.js: -------------------------------------------------------------------------------- 1 | #targetengine "session" 2 | main(); 3 | function main(){ 4 | var af_save = app.addEventListener("afterSave", git_indd, false); 5 | } 6 | function git_indd (myEvent){ 7 | var doc = myEvent.parent; 8 | if (has_fullpath (doc)) { 9 | var cd_path = doc.fullName.parent; 10 | 11 | var receipt = "do shell script \"cd " + cd_path + "; git init; git add .; git commit -m 'update'\""; 12 | app.doScript(receipt, ScriptLanguage.APPLESCRIPT_LANGUAGE); 13 | }; 14 | } 15 | 16 | /** 17 | * is document saved at least once? 18 | */ 19 | function has_fullpath (doc) { 20 | return doc.properties['fullName'] !== undefined 21 | } 22 | -------------------------------------------------------------------------------- /eventlitener/addevent_printable.js: -------------------------------------------------------------------------------- 1 | #targetengine "session" 2 | main(); 3 | function main(){ 4 | var printBf = app.addEventListener("beforePrint", layPrintable, true) 5 | var printAf = app.addEventListener("afterPrint", layDisPrintable, true) 6 | } 7 | 8 | function layPrintable (){ 9 | app.documents[0].layers[0].printable = true; 10 | } 11 | 12 | function layDisPrintable (){ 13 | app.documents[0].layers[0].printable = false; 14 | } 15 | 16 | -------------------------------------------------------------------------------- /eventlitener/addevent_show_guides_after_open.js: -------------------------------------------------------------------------------- 1 | #targetengine "session" 2 | main(); 3 | function main(){ 4 | var afOp = app.addEventListener("afterOpen", showGuidesAndFrame, false); 5 | } 6 | 7 | function showGuidesAndFrame (myEvent){ 8 | var doc = myEvent.parent; 9 | with(doc){ 10 | guidePreferences.guidesShown = true; //ガイド表示 11 | viewPreferences.showFrameEdges = true; //フレーム枠表示 12 | viewPreferences.showRulers = true; //ルーラー表示 13 | textPreferences.showInvisibles = true; //制御文字表示 14 | } 15 | } 16 | 17 | 18 | -------------------------------------------------------------------------------- /eventlitener/removeeventlister_sample.js: -------------------------------------------------------------------------------- 1 | #targetengine "session" 2 | app.removeEventListener("afterOpen", showGuidesAndFrame, false); 3 | -------------------------------------------------------------------------------- /export/export_png.js: -------------------------------------------------------------------------------- 1 | /** 2 | * export PNG 3 | * @param {Object} target Selected Object to export PNG 4 | * @param {Object} file Export File Destination 5 | * 6 | * @returns {Boolean} true if success to export 7 | * 8 | * export 72ppi transparent png no options exist 9 | * 10 | * @example var sel = app.selection[0]; 11 | * var file = new File("~/Desktop/pudding.png"); 12 | * var feedback = exportPNG(sel, file); 13 | * alert(feedback);//boolean 14 | */ 15 | function export_png (target, file) { 16 | if(target.allGraphics.length === 1){ 17 | var graphic_obj = target.allGraphics[0]; 18 | switch(graphic_obj.constructor.name){ 19 | case "PICT" : 20 | case "EPS" : 21 | case "WMF" : 22 | case "PDF" : 23 | case "Image" ://PSD/TIFF/JPEG/BMP 24 | case "ImportedPage" ://INDD 25 | try{ 26 | target.exportFile(ExportFormat.PNG_FORMAT, file ); 27 | return true; 28 | }catch(e){ 29 | return false; 30 | } 31 | break; 32 | default : return false; 33 | } 34 | } 35 | else{ 36 | switch(target.constructor.name){ 37 | case "Polygon" : 38 | case "Rectangle" : 39 | case "Oval" : 40 | case "Group" : 41 | case "GraphicLine" : 42 | case "TextFrame" : 43 | try{ 44 | target.exportFile( ExportFormat.PNG_FORMAT, file ); 45 | return true; 46 | } 47 | catch(e){ 48 | return false; 49 | } 50 | break; 51 | default : return false; 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /export/inx_export_convert_to_indd.js: -------------------------------------------------------------------------------- 1 | /** 2 | * export inx, import inx, create clean indd 3 | * to cleanup infected infomation 4 | */ 5 | function inx_export_conv_to_indd () { 6 | //select folder (include infected indd document) 7 | var src_folder = Folder.selectDialog("Select folder to clean up"); 8 | if (src_folder == null) {return}; 9 | //folder path 10 | var indd_folder_path = src_folder.fsName; 11 | 12 | //get indd filelist 13 | var indd_file_list = File(indd_folder_path).getFiles( 14 | function (file){ return /^[^\.]+\.indd$/i.test(file.name);} 15 | ); 16 | //open indd in hidden mode 17 | for (var i=0, iL=indd_file_list.length; i < iL ; i++) { 18 | var doc_obj_src = app.open(indd_file_list[i], false); 19 | //export inx 20 | var inxPath = indd_folder_path + "/" + doc_obj_src.name.replace(/\.indd$/,".inx"); 21 | doc_obj_src.exportFile( ExportFormat.INDESIGN_INTERCHANGE, File(inxPath) ); 22 | //backup original to backup folder 23 | Folder(indd_folder_path + "/backup/").create(); 24 | doc_obj_src.save( File (indd_folder_path + "/backup/" + doc_obj_src.name.replace(/\.indd$/,"_backup.indd") ) ); 25 | doc_obj_src.close(SaveOptions.NO); 26 | }; 27 | 28 | //get inx filelist 29 | var inx_file_list = File(indd_folder_path).getFiles( 30 | function (file){ return /^[^\.]+\.inx$/i.test(file.name);} 31 | ); 32 | //open inx in hidden mode 33 | for (var ii=0, iiL=inx_file_list.length; ii < iiL ; ii++) { 34 | var doc_obj = app.open(inx_file_list[ii], false); 35 | var indd_path = indd_folder_path + "/" + inx_file_list[ii].name.replace(/\.inx$/,".indd"); 36 | doc_obj.save( File(indd_path) ); 37 | if(doc_obj){ 38 | alert("\"" + doc_obj.name + "\": " + "conversion has succeeded.") 39 | } 40 | app.scriptPreferences.userInteractionLevel = UserInteractionLevels.INTERACT_WITH_ALERTS; 41 | doc_obj.windows.add(); 42 | app.scriptPreferences.userInteractionLevel = UserInteractionLevels.INTERACT_WITH_ALL; 43 | // doc_obj.close(SaveOptions.NO); 44 | }; 45 | } 46 | -------------------------------------------------------------------------------- /export/jpeg_export.js: -------------------------------------------------------------------------------- 1 | var doc = app.documents[0]; 2 | var sel = doc.selection[0]; 3 | exportJepgSelection (sel); 4 | 5 | function exportJepgSelection (target) { 6 | with(app.jpegExportPreferences){ 7 | jpegExportRange = ExportRangeOrAllPages.EXPORT_RANGE; 8 | jpegQuality = JPEGOptionsQuality.MAXIMUM; 9 | jpegRenderingStyle = JPEGOptionsFormat.BASELINE_ENCODING; 10 | resolution = 150; 11 | exportingSpread = false; 12 | } 13 | imgFolder = new Folder("~/Desktop/" + new Date().getTime()); 14 | imgFolder.create(); 15 | if(imgFolder){ 16 | fileObj = new File (imgFolder + "/a" + ".jpg");//なにかprefixがないとdot fileの .jpgが生成されてしまう 17 | if(fileObj){ 18 | target.exportFile(ExportFormat.JPG, fileObj, false); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /export/jpeg_export_per_pageItem.js: -------------------------------------------------------------------------------- 1 | var doc = app.documents[0]; 2 | var page = doc.pages; 3 | 4 | with(app.jpegExportPreferences){ 5 | 6 | jpegExportRange = ExportRangeOrAllPages.EXPORT_ALL; 7 | jpegQuality = JPEGOptionsQuality.MAXIMUM; 8 | jpegRenderingStyle = JPEGOptionsFormat.BASELINE_ENCODING; 9 | resolution = 200; 10 | //jpegExportRangeがALLでないと無視される 11 | exportingSpread = true; 12 | pageString = "188"; 13 | } 14 | 15 | var imgFolder = Folder.selectDialog("choose target folder"); 16 | if(!imgFolder){ 17 | exit(); 18 | } 19 | //var imgFolder_fs=new File(imgFolder).fsName; 20 | for(var i=0; i < page.length; i++){ 21 | var fileObj = new File (imgFolder + "/" + page[i].pageItems[0].graphics[0].itemLink.name + ".jpg"); 22 | 23 | // $.writeln(fileObj) 24 | if(fileObj){ 25 | page[i].pageItems[0].exportFile(ExportFormat.JPG, fileObj, false); 26 | } 27 | /* try{ 28 | page[i].exportFile(ExportFormat.JPG, fileObj, false); 29 | } 30 | catch(e){$.writeln("alone");}*/ 31 | //doc.exportFile(ExportFormat.JPG, fileObj, false) 32 | } 33 | -------------------------------------------------------------------------------- /export/package_and_pdf.js: -------------------------------------------------------------------------------- 1 | /** 2 | * export pdf and package indd 3 | * 4 | * Run for saved and validated document(s) 5 | * choose folder to save pdf and packaged items 6 | * pdf is contain package folder (named with document name) 7 | * 8 | * Created by mg on 2010-09-29. 9 | */ 10 | (function () { 11 | if(app.documents.length === 0){ 12 | exit(); 13 | } 14 | var docObj = app.documents;//has many 15 | //set folder distination, creat folder for each documents 16 | dirFolder = Folder.selectDialog ( "choose folder for saving package folder" ); 17 | if(dirFolder === null){ 18 | exit(); //cancel process 19 | } 20 | else{ //dirFolder is choosen 21 | for (var i= docObj.length - 1; i >= 0; i--) { //loop 22 | var pdfExPreset = undefined;//app.pdfExportPresets.item("MagazineAds_1v3(Ads)"); 23 | dir = new File( dirFolder + "/" + decodeURI(docObj[i].name) + "/" ); 24 | flg_dir = new Folder (dir).create(); 25 | if ( flg_dir === true){ 26 | exportPDF ( dir, docObj[i], pdfExPreset ); 27 | createPackage ( dir, docObj[i] ); 28 | }//if 29 | 30 | //to close document without saving use below 31 | //docObj[i].close(SaveOptions.NO); 32 | 33 | }//for doc 34 | }//else 35 | })(); 36 | 37 | /** 38 | * export pdf 39 | * 40 | * @param {Object} dir Folder to Export 41 | * @param {Document} doc Document 42 | * @param {Object} pdfExPreset PDF Export Preset 43 | */ 44 | function exportPDF( dir, doc, pdfExPreset ){ 45 | var pdfName = File ( dir + "/" + doc.name.replace(/(\.indd$|\$)/,".pdf") ); 46 | var showingOptions = false; 47 | var pdfExportPreset = pdfExPreset; 48 | var withGrids = false 49 | var versionComments = ""; 50 | var forceSave = false; 51 | 52 | doc.exportFile ( 53 | ExportFormat.PDF_TYPE, 54 | pdfName, 55 | showingOptions, 56 | pdfExportPreset, 57 | withGrids, 58 | versionComments, 59 | forceSave 60 | ); 61 | } 62 | /** 63 | * create package 64 | * 65 | * @param {Object} dir Folder to Export 66 | * @param {Document} doc Document 67 | */ 68 | function createPackage( dir, doc ){ 69 | var to = dir; 70 | 71 | var copyingFonts = true; 72 | var copyingLinkedGraphics = true; 73 | var copyingProfiles = true; 74 | var updatingGraphics = true; 75 | var includingHiddenLayers = false; 76 | var ignorePreflightErrors = true; 77 | var creatingReport = true; 78 | var versionComments = ""; 79 | var forceSave = false; 80 | 81 | app.activeDocument.packageForPrint ( 82 | to, 83 | copyingFonts, 84 | copyingLinkedGraphics, 85 | copyingProfiles, 86 | updatingGraphics, 87 | includingHiddenLayers, 88 | ignorePreflightErrors, 89 | creatingReport, 90 | versionComments, 91 | forceSave 92 | ); 93 | } -------------------------------------------------------------------------------- /export/pdf_export_each.jsx: -------------------------------------------------------------------------------- 1 | /* 2 | ここからここまでバラPDF書き出し 3 | "export PDFs with my range" 4 | 使い方: 5 | PDF名にしたい内容が書いてあるテキストフレームにスクリプトラベルをいれておきます。 6 | 次のスクリプトラベルが発生するまでの範囲でPDF書き出していきます。 7 | PDF書出しプリセット「Sample」を使用しますので適当に変更してください。 8 | milligramme 9 | www.milligramme.cc 10 | */ 11 | 12 | var export_each_pdf_with_range = function (doc) { 13 | var doc = doc; 14 | var page = doc.pages; 15 | 16 | var pdf_preset = app.pdfExportPresets.item(PDF_PRESET); 17 | if (!check_named_item(pdf_preset)) { 18 | alert("PDFプリセット \'" + PDF_PRESET + "\' がありません"); 19 | return 20 | } 21 | 22 | var start_pages = []; 23 | var pdf_names = []; 24 | 25 | // スクリプトラベルから情報をぬく 26 | for (var pi=0, piL=page.length; pi < piL ; pi++) { 27 | var tf = page[pi].textFrames; 28 | for (var ti=0, tiL=tf.length; ti < tiL ; ti++) { 29 | // itemByName(LABEL)は使えなくなった 30 | if (tf[ti].label === LABEL) { 31 | // ラベルの文字列無い場合ページ名にする 32 | var cont = tf[ti].contents == "" ? "page"+page[pi].name : tf[ti].contents; 33 | pdf_names.push(cont.replace(/\:/g,"_")+".pdf"); 34 | start_pages.push(pi + 1); 35 | } 36 | else { 37 | continue; 38 | } 39 | }; 40 | }; 41 | // スクリプトラベルがない場合は1をいれる 42 | if (start_pages.length == 0) { 43 | start_pages.push(1); 44 | } 45 | 46 | var page_range = get_page_range(start_pages, page.length); 47 | export_pdf(doc, page_range, pdf_names, pdf_preset); 48 | } 49 | 50 | var export_pdf = function (doc, page_range /*Array*/, pdf_names /*Array*/, pdf_preset) { 51 | var dest = Folder.selectDialog("書き出すフォルダを選択"); 52 | if (dest !== null) { 53 | for (var pri=0, priL=page_range.length; pri < priL ; pri++) { 54 | app.pdfExportPreferences.pageRange = page_range[pri]; 55 | var pdf_file = new File(dest + "/" + pdf_names[pri]); 56 | doc.exportFile(ExportFormat.pdfType, pdf_file, false, pdf_preset); 57 | }; 58 | } 59 | else { 60 | alert("書き出し先を指定してません"); 61 | } 62 | } 63 | 64 | var get_page_range = function (ary, lastpage) { 65 | var ret = []; 66 | // ページ範囲に + をつけて絶対ページで指定 67 | for (var i=0, iL=ary.length-1; i < iL ; i++) { 68 | ret.push("+" + ary[i] + "-+"+(ary[i+1]-1)) 69 | }; 70 | ret.push("+" + ary[ary.length-1] + "-+" + lastpage); 71 | return ret; 72 | } 73 | 74 | var check_named_item = function (obj) { 75 | var ret = true 76 | try { 77 | obj.name; 78 | } 79 | catch(e){ 80 | return false 81 | } 82 | return ret 83 | } 84 | 85 | 86 | // run 87 | if (new File($.fileName).name==$.stack.replace(/[\[\]\n]/g,"")) { 88 | var PDF_PRESET = "Sample"; 89 | var LABEL = "Kokokara"; 90 | 91 | app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll; 92 | if (app.documents.length === 0) { 93 | alert("ドキュメントをひらいてください"); 94 | exit(); 95 | } 96 | else { 97 | export_each_pdf_with_range(app.documents[0]); 98 | alert("終了"); 99 | } 100 | } 101 | 102 | -------------------------------------------------------------------------------- /export/svg_export.js: -------------------------------------------------------------------------------- 1 | //InDesignからSVG書き出しいろいろメモ、CS4では非サポート 2 | 3 | var doc=app.documents[0]; 4 | var sel=app.selection; 5 | with(app.svgExportPreferences){ 6 | pageRange=PageRange.ALL_PAGES;//選択範囲での書き出しの場合無視 7 | //PageRange.ALL_PAGES もしくは "1-9, 12, 16-18" 形式でページ指定 8 | 9 | readersSpreads=false;//見開き 10 | 11 | fontSubsetting=FontSubsetting.SUBSET_GLYPHS;//フォントの埋め込み 12 | //FontSubsetting.NONE なし(システムフォントを使用) 13 | //FontSubsetting.SUBSET_GLYPHS 使用される文字のみ 14 | //FontSubsetting.SUBSET_ENGLISH 英数字 15 | //FontSubsetting.SUBSET_GLYPHS_AND_ENGLISH 英数字や使用される文字 16 | //FontSubsetting.SUBSET_GLYPHS_AND_ROMAN 英数字と欧文特殊文字 17 | //FontSubsetting.SUBSET_ENGLISH 英数字、欧文特殊文字と使用される文字 18 | //FontSubsetting.SUBSET_ENTIRE すべての文字 19 | 20 | appliedFlattenerPreset=app.flattenerPresets.itemByID(129);//透明の分割統合プリセット 21 | //name: [低解像度],[中解像度],[高解像度] 22 | //id: 128,129,130 23 | 24 | ignoreSpreadOverride=true;//スプレッドのオーバーライドを無視 25 | 26 | embedImages=true;//画像埋め込み 27 | 28 | renderingStyle=RenderingStyle.PROGRESSIVE; //レンダリングモード? 29 | //RenderingStyle.BATCH; Renders the SVG in batch mode. 30 | //RenderingStyle.PROGRESSIVE; Renders the SVG progressively. 31 | 32 | 33 | styleFormat=StyleFormat.PRESENTATION_ATTRIBUTES; //CSSプロパティ 34 | //StyleFormat.PRESENTATION_ATTRIBUTES プレゼンテーション属性 35 | //StyleFormat.CSS スタイル要素 36 | //StyleFormat.INLINE スタイル属性ファイルサイズ小さく 37 | //StyleFormat.ENTITY スタイル属性(構成要素参照) 38 | 39 | realPrecision=3;//小数点割り付け 40 | // 1-7 大きいほど、画質がよくなり、ファイルサイズが大きくなる 41 | 42 | fileEncoding=FileEncoding.UTF8;//エンコーディング 43 | //FileEncoding.ASCII 44 | //FileEncoding.UTF8 45 | //FileEncoding.UTF16 46 | } 47 | 48 | var imgFolder=Folder.selectDialog("choose target folder"); 49 | if(imgFolder){ 50 | //doc_export_svg (doc); //ドキュメントページ単位 51 | if(sel.length !=0){ 52 | //sel_export_svg (sel, doc); //選択オブジェクト全体 53 | each_sel_export_svg (sel,doc); //選択オブジェクトおのおの 54 | } 55 | } 56 | 57 | //fn 58 | function doc_export_svg (doc){ 59 | //ドキュメント書き出し 60 | fileObj=new File (imgFolder+"/"+doc.name+".svg"); 61 | if(fileObj) 62 | doc.exportFile(ExportFormat.SVG, fileObj, false); 63 | } 64 | 65 | function sel_export_svg (sel, doc){ 66 | //選択範囲を書き出し 67 | //選択数 2つ以上の場合は一度複製してグループ化してから書き出し。この処理でよいのか? 68 | if(sel.length>1){ 69 | var s=[]; 70 | for(var i=0; i < sel.length; i++) {s.push(sel[i].duplicate());} 71 | var g=sel[0].parent.groups.add(s); 72 | fileObj=new File (imgFolder+"/"+doc.name+new Date().getTime()+".svg"); 73 | if(fileObj){ 74 | g.exportFile(ExportFormat.SVG, fileObj, false) 75 | g.remove(); 76 | } 77 | } 78 | //選択数 1つ 79 | else if(sel.length==1){ 80 | fileObj=new File (imgFolder+"/"+doc.name+new Date().getTime()+".svg"); 81 | if(fileObj) 82 | sel[0].exportFile(ExportFormat.SVG, fileObj, false) 83 | } 84 | } 85 | 86 | function each_sel_export_svg (sel, doc){ 87 | //選択範囲を個別に書き出し 88 | for(var i=0; i < sel.length; i++){ 89 | fileObj=new File (imgFolder+"/"+doc.name+new Date().getTime()+".svg"); 90 | if(fileObj){ 91 | try{//不要かもJPEGだと孤立点書き出しでエラーになるので一応... 92 | sel[i].exportFile(ExportFormat.SVG, fileObj, false); 93 | }catch(e){} 94 | } 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /find_replace/find_anchored_object.js: -------------------------------------------------------------------------------- 1 | /** 2 | * find anchored object in target 3 | * 4 | * @param {Object} target_obj Document, Story, Selection 5 | * @returns {Array} Array of object, if not appeared, return Empty Array 6 | * 7 | */ 8 | function find_anchored_obj (target_obj) { 9 | var find_txt_obj = { 10 | findWhat: "\\x{fffc}" //String.fromCharCode("0xfffc") 11 | }; 12 | 13 | var match_list = find_grep(target_obj, find_txt_obj); 14 | if(match_list.length != 0){//アンカー付きオブジェクトがある CharacterObjectsを返す 15 | var anch_obj_arr = []; 16 | for (var ich = match_list.length-1; ich >= 0; ich--) { 17 | var anch_obj = match_list[ich].pageItems[0]; 18 | anch_obj_arr.push(anch_obj); 19 | } 20 | //Do something here 21 | return anch_obj_arr; 22 | } 23 | else { 24 | return []; 25 | // alert("No anchored objects"); 26 | } 27 | } 28 | 29 | function find_grep(target_obj, find_txt_obj){ 30 | app.findGrepPreferences = NothingEnum.nothing; 31 | 32 | with(app.findChangeGrepOptions){ 33 | includeFootnotes = true; 34 | includeHiddenLayers = true; 35 | includeLockedLayersForFind = true; 36 | includeLockedStoriesForFind = true; 37 | includeMasterPages = true; 38 | kanaSensitive = true; 39 | widthSensitive = true; 40 | } 41 | app.findGrepPreferences.properties = find_txt_obj; 42 | var result = target_obj.findGrep(); 43 | 44 | app.findGrepPreferences = NothingEnum.nothing; 45 | return result; 46 | } 47 | 48 | -------------------------------------------------------------------------------- /find_replace/find_and_change_template.js: -------------------------------------------------------------------------------- 1 | /** 2 | * find and change template 3 | */ 4 | var target_obj = app.documents[0]; 5 | 6 | //=================================================== 7 | var find_txt_obj = { 8 | findWhat : "find", 9 | }; 10 | 11 | var change_txt_obj = { 12 | changeTo : "change", 13 | }; 14 | // find and replace 15 | text_find_and_change((target_obj, find_txt_obj, change_txt_obj); 16 | 17 | // find and return result 18 | // text_find((target_obj, find_txt_obj); 19 | 20 | //=================================================== 21 | var find_grep_obj = { 22 | findWhat : "[A-Z]" 23 | } 24 | var change_grep_obj = { 25 | changeTo : "0", 26 | pointSize : 36 27 | } 28 | // find and replace 29 | // grep_find_and_change(target_obj, find_grep_obj, change_grep_obj); 30 | 31 | // find and return result 32 | // var result_array = grep_find(target_obj, find_grep_obj); 33 | 34 | //=================================================== 35 | function text_find_and_change(target_obj, find_txt_obj, change_txt_obj){ 36 | app.findTextPreferences = NothingEnum.nothing; 37 | app.changeTextPreferences = NothingEnum.nothing; 38 | 39 | with(app.findChangeTextOptions){ 40 | caseSensitive = false; 41 | includeFootnotes = false; 42 | includeHiddenLayers = false; 43 | includeLockedLayersForFind = false; 44 | includeLockedStoriesForFind = false; 45 | includeMasterPages = false; 46 | kanaSensitive = true; 47 | wholeWord = false; 48 | widthSensitive = true; 49 | } 50 | app.findTextPreferences.properties = find_txt_obj; 51 | app.changeTextPreferences.properties = change_txt_obj; 52 | target_obj.changeText(); 53 | 54 | app.findTextPreferences = NothingEnum.nothing; 55 | app.changeTextPreferences = NothingEnum.nothing; 56 | } 57 | 58 | function text_find(target_obj, find_txt_obj){ 59 | app.findTextPreferences = NothingEnum.nothing; 60 | 61 | with(app.findChangeTextOptions){ 62 | caseSensitive = false; 63 | includeFootnotes = false; 64 | includeHiddenLayers = false; 65 | includeLockedLayersForFind = false; 66 | includeLockedStoriesForFind = false; 67 | includeMasterPages = false; 68 | kanaSensitive = true; 69 | wholeWord = false; 70 | widthSensitive = true; 71 | } 72 | app.findTextPreferences.properties = find_txt_obj; 73 | var result = target_obj.findText(); 74 | 75 | app.findTextPreferences = NothingEnum.nothing; 76 | return result; 77 | } 78 | 79 | function grep_find_and_change(target_obj, find_grep_obj, change_grep_obj){ 80 | app.findGrepPreferences = NothingEnum.nothing; 81 | app.changeGrepPreferences = NothingEnum.nothing; 82 | 83 | with(app.findChangeGrepOptions){ 84 | includeFootnotes = false; 85 | includeHiddenLayers = false; 86 | includeLockedLayersForFind = false; 87 | includeLockedStoriesForFind = false; 88 | includeMasterPages = false; 89 | kanaSensitive = true; 90 | widthSensitive = true; 91 | } 92 | app.findGrepPreferences.properties = find_grep_obj; 93 | app.changeGrepPreferences.properties = change_grep_obj; 94 | target_obj.changeGrep(); 95 | 96 | app.findGrepPreferences = NothingEnum.nothing; 97 | app.changeGrepPreferences = NothingEnum.nothing; 98 | } 99 | 100 | function grep_find(target_obj, find_grep_obj){ 101 | app.findGrepPreferences = NothingEnum.nothing; 102 | 103 | with(app.findChangeGrepOptions){ 104 | includeFootnotes = false; 105 | includeHiddenLayers = false; 106 | includeLockedLayersForFind = false; 107 | includeLockedStoriesForFind = false; 108 | includeMasterPages = false; 109 | kanaSensitive = true; 110 | widthSensitive = true; 111 | } 112 | app.findGrepPreferences.properties = find_grep_obj; 113 | var result = target_obj.findGrep(); 114 | 115 | app.findGrepPreferences = NothingEnum.nothing; 116 | return result; 117 | } 118 | /* 119 | with(app.findChangeGlyphOptions){ 120 | caseSensitive = true; 121 | includeFootnotes = false; 122 | includeHiddenLayers = false; 123 | includeLockedLayersForFind = false; 124 | includeLockedStoriesForFind = false; 125 | includeMasterPages = false; 126 | } 127 | 128 | with(app.findChangeTransliterateOptions){ 129 | caseSensitive = true; 130 | includeFootnotes = false; 131 | includeHiddenLayers = false; 132 | includeLockedLayersForFind = false; 133 | includeLockedStoriesForFind = false; 134 | includeMasterPages = false; 135 | kanaSensitive = true; 136 | wholeWord = false; 137 | widthSensitive = true; 138 | } 139 | */ 140 | -------------------------------------------------------------------------------- /find_replace/result_with_zoom.js: -------------------------------------------------------------------------------- 1 | var doc = app.documents[0]; 2 | app.findTextPreferences = null; 3 | var zoom = app.activeWindow.zoomPercentage; 4 | 5 | app.findTextPreferences.findWhat = "anytext"; 6 | //found collection 7 | var result = app.findText(); 8 | 9 | for (var i=0; i < result.length; i++) { 10 | result[i].select(); 11 | app.activeWindow.zoomPercentage = 400; 12 | alert(app.findTextPreferences.findWhat + " was found " + (i+1) + "/" + result.length); 13 | }; 14 | app.activeWindow.zoomPercentage = zoom; -------------------------------------------------------------------------------- /fonts/composit_font_template.js: -------------------------------------------------------------------------------- 1 | var doc = app.documents[0]; 2 | //合成フォントを追加する 3 | var cFont = doc.compositeFonts.add(); 4 | //なまえはつけないと「合成フォント1...」と連番が付いていく 5 | cFont.name = ""+new Date().getTime(); 6 | 7 | //合成フォントの要素を追加、デフォルトで0〜5が自動作成済み? 8 | var cFontEnt = cFont.compositeFontEntries; 9 | //合成フォントの要素 10 | //==> 0.漢字 ,1.かな ,2.全角約物 ,3.全角記号 ,4.半角欧文 ,5.半角数字 11 | 12 | //各要素の設定変更 13 | //漢字 14 | with(cFontEnt[0]){ 15 | appliedFont = "A-OTF UD新ゴNT Pro"; //ネイティブなフォント名(和名)、ポストスクリプト名だとダメ 16 | fontStyle = "L"; //スタイル 17 | relativeSize = 100; //サイズ(漢字・全角約物・全角記号に対しての相対サイズ) 18 | baselineShift = 5; //ベースラインシフト 19 | verticalScale = 100; //垂直比率:1から1000まで 20 | horizontalScale = 100; //水平比率:1から1000まで 21 | } 22 | 23 | //かな 24 | with(cFontEnt[1]){ 25 | appliedFont = "A-OTF 武蔵野草かな Std"; 26 | fontStyle = "Regular"; 27 | relativeSize = 120; 28 | baselineShift = 0; 29 | verticalScale = 100; 30 | horizontalScale = 50; 31 | //デフォルト6要素の中では「かな」のみ有効な設定 32 | //trueで文字の中心点から変倍し文字の幅を保持。 33 | scaleOption = true; //ベースラインシフトがゼロ以外だとTrueにしても無効になる 34 | } 35 | 36 | //全確約物--2 37 | //設定を省略するとデフォルトの小塚明朝なりTimesになるので同じなら継承します 38 | 39 | cFontEnt[2].properties = cFontEnt[0].properties; 40 | 41 | //全角記号--3 42 | //継承してオーバーライドみたいな 43 | 44 | cFontEnt[3].properties = cFontEnt[0].properties; 45 | cFontEnt[3].fontStyle = "B" 46 | cFontEnt[3].verticalScale = 150; 47 | 48 | 49 | //半角欧文--4 50 | //デフォルトまま 51 | 52 | //半角数字 53 | with(cFontEnt[5]){ 54 | appliedFont = "Century Old Style Std"; 55 | fontStyle = "Italic"; 56 | relativeSize = 125; 57 | baselineShift = 0; 58 | verticalScale = 50; 59 | horizontalScale = 75; 60 | } 61 | 62 | //特例文字とかあらたに要素を追加したい。 63 | var myEnt = cFont.compositeFontEntries.add(); 64 | with(myEnt){ 65 | appliedFont = "A-OTF 新ゴ Pro"; 66 | fontStyle = "L"; 67 | relativeSize = 100; 68 | baselineShift = 0; 69 | verticalScale = 100; 70 | horizontalScale = 50; 71 | scaleOption = true; //trueで文字の中心点から変倍し文字の幅を保持。ベースラインシフトがゼロ以外だとTrueにしても無効になる 72 | 73 | //特例文字を入れておく 74 | customCharacters = "イタリアに合成"; 75 | } 76 | -------------------------------------------------------------------------------- /fonts/create_fonts_sample.js: -------------------------------------------------------------------------------- 1 | /** 2 | * create font sample 3 | */ 4 | 5 | //fonts par documents 6 | var font_par_doc = 30; 7 | //amount of documents 8 | var doc_amount = 1; 9 | //language 10 | var lang = 1;//0:Roman, 1:Japanese.... 11 | //sample text 12 | var con = {//add writingscript and text 13 | 0: "Lorem ipsum dolor sit amet, consectetur adipisicing elit.", 14 | 1: "具ヌー寺の和尚がカボスを嫉む、琵と取れんと見上げるアキの空。" 15 | }; 16 | 17 | var sum_font = app.fonts.length; 18 | var i = 0; 19 | for (var j=0; j < doc_amount ; j++) { 20 | var doc = app.documents.add(); 21 | var tf = doc.textFrames.add(); 22 | var doc_info = getDocInfo(doc); 23 | tf.geometricBounds = [ 24 | doc_info['maT'], 25 | doc_info['maL'], 26 | doc_info['H']-doc_info['maB'], 27 | doc_info['W']-doc_info['maR'] 28 | ]; 29 | var st = tf.parentStory; 30 | with(st){ 31 | pointSize = "12pt"; 32 | leading = "18pt"; 33 | } 34 | var t = 0; 35 | while( t < font_par_doc) { 36 | if (j * font_par_doc + i >= sum_font) { 37 | exit(); 38 | }; 39 | if (app.fonts[i].writingScript == lang) { 40 | st.insertionPoints[-1].contents = con[lang] + "\r"; 41 | st.paragraphs[t].appliedFont = app.fonts[ j * font_par_doc + i ]; 42 | i++; 43 | t++; 44 | }; 45 | else{ 46 | i++; 47 | } 48 | }; 49 | }; 50 | 51 | function getDocInfo (doc) { 52 | var inf = {}; 53 | inf['H'] = doc.documentPreferences.pageHeight; 54 | inf['W'] = doc.documentPreferences.pageWidth; 55 | inf['maL'] = doc.marginPreferences.left; 56 | inf['maT'] = doc.marginPreferences.top; 57 | inf['maR'] = doc.marginPreferences.right; 58 | inf['maB'] = doc.marginPreferences.bottom; 59 | return inf; 60 | } -------------------------------------------------------------------------------- /fonts/fetch_fonts.js: -------------------------------------------------------------------------------- 1 | /** 2 | * fetching fonts 3 | * 4 | * 2010-11-10 mg 5 | * 6 | * target indesign cs3, cs4 7 | */ 8 | 9 | //****************************************************** 10 | // set mode 11 | // doc_select_mode = 0;//select folder and extract document(s) mode 12 | // doc_select_mode = 1;//opened document(s) mode 13 | // 14 | // save_dir_mode = 2; //create folder same as document 15 | // save_dir_mode = 4; //create each folders on desktop 16 | 17 | var doc_select_mode = 1;// 0, 1 18 | var save_dir_mode = 4;// 2, 4 19 | 20 | //****************************************************** 21 | switch(doc_select_mode){ 22 | case 0: sel_folder_mode (); break; 23 | case 1: opened_doc_mode (); break; 24 | default: ; break; 25 | } 26 | 27 | //select folder and extract document(s) mode --0 28 | function sel_folder_mode () { 29 | var doc_folder = Folder.selectDialog("Select folder to fetch fonts"); 30 | if (doc_folder === null) { 31 | return 32 | } 33 | var fol_path = new File(doc_folder).fsName; 34 | var indd_list = File(fol_path).getFiles( 35 | function (file){ return /^[^\.]+\.indd$/i.test(file.name);} 36 | ); 37 | for (var i=0, iL=indd_list.length; i < iL ; i++) { 38 | var doc = app.open(indd_list[i], true); 39 | fetch_font (doc, save_dir_mode); 40 | doc.close(); 41 | }; 42 | }; 43 | 44 | //opened document(s) mode --1 45 | function opened_doc_mode () { 46 | if(app.documents.length === 0){ 47 | alert("nothing opened"); 48 | return 49 | } 50 | var docs = app.documents; 51 | //remember document path 52 | var doc_list = []; 53 | 54 | var can = 0; 55 | while (docs.length > 0) { 56 | var a_doc = app.activeDocument; 57 | if(a_doc.saved === false){ 58 | alert("not yet saved"); 59 | var sv_path = File.saveDialog('choose to save'); 60 | if(sv_path !== null){ 61 | if(sv_path.toString().match('\.indd$') ){ 62 | a_doc.save(new File(sv_path)); 63 | } 64 | else{ 65 | a_doc.save(new File(sv_path+".indd")); 66 | } 67 | } 68 | else{ 69 | return 70 | // can++; 71 | // continue; 72 | } 73 | } 74 | //modified? 75 | if(docs.everyItem().modified.toString().indexOf('true') !== -1){ 76 | alert('please save modified document(s)'); 77 | return 78 | } 79 | doc_list.push(a_doc.fullName); 80 | 81 | fetch_font (a_doc, save_dir_mode); 82 | a_doc.close(); 83 | }; 84 | // if (can > 0) { 85 | // var s = can === 1 ? " is" : "s are"; 86 | // alert(can+"document" + s + " canceled"); 87 | // }; 88 | //re-open 89 | for (var dl=0, dlL=doc_list.length; dl < dlL ; dl++) { 90 | app.open(File(doc_list[dl]), true); 91 | }; 92 | } 93 | 94 | /** 95 | * create folder for fetching fonts 96 | * 97 | * @param {Document} doc Document 98 | */ 99 | function fetch_font (doc, save_dir_mode) { 100 | if (save_dir_mode === 2) { 101 | //fetch to the folder as same as document's directory 102 | var path = doc.filePath+"/F_"+doc.name.toString().replace(/\.indd$/,""); 103 | }; 104 | // else if (save_dir_mode === 3) { 105 | // //fetch to single folder on desktop 106 | // var path = "~/Desktop/"+"F_"; 107 | // }; 108 | else if (save_dir_mode === 4) { 109 | //fetch to each folders on desktop 110 | var d = "_" + new Date().getTime().toString(16).slice(11-4,11); 111 | var path = "~/Desktop/"+"F_"+doc.name.toString().replace(/\.indd$/,"") + d; 112 | }; 113 | var fol_path = new File(path); 114 | var fol = new Folder(fol_path).create(); 115 | if (fol) { 116 | createPackage( fol_path, doc ); 117 | File(path + "/" + doc.name).remove(); 118 | }; 119 | } 120 | 121 | /** 122 | * create package 123 | * 124 | * @param {Object} dir Folder to Export 125 | * @param {Document} doc Document 126 | */ 127 | function createPackage( dir, doc ){ 128 | var to = dir; 129 | 130 | var copyingFonts = true; 131 | var copyingLinkedGraphics = false; 132 | var copyingProfiles = false; 133 | var updatingGraphics = false; 134 | var includingHiddenLayers = false; 135 | var ignorePreflightErrors = true; //cs4 136 | var creatingReport = false; 137 | var versionComments = ""; 138 | var forceSave = false; 139 | switch(app.version.split('.')[0]){ 140 | case "6": 141 | app.activeDocument.packageForPrint ( 142 | to, 143 | copyingFonts, 144 | copyingLinkedGraphics, 145 | copyingProfiles, 146 | updatingGraphics, 147 | includingHiddenLayers, 148 | ignorePreflightErrors, 149 | creatingReport, 150 | versionComments, 151 | forceSave 152 | ); 153 | break; 154 | case "5": 155 | app.activeDocument.packageForPrint ( 156 | to, 157 | copyingFonts, 158 | copyingLinkedGraphics, 159 | copyingProfiles, 160 | updatingGraphics, 161 | includingHiddenLayers, 162 | creatingReport, 163 | versionComments, 164 | forceSave 165 | ); 166 | break; 167 | default: ; break; 168 | } 169 | } -------------------------------------------------------------------------------- /functions/array_de.js: -------------------------------------------------------------------------------- 1 | function sort_and_del_dup (array) { 2 | array.sort(function(a, b){return a > b}); 3 | for (var i = array.length - 1; i >= 1; i--){ 4 | if (array[i] == array[i-1]) { 5 | // $.writeln(i); 6 | array.splice(i,1); 7 | }; 8 | }; 9 | return array 10 | } 11 | 12 | var arr = [11,11,33,12,11,33,14,15,16]; 13 | $.writeln(sort_and_del_dup(arr)) -------------------------------------------------------------------------------- /functions/shuffle_test.js: -------------------------------------------------------------------------------- 1 | /** 2 | * shuffle 3 | */ 4 | function shuffle(list) { 5 | var i = list.length; 6 | while (--i) { 7 | var j = Math.floor (Math.random() * (i + 1)); 8 | if (i === j) continue; 9 | var k = list[i]; 10 | list[i] = list[j]; 11 | list[j] = k; 12 | } 13 | return list; 14 | } -------------------------------------------------------------------------------- /glitch/charcode_shift.js: -------------------------------------------------------------------------------- 1 | //選択部分の文字コードをずらす。(改行は除く) 2 | 3 | //パラメーター:文字コードのずらし量を設定 4 | var n= 1; 5 | 6 | if(app.documents.length > 0 && app.selection.length > 0){ 7 | main(n); 8 | } 9 | 10 | function main (n){ 11 | var selObj=app.selection[0]; 12 | switch(selObj.constructor.name){ 13 | case "Character": 14 | case "Word": 15 | case "TextStyleRange": 16 | case "Line": 17 | case "Text": 18 | case "Paragraph": 19 | case "TextColumn": shiftCharCode (selObj, n); break; 20 | case "Table": 21 | case "Cell": shiftEachTable (selObj, n); break; 22 | } 23 | } 24 | 25 | function shiftCharCode (selObj, n){ 26 | var convArr=new Array(); 27 | for(var i=0, L=selObj.contents.length; i < L; i++){ 28 | //改行は除外 29 | if(selObj.contents.charCodeAt (i)!=13){ 30 | var charConv=(selObj.contents.charCodeAt (i)+n).toString(16); 31 | var convChar=String.fromCharCode(parseInt("0x"+charConv)); 32 | //$.writeln(convChar); 33 | convArr.push(convChar); 34 | } 35 | else{convArr.push(selObj.contents.charAt(i));} 36 | } 37 | selObj.contents=convArr.toString().replace(/\,/g,""); 38 | } 39 | 40 | 41 | function shiftEachTable(selObj, n){ 42 | var cellObj=selObj.cells; 43 | for(var ii=0, LL=cellObj.length; ii < LL; ii++){ 44 | shiftCharCode (cellObj[ii].texts[0], n); 45 | } 46 | } -------------------------------------------------------------------------------- /glitch/charcode_shift_palette.js: -------------------------------------------------------------------------------- 1 | /** 2 | * charcode shift palette 3 | */ 4 | #targetengine "session" 5 | // documents open? 6 | if (app.documents.length === 0 || app.selection.length === 0) { 7 | exit(); 8 | }; 9 | if (app.selection.length !== 1) { 10 | exit(); 11 | }; 12 | 13 | var selObj = app.selection[0]; 14 | // text object? 15 | if (selObj.hasOwnProperty('baseline') == false) { 16 | exit(); 17 | } 18 | var selc = selObj.contents; 19 | var plt = new Window('palette', "Char. Code Shifter", undefined); 20 | plt.panel = plt.add('panel'); 21 | // add elements 22 | var slider_label = plt.panel.add('statictext',[0,0,40,22], "0") 23 | var codeshift_slider = plt.panel.add('slider',[0,0,190,22], 0, -50, 50); 24 | var content_text = plt.panel.add('statictext', [0,0,190,150], selc, {multiline: true}); 25 | // initialize 26 | var pitch = 0; 27 | var mode = 0; 28 | // add buttons with grouping 29 | plt.btn_grp = plt.add('group'); 30 | var codeshift_btn = plt.btn_grp.add('button', [0,0,69,23], "apply"); 31 | var resel_btn = plt.btn_grp.add('button', [0,0,69,23], "reselect"); 32 | var undo_btn = plt.btn_grp.add('button', [0,0,46,23], "undo"); 33 | 34 | //callbacks 35 | //slider 36 | codeshift_slider.onChanging = function () { 37 | var v = Math.round(this.value); 38 | slider_label.text = v; 39 | pitch = v; 40 | mode = 1; 41 | char_code_shift(selc); 42 | } 43 | //character code shift 44 | codeshift_btn.onClick = function () { 45 | pitch = slider_label.text * 1.0; 46 | mode = 2; 47 | char_code_shift(selc); 48 | } 49 | //get selection again 50 | resel_btn.onClick = function () { 51 | codeshift_slider.value = pitch = 0; 52 | slider_label.text = 0; 53 | if (app.selection[0].hasOwnProperty('baseline')) { 54 | selc = app.selection[0].contents; 55 | }; 56 | mode = 1; 57 | char_code_shift(selc); 58 | } 59 | //undo 60 | undo_btn.onClick = function () { 61 | app.documents[0].undo(); 62 | } 63 | plt.show(); 64 | 65 | /** 66 | * char code shift 67 | * 68 | * if text object contents shift character code with slider's value. 69 | * but dont convert to the character code from 0x00 to 0x1f. 70 | * 71 | * when re-select other than text , return alert 72 | * 73 | * @param {String} selc Selection contents 74 | */ 75 | function char_code_shift (selc) { 76 | if (app.selection[0].hasOwnProperty('baseline') && mode !== 0) { 77 | var replace_code_shift = ""; 78 | for (var si=0, siL=selc.length; si < siL ; si++) { 79 | if (selc[si].charCodeAt(0) !== 'd') { 80 | var ff = (selc[si].charCodeAt(0) + pitch) > 32 //'space' = 33 81 | ? (selc[si].charCodeAt(0) + pitch).toString(16) //convert if forward of 'space' 82 | : selc[si].charCodeAt(0).toString(16); //dont convert if behind of 'space' 83 | replace_code_shift += String.fromCharCode('0x'+ff); 84 | }else{ 85 | replace_code_shift += selc[si]; 86 | } 87 | }; 88 | if (mode === 1) { 89 | content_text.text = replace_code_shift; 90 | }; 91 | if (mode ===2) { 92 | app.selection[0].contents = replace_code_shift; 93 | }; 94 | } 95 | else{ 96 | alert('Selection Error'); 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /glitch/convert_hex_and_sift.js: -------------------------------------------------------------------------------- 1 | /** 2 | 乱数をunicodeに変換して、ふるいにかける 3 | "convert hex to character and sift" 4 | 5 | 使い方: 6 | 実行すると新規ドキュメント上にunicodeの文字の層の描画を試みます。 7 | 表示できない字形をグラフィック化でふるいにかけます。 8 | 9 | 動作確認:OS10.4.11 InDesign CS3 10 | 11 | milligramme 12 | www.milligramme.cc 13 | */ 14 | 15 | var docObj=app.documents.add(); 16 | var dH=docObj.documentPreferences.pageHeight; 17 | var dW=docObj.documentPreferences.pageWidth; 18 | 19 | for(var j=0; j < 7; j++){ 20 | var tfObj=docObj.textFrames.add({geometricBounds:[10, 10, dH-10, dW-10]}); 21 | 22 | for(var i=0; i < 500; i++){ 23 | var randomSrc=""+(Math.random()*1000000000).toString (16); 24 | var charFour=randomSrc.substr(0, 4); 25 | var japChar=String.fromCharCode (parseInt("0x"+charFour)); 26 | //$.writeln(japChar); 27 | var cnt=tfObj.parentStory; 28 | cnt.contents+=japChar; 29 | } 30 | 31 | cnt.fillTint=Math.min(30+10*(j+1), 100); 32 | cnt.pointSize=12*(j+1); 33 | tfObj.select(); 34 | tfObj.createOutlines(); 35 | } -------------------------------------------------------------------------------- /glitch/create_circling_objects_part1.js: -------------------------------------------------------------------------------- 1 | /** 2 | ぐりぐり旋回させたものをつくる 3 | "create circling objects" 4 | 5 | 使い方: 6 | 実行すると設定ダイアログがでます。大きさ、内径の比率、旋回数、分割数などを入力。 7 | 最前面のドキュメントに、ぐりぐり旋回させたものをつくります。 8 | 開いているドキュメントがなければ新規ドキュメントを勝手に作って実行します。 9 | 10 | 動作確認:OS10.4.11 InDesign CS3 11 | 12 | milligramme 13 | www.milligramme.cc 14 | */ 15 | if(app.documents.length==0){ 16 | var doc = app.documents.add(); 17 | } 18 | var doc = app.documents[0]; 19 | 20 | var dWidth = doc.documentPreferences.pageWidth; 21 | var dHeight = doc.documentPreferences.pageHeight; 22 | //ルーラーを一時的にスプレッドにする 23 | var rulerBk = doc.viewPreferences.rulerOrigin; 24 | var rulerTemp = RulerOrigin.SPREAD_ORIGIN; 25 | doc.viewPreferences.rulerOrigin = rulerTemp; 26 | 27 | var dialogObj = app.dialogs.add({name:"grigrigrigri", canCancel:true}); 28 | with(dialogObj){ 29 | with(dialogColumns.add()){ 30 | with(borderPanels.add()){ 31 | with(dialogColumns.add()){ 32 | staticTexts.add({staticLabel: "siz"}); 33 | } 34 | with(dialogColumns.add()){ 35 | var sizeField = realEditboxes.add({editValue: 45}); 36 | } 37 | with(dialogColumns.add()){ 38 | staticTexts.add({staticLabel: "inn"}); 39 | } 40 | with(dialogColumns.add()){ 41 | var minField = percentEditboxes.add({editValue: 20, minimumValue:1, maximumValue:99}); 42 | } 43 | }//min per 44 | with(borderPanels.add()){ 45 | with(dialogColumns.add()){ 46 | staticTexts.add({staticLabel: "gri"}); 47 | } 48 | with(dialogColumns.add()){ 49 | var circleField = integerEditboxes.add({editValue: 10}); 50 | } 51 | with(dialogColumns.add()){ 52 | staticTexts.add({staticLabel: "dev"}); 53 | } 54 | with(dialogColumns.add()){ 55 | var devideField = integerEditboxes.add({editValue: 17, minimumValue:3, maximumValue:360}); 56 | } 57 | }//devide 58 | with(borderPanels.add()){ 59 | with(dialogColumns.add()){ 60 | staticTexts.add({staticLabel: "amm"}); 61 | } 62 | with(dialogColumns.add()){ 63 | var valueField = integerEditboxes.add({editValue: 1}); 64 | } 65 | }//value 66 | } 67 | }//dialog 68 | 69 | if(dialogObj.show() == true){ 70 | var armMax = sizeField.editValue/2;//だいたいの半径 71 | var armMinPer = minField.editValue;//内側の比率、小さい程あばれる、大きい程外側に集まる 72 | var circlingValue = circleField.editValue;//ぐるぐる周回する数 73 | var devPiece = devideField.editValue;//360°を分割する数 74 | var creatValue = valueField.editValue;//作成する数 75 | dialogObj.destroy(); 76 | } 77 | else{ 78 | dialogObj.destroy(); 79 | exit(); 80 | } 81 | 82 | for(var j = 0; j < creatValue; j++){ 83 | var spiraArray = new Array();//座標を入れる配列 84 | var pi = 2*Math.PI/360;//角度をラジアンに変換するもの 85 | var devRadi = pi*(360/devPiece);//1回あたりの移動角度 86 | 87 | for(var i = 0; iperiodMin){ 50 | pCo.push([[startPx, startPy], 51 | [startPx, startPy], 52 | [startPx+bandH*Math.SQRT1_2, startPy-bandH*Math.SQRT1_2]]); 53 | 54 | pCo.push([[startPx+periodW/2-bandH*Math.SQRT1_2, startPy-bandH*Math.SQRT1_2], 55 | [startPx+periodW/2, startPy], 56 | [startPx+periodW/2+bandH*Math.SQRT1_2, startPy+bandH*Math.SQRT1_2]]); 57 | 58 | pCo.push([[startPx+periodW-bandH*Math.SQRT1_2, startPy+bandH*Math.SQRT1_2], 59 | [startPx+periodW, startPy], 60 | [startPx+periodW, startPy]]); 61 | 62 | startPx=startPx+periodW; 63 | periodW=periodW*(1-decayPer/100);//周期をへらす 64 | bandH=bandH*(1-decayPer/100);//帯域をへらす 65 | i++; 66 | // $.writeln("i="+i+" W="+periodW); 67 | if(i>=stepMax){break;} 68 | } 69 | waveObj=doc.rectangles.add();//四角形をつくって 70 | waveObj.paths[0].entirePath=pCo;//波形の座標と入れ替える 71 | waveObj.paths[0].pathType=PathType.OPEN_PATH;//オープンパスにする 72 | //いろとか 73 | waveObj.fillColor="None"; 74 | waveObj.strokeWeight=0.5; 75 | waveObj.strokeColor="Black"; 76 | 77 | //ルーラーを元に戻す 78 | doc.viewPreferences.rulerOrigin=rulerBk; -------------------------------------------------------------------------------- /glitch/draw_brute_lines_of_selected_path.js: -------------------------------------------------------------------------------- 1 | /** 2 | 選択オブジェクトの総当たり線を引く 3 | "draw brute lines of selected path" 4 | 5 | 使い方: 6 | パスオブジェクトを選択して実行、総当たり線の総数を確認しますのでよければ続行。 7 | 一番目のパスのアンカーを総当たりでつないだ図形を描きます。 8 | 9 | 動作確認:OS10.4.11 InDesign CS3 10 | 11 | milligramme 12 | www.milligramme.cc 13 | */ 14 | if(app.documents.length==0 && app.selection.length==0){exit();} 15 | 16 | var selObj=app.selection[0]; 17 | switch(selObj.constructor.name){ 18 | case "Polygon": 19 | case "Rectangle": 20 | case "Oval": 21 | case "TextFrame": break; 22 | default: exit(); 23 | } 24 | var selPathPointWithHandle=selObj.paths[0].pathPoints; 25 | 26 | //コントロールハンドルを無視 27 | var selPathPointArr=new Array(); 28 | for(var p=0; p < selPathPointWithHandle.length ;p++){ 29 | selPathPointArr.push(selPathPointWithHandle[p].anchor); 30 | } 31 | 32 | //総当たりの総数を表示、多くても続行する?な処理 33 | var brute=0; 34 | for(var a=1; a < selPathPointArr.length-1; a++){ 35 | brute+=selPathPointArr.length-a; 36 | } 37 | $.localize = true; 38 | var precheck = {ja: brute+"本の総当たり線を引きます、続行してもいいですか?", en: "draw brute lines of "+brute+" , ok to continue?"}; 39 | var cont = confirm(precheck); 40 | if(cont == false){ 41 | alert({ja:"中止しました。",en:"canceled"}); 42 | exit(); 43 | } 44 | 45 | var groupArr=new Array(); 46 | //総当たりな線を描く。あとでグループ化 47 | for(var i=0; i < selPathPointArr.length; i++){ 48 | for(var j=1; j < selPathPointArr.length-i; j++){ 49 | var lineObj=selObj.parent.parent.pages.itemByName (selObj.parent.name).graphicLines.add(); 50 | with(lineObj){ 51 | strokeWeight=0.1; 52 | strokeColor="Cyan"; 53 | paths[0].pathPoints[0].anchor=selPathPointArr[i]; 54 | paths[0].pathPoints[1].anchor=selPathPointArr[i+j]; 55 | } 56 | groupArr.push(lineObj); 57 | } 58 | } 59 | selObj.parent.parent.pages.itemByName(selObj.parent.name).groups.add(groupArr); -------------------------------------------------------------------------------- /glitch/exclude_overlap_path.js: -------------------------------------------------------------------------------- 1 | doc = app.documents[0]; 2 | doc.viewPreferences.rulerOrigin = RulerOrigin.SPREAD_ORIGIN; 3 | dMin = Math.min(doc.documentPreferences.pageWidth, doc.documentPreferences.pageHeight); 4 | devid = 10; 5 | obj = doc.ovals.add({geometricBounds:[0, 0, dMin/devid, dMin/devid], fillColor:"Cyan"}); 6 | dobj = []; 7 | for(i = 0; i < 10; i++){ 8 | d = obj.duplicate(undefined, [dMin*Math.random(),dMin*Math.random()]); 9 | dobj.push(d); 10 | } 11 | cobj = obj.excludeOverlapPath (dobj); //パスファインダー中マド 12 | //addpath 13 | 14 | 15 | robj = cobj.releaseCompoundPath(); 16 | for(j = 0, L = robj.length; j < L ;j++){ 17 | try{ 18 | robj[j].move(undefined, [ 19 | -robj[j].geometricBounds[1], 20 | doc.documentPreferences.pageHeight-robj[j].geometricBounds[2] 21 | ]); 22 | }catch(e){robj[j].remove();} 23 | } 24 | robj1 = robj.shift(); 25 | erobj = robj1.excludeOverlapPath (robj);//パスファインダー中マド 26 | //erobj = robj1.addPath (robj);//パスファインダー追加 27 | -------------------------------------------------------------------------------- /glitch/fill_glyph_pattern_to_frame.js: -------------------------------------------------------------------------------- 1 | /** 飾り字形からパターンをつくる "fill pattern to the frame" 使い方と注意: テキストフレームまたはグラフィックフレームを1つ選択して実行。 フレーム内を消去して飾り字形のパターンで埋め、最後にグラフィックス化します。 オープンパスでもクローズドパスでも大丈夫のはず。 動作確認:OS10.4.11 InDesign CS3 milligramme www.milligramme.cc */ if(app.documents.length==0 || app.selection.length!=1){ alert("select only one frame") exit(); } var selObj=app.selection[0]; switch(selObj.constructor.name){ case "TextFrame": main (selObj); break; case "Polygon": case "Rectangle": case "Oval": selObj.contentType=ContentType.TEXT_TYPE; //グラフィックフレームからテキストフレームに変換の手続き。contentType指定だけだとうまくいかない selAsTF=app.selection[0]; selAsTF.parentStory.storyPreferences.storyOrientation=StoryHorizontalOrVertical.HORIZONTAL; main(selAsTF); break; default : alert("select text frame or graphic frame"); exit(); } function main(selObj){ var storyObj=selObj.parentStory; storyObj.pointSize=9+Math.floor(Math.random()*30); //パターンの大きさを固定するならここを。 storyObj.leading=storyObj.pointSize; storyObj.justification=Justification.LEFT_ALIGN; var src; var bkFontLock=app.fontLockingPreferences.fontChangeLocking; app.fontLockingPreferences.fontChangeLocking=false; //バックアップとって一時字形保護を解除 storyObj.contents=""; //パターン字形の行列セット var patType=Math.floor(Math.random()*2); //パターンの固定をするならここを。 if(patType==0){ src=["▁","▂","▃","▄","▅","▆","▇","█","▉","▊","▋","▌","▍","▎","▏"]; //0x8230 - 0x8238 try{ storyObj.appliedFont="小塚明朝 Pro R"; }catch(e){src=["x","-","+"];} } if(patType==1){ src=["░","▒","▓"]; //0x2591 - 0x2593 try{ storyObj.appliedFont="Batang"; //Arial, Batang, Century, Letter Gothic, Gulim, Orator, ST Heiti, Times New, MS Gothic & Mincho }catch(e){src=["x","-","+"];} } app.fontLockingPreferences.fontChangeLocking=bkFontLock; //領域内に文字をランダム埋めていく while(selObj.parentStory.overflows==false){ storyObj.contents+=src[Math.floor(Math.random()*src.length)]; } storyObj.characters[-1].remove(); //最後の文字を削除 //文字が打てなかった時のためのエラー処理 try{ var patObj=selObj.createOutlines (false); }catch(e){} //[黒]がオーバープリントオンになってしまうのでオフに。 for(var i=0, L=patObj[0].pageItems.length; i < L; i++ ){ try{ patObj[0].pageItems[i].overprintFill=false; }catch(e){} try{ patObj[0].pageItems[i].overprintStroke=false; }catch(e){} } } -------------------------------------------------------------------------------- /glitch/fill_selection_with_kushu.js: -------------------------------------------------------------------------------- 1 | /** 2 | 選択オブジェクトにくしゅくしゅを埋込む 3 | "embed confused pattern to selection" 4 | 5 | 概要: 6 | 選択オブジェクトにくしゅっとします。 7 | フレーム内の入れ子のオブジェクトがある場合は削除して処理します。 8 | 画像が配置されたフレームでは処理を中止します。 9 | グループ化されたオブジェクトはダイレクト選択で選べば実行できます。 10 | 11 | 使い方: 12 | くしゅくしゅを埋め込むグラフィックフレームを選択して実行。 13 | ダイアログに希望する「なんちゃって濃度」を入力して続行。 14 | 15 | 動作確認:OS10.4.11 InDesign CS3 16 | 17 | milligramme 18 | www.milligramme.cc 19 | */ 20 | 21 | if(app.documents.length > 0&&app.selection.length==1){ 22 | var docObj=app.documents[0]; 23 | var selObj=docObj.selection[0]; 24 | switch (selObj.constructor.name){ 25 | case "Rectangle" : 26 | case "Polygon" : 27 | case "Oval" : childCheck(selObj); break; 28 | default : alert("対象外オブジェクト")exit(); 29 | } 30 | 31 | var per=prompt("set filled percent %",50); 32 | if(per==null){exit();} 33 | else{ 34 | main(docObj, selObj, per); 35 | } 36 | } 37 | 38 | function childCheck(selObj){ 39 | if(selObj.graphics.length==1){ 40 | alert("画像が配置されているので中止します。"); 41 | exit(); 42 | } 43 | } 44 | 45 | function main(docObj, selObj, per){ 46 | var lineThickness=0.1; 47 | var selGBon=selObj.geometricBounds; 48 | var offSetMargin=2; //大きめにつくるマージン。マイナス値も可 49 | var sWidth=selGBon[3]-selGBon[1]+2*offSetMargin; 50 | var sHeight=selGBon[2]-selGBon[0]+2*offSetMargin; 51 | //最小限の本数で濃度を出すための計算 52 | var kushValue=2*Math.floor(per/100*(sWidth*sHeight)/(Math.max(sWidth, sHeight)*lineThickness)); 53 | if(selObj.pageItems.length==1){ 54 | selObj.pageItems[0].remove(); 55 | } 56 | var ppArr=new Array(); 57 | for(var i=0; i < kushValue; i++){ 58 | var ran=Math.random(); 59 | var ppList=[[sWidth*ran, 0],[sWidth*ran, sHeight], [0,sHeight*ran],[sWidth,sHeight*ran]] 60 | var ppPoint=ppList[Math.floor(4*Math.random())]; 61 | ppArr.push(ppPoint); 62 | //$.writeln(ppPoint) 63 | } 64 | 65 | var kusObj=docObj.rectangles.add(); 66 | with(kusObj){ 67 | paths[0].entirePath=ppArr; 68 | kusObj.fillColor="None"; 69 | kusObj.strokeWeight=lineThickness; 70 | kusObj.strokeColor="Black"; 71 | //kusObj.transparencySettings.blendingSettings.opacity=50; 72 | } 73 | kusObj.move ([selGBon[1]-offSetMargin,selGBon[0]-offSetMargin]); 74 | kusObj.select(); 75 | app.cut(); 76 | selObj.select(); 77 | app.pasteInto(); 78 | } -------------------------------------------------------------------------------- /glitch/generate_text_pattern.js: -------------------------------------------------------------------------------- 1 | /** 2 | * creat textpat 3 | * サンプルテキスト機能をつかったランダムテキストパターンの実験 4 | */ 5 | 6 | #target "InDesign" 7 | 8 | var fon = app.fonts; 9 | var draw_area = 50; //描写領域 50 x 50 10 | var layered = 12; //レイヤー数 11 | var page_len = 40; //ページ数 = パターンの数 12 | var max_range = 36; //max size = min size(9) + max_range あまり大きすぎると描写領域に対してサンプルテキストが割り付けられない 13 | 14 | var ma = [ //アプリケーションデフォルトのマージン 15 | app.marginPreferences.top, 16 | app.marginPreferences.left, 17 | app.marginPreferences.bottom, 18 | app.marginPreferences.right 19 | ]; 20 | 21 | var doc = app.documents.add(); 22 | var ddp = doc.documentPreferences; 23 | with(ddp){ 24 | pageWidth = draw_area + ma[1] + ma[3]; 25 | pageHeight = draw_area + ma[0] + ma[2]; 26 | pagesPerDocument = page_len; 27 | facingPages = false; 28 | } 29 | 30 | var c, m, y; 31 | try{ 32 | c = doc.colors.add({ 33 | model:ColorModel.PROCESS, 34 | space:ColorSpace.CMYK, 35 | colorValue:[100,0,0,0], 36 | name:"C"}); 37 | }catch(e){c = doc.swatches.item('C');} 38 | try{ 39 | m = doc.colors.add({ 40 | model:ColorModel.PROCESS, 41 | space:ColorSpace.CMYK, 42 | colorValue:[0,100,0,0], 43 | name:"M"}); 44 | }catch(e){m = doc.swatches.item('C');} 45 | try{ 46 | y = doc.colors.add({ 47 | model:ColorModel.PROCESS, 48 | space:ColorSpace.CMYK, 49 | colorValue:[0,0,100,0], 50 | name:"Y"}); 51 | }catch(e){y = doc.swatches.item('C');} 52 | var cmy = [c, m, y]; 53 | 54 | var tfBon = [ //マージン内にテキストフレームをつくる 55 | ma[0], 56 | ma[1], 57 | ma[0] + draw_area, 58 | ma[1] + draw_area 59 | ]; 60 | 61 | for(var j=0; j < page_len; j++){ 62 | for (var i=0; i < layered; i++) { 63 | var tf = doc.pages[j].textFrames.add({geometricBounds: tfBon }); 64 | with(tf.parentStory){ 65 | pointSize = 9 + ( max_range * Math.random() ) + "pt"; //(9 ~ 81 pt) 66 | leading = tf.parentStory.pointSize; 67 | 68 | try{ 69 | appliedFont = fon[Math.floor(fon.length * Math.random())] 70 | }catch(e){} 71 | 72 | //line 73 | // strokeWeight = "0.3 pt"; 74 | // strokeColor = cmy[Math.floor(cmy.length * 10 * Math.random() / 10)]; 75 | // fillColor = "None"; 76 | 77 | //fill 78 | strokeColor = "None"; 79 | fillColor = cmy[Math.floor(cmy.length * Math.random() )]; 80 | } 81 | //set dummy text 82 | tf.contents = TextFrameContents.placeholderText;//1346925688; 83 | tf.transparencySettings.blendingSettings.blendMode = BlendMode.MULTIPLY; 84 | tf.transparencySettings.blendingSettings.opacity = 25; 85 | } 86 | }; 87 | //デスクトップにフォルダを作成してその中に、InDesignドキュメントの各ページをjpeg書出し 88 | exportJepgEachPage (doc); 89 | //書き出したjpegをアンカー付きオブジェクトにして取り込み 90 | placeAnchordImageToDoc (imgFolder); 91 | 92 | function exportJepgEachPage (doc) { 93 | with(app.jpegExportPreferences){ 94 | jpegExportRange = ExportRangeOrAllPages.EXPORT_ALL; 95 | jpegQuality = JPEGOptionsQuality.MAXIMUM; 96 | jpegRenderingStyle = JPEGOptionsFormat.BASELINE_ENCODING; 97 | resolution = 150; 98 | exportingSpread = false; 99 | } 100 | imgFolder = new Folder("~/Desktop/" + new Date().getTime()); 101 | imgFolder.create(); 102 | if(imgFolder){ 103 | fileObj = new File (imgFolder + "/a" + ".jpg");//なにかprefixがないとdot fileの .jpgが生成されてしまう 104 | if(fileObj){ 105 | doc.exportFile(ExportFormat.JPG, fileObj, false); 106 | } 107 | } 108 | } 109 | 110 | // doc.close(SaveOptions.NO); 111 | function placeAnchordImageToDoc (impSrc) { 112 | var doc2 = app.documents.add(); 113 | var tf2 = doc2.textFrames.add(); 114 | var impSrc = imgFolder; 115 | var impSrc_fs = new File(impSrc).fsName; 116 | var impSrc_list = File(impSrc_fs).getFiles( 117 | function (file){ return /^[^\.]+\.jpg$/i.test(file.name)} 118 | ); 119 | if(impSrc) 120 | for (var i=0; i < impSrc_list.length; i++) { 121 | var ob = tf2.parentStory.insertionPoints[-1].rectangles.add(); 122 | tf2.parentStory.insertionPoints[-1].contents = "\n"; 123 | ob.place(impSrc_list[i]); 124 | ob.anchoredObjectSettings.anchoredPosition = AnchorPosition.ANCHORED; 125 | ob.fit(FitOptions.FRAME_TO_CONTENT); 126 | }; 127 | 128 | } 129 | 130 | 131 | -------------------------------------------------------------------------------- /glitch/kaku_blend.js: -------------------------------------------------------------------------------- 1 | /* 2 | カクカク限定ブレンド 3 | "angular objects mixer" 4 | 5 | 使い方: 6 | 二つのオブジェクトを選択して実行します。 7 | それとなくブレンドします。 8 | 9 | 動作する条件 10 | # オブジェクトは2つ 11 | # 各オブジェクトのアンカーポイントは一緒の数である 12 | # 各オブジェクトはコントロールハンドルのない角でできていること(楕円、ベジェ曲線はだめ) 13 | # 塗りおよび線の色はブレンドしません(開始オブジェクトにあわせる) 14 | # 濃度と線の太さはブレンドする 15 | # オープンパス・クローズドパスは開始オブジェクトにあわせる 16 | # 角オプションはブレンドしません(角丸などはなしになります) 17 | # 透明度はブレンドしません 18 | 19 | 動作確認:OS10.4.11 InDesign CS3 20 | 21 | milligramme 22 | www.milligramme.cc 23 | */ 24 | //おまじない 25 | app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll; 26 | 27 | var doc = app.documents[0]; 28 | var sel = app.selection; 29 | 30 | var step = prompt ("ステップ数を入力してください", 10, "blend step"); 31 | 32 | if(sel.length==2){ 33 | 34 | var startObj = sel[0]; 35 | var endObj = sel[1]; 36 | var startPath = startObj.paths[0].entirePath; 37 | var endPath = endObj.paths[0].entirePath; 38 | 39 | if(startPath.length == endPath.length){ 40 | for(var st=1; st4){ 58 | var swatchIndex=4+Math.round(Math.random()*(swObj.length-5)); 59 | selObj[j].fillColor=swObj[swatchIndex]; 60 | } 61 | } 62 | alert("おわりんこ"); 63 | } 64 | }//蛇足ここまで 65 | }//if document exist 66 | 67 | -------------------------------------------------------------------------------- /glitch/round_text.js: -------------------------------------------------------------------------------- 1 | /** 2 | 挿入点を基準に文字をよせてまわす 3 | "twisting characters against the insertion point" 4 | 5 | 使い方: 6 | テキストフレーム内のどこかにカーソルで挿入点入れる、または文字列を選択して 7 | 基準点を決めて実行。選んだ基準点を中心に文字回転をします。 8 | 9 | 動作確認:OS10.4.11 InDesign CS3 10 | 11 | milligramme 12 | www.milligramme.cc 13 | */ 14 | 15 | var docObj = app.documents[0]; 16 | var selObj = docObj.selection[0]; 17 | var pi = Math.PI/180; //degree to radian 18 | 19 | var impLeft, impTop, tfObj, theta; 20 | 21 | //選択オブジェクトを基準点として座標をおさえておく 22 | switch (selObj.constructor.name){ 23 | case "InsertionPoint" : 24 | case "Character" : 25 | impLeft = selObj.horizontalOffset; 26 | impTop = selObj.baseline-selObj.ascent; 27 | //基準点のガイドを作成 28 | //var guid_VaHo=docObj.guides.add ({orientation: HorizontalOrVertical.VERTICAL, location: selObj.horizontalOffset}); 29 | //var guid_HoAs=docObj.guides.add ({orientation: HorizontalOrVertical.HORIZONTAL, location: selObj.baseline-selObj.ascent}); 30 | break; 31 | case "Word" : 32 | case "TextStyleRange" : 33 | case "Line" : 34 | case "Paragraph" : 35 | case "Text" : 36 | case "TextColumn" : 37 | impLeft = selObj.characters[0].horizontalOffset; 38 | impTop = selObj.characters[0].baseline-selObj.characters[0].ascent; 39 | //基準点のガイドを作成 40 | //var guid_VaHo=docObj.guides.add ({orientation: HorizontalOrVertical.VERTICAL, location: selObj.characters[0].horizontalOffset}); 41 | //var guid_HoAs=docObj.guides.add ({orientation: HorizontalOrVertical.HORIZONTAL, location: selObj.characters[0].baseline-selObj.characters[0].ascent}); 42 | break; 43 | default: 44 | alert("out of selection range"); 45 | exit(); 46 | } 47 | //親テキストフレーム 48 | tfObj = selObj.parentTextFrames[0]; 49 | //ツメを100% 50 | tfObj.parentStory.texts[0].tsume=1; 51 | 52 | for(var i=0; i < tfObj.parentStory.characters.length ; i++){ 53 | var tfGBon = tfObj.geometricBounds; 54 | var growFram = selObj.parentStory.characters[0].ascent*1.05; 55 | 56 | //オーバーフローしたらテキストフレームを伸ばす。たてよこ 57 | if(tfObj.overflows == true && tfObj.parentStory.storyPreferences.storyOrientation==StoryHorizontalOrVertical.HORIZONTAL){ 58 | tfObj.geometricBounds=[tfGBon[0], tfGBon[1], tfGBon[2]+growFram, tfGBon[3]]; 59 | } 60 | if(tfObj.overflows == true && tfObj.parentStory.storyPreferences.storyOrientation==StoryHorizontalOrVertical.VERTICAL){ 61 | tfObj.geometricBounds=[tfGBon[0], tfGBon[1]-growFram, tfGBon[2], tfGBon[3]]; 62 | } 63 | //各文字の座標 64 | var charLeft=tfObj.parentStory.characters[i].horizontalOffset; 65 | var charTop=tfObj.parentStory.characters[i].baseline-tfObj.parentStory.characters[i].ascent; 66 | //基準点との角度を求める 67 | if(impLeft!=charLeft){ 68 | theta=Math.atan2(charTop-impTop, charLeft-impLeft)/pi; 69 | } 70 | else{theta=0;} 71 | //基準点に向かって振る 72 | tfObj.parentStory.characters[i].characterRotation=theta; 73 | } 74 | -------------------------------------------------------------------------------- /glitch/voice_wave.js: -------------------------------------------------------------------------------- 1 | /* 2 | ざわざわしたものをつくる 3 | "create thing like voice wave" 4 | 5 | 使い方: 6 | 最前面のドキュメントにギザギザした波形をランダムにひとつ作ります。 7 | 開いているドキュメントがなければ新規ドキュメントを勝手に作って実行します。 8 | 9 | 動作確認:OS10.4.11 InDesign CS3 10 | 11 | milligramme 12 | www.milligramme.cc 13 | */ 14 | if(app.documents.length==0){ 15 | var doc=app.documents.add(); 16 | } 17 | var doc=app.documents[0]; 18 | 19 | var dWidth=doc.documentPreferences.pageWidth; 20 | var dHeight=doc.documentPreferences.pageHeight; 21 | //ルーラーを一時的にスプレッドにする 22 | var rulerBk=doc.viewPreferences.rulerOrigin; 23 | var rulerTemp=RulerOrigin.SPREAD_ORIGIN; 24 | doc.viewPreferences.rulerOrigin=rulerTemp; 25 | 26 | 27 | //パラメータ 28 | var devider=40;//波形の細かさ多い程細かくなります 29 | 30 | var loopPI=1+Math.round(4*Math.random());//1〜5周期でランダム 31 | var boost=loopPI*2.5; 32 | 33 | var zawaAr=new Array(); 34 | for(var x=0; x<360*loopPI; x+=360/devider){ 35 | 36 | var garagara=Math.round(Math.random()*10);//0〜10のランダムのうち0〜5に波形割当 37 | switch(garagara){ 38 | case 0: zawaAr.push([x/boost, boost*Math.sin(Math.sin(x/360*2*Math.PI))]); break; 39 | case 1: zawaAr.push([x/boost, boost*Math.asin(Math.sin(x/360*2*Math.PI))]); break; 40 | case 2: zawaAr.push([x/boost, boost*Math.cos(Math.sin(x/360*2*Math.PI))]); break; 41 | case 3: zawaAr.push([x/boost, boost*Math.acos(Math.sin(x/360*2*Math.PI))]); break; 42 | case 4: zawaAr.push([x/boost, boost*Math.tan(Math.sin(x/360*2*Math.PI))]); break; 43 | case 5: zawaAr.push([x/boost, boost*Math.atan(Math.sin(x/360*2*Math.PI))]); break; 44 | default: zawaAr.push([x/boost,0]); break;//6〜10は無音 45 | } 46 | } 47 | 48 | zawaObj=doc.rectangles.add(); 49 | with(zawaObj){ 50 | paths[0].entirePath=zawaAr; 51 | paths[0].pathType=PathType.OPEN_PATH; 52 | strokeWeight=0.1; 53 | strokeColor="Magenta"; 54 | fillColor="None"; 55 | } 56 | zawaObj.move([dWidth/2*Math.random(),dHeight*Math.random()]); 57 | 58 | //ルーラーを元に戻す 59 | doc.viewPreferences.rulerOrigin=rulerBk; -------------------------------------------------------------------------------- /import/excel_import.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Excel import sample 3 | */ 4 | import_excel(); 5 | 6 | function import_excel () { 7 | var file_obj = File.openDialog("Choose Excel File..."); 8 | if (file_obj == null){ 9 | exit(); 10 | }; 11 | var flg = file_obj.open('r'); 12 | file_obj.encoding = 'UTF-8'; 13 | if (!flg){ 14 | return 15 | } 16 | var doc = app.documents.length === 0 ? app.documents.add() : app.documents[0]; 17 | for (var i=0, iL=100; i < iL ; i++) { 18 | if (app.excelImportPreferences.errorCode !== 0) { 19 | exit(); 20 | }; 21 | try { 22 | with (app.excelImportPreferences){ 23 | // rangeName = "A1:C3" 24 | sheetIndex = i 25 | // sheetName 26 | showHiddenCells = false; 27 | preserveGraphics = true; 28 | tableFormatting = TableFormattingOptions.EXCEL_UNFORMATTED_TABLE; 29 | useTypographersQuotes = true; 30 | } 31 | 32 | var tf = doc.textFrames.add(); 33 | tf.geometricBounds = [5+100*i, 5, 100+100*i, 100]; 34 | tf.place(file_obj); 35 | } 36 | catch(e){ 37 | // $.writeln(app.excelImportPreferences.errorCode); 38 | } 39 | }; 40 | file_obj.close(); 41 | } 42 | -------------------------------------------------------------------------------- /layer/insert_layer_option.js: -------------------------------------------------------------------------------- 1 | //InDesignのレイヤーを任意の位置に作る 2 | 3 | if(app.documents.length!=0){ 4 | var doc=app.documents[0]; 5 | var lname=doc.layers.everyItem().name; 6 | var loc=['の前面','の背面', '最前面','最背面']; 7 | var locEnum=[1650812527,1634104421,1650945639,1701733408] 8 | //$.writeln(lname.toString().replace(/\,/g,"\r")); 9 | 10 | var d=app.dialogs.add({name:"add layer"}); 11 | with(d){ 12 | with(dialogColumns.add()){ 13 | // with(borderPanels.add()){ 14 | // with(dialogColumns.add()){ 15 | // staticTexts.add({staticLabel : "Name"}); 16 | // } 17 | // with(dialogColumns.add()){ 18 | // var Nam=textEditboxes.add({editContents: "new Layer", minWidth: 140}); 19 | // } 20 | // } 21 | with(borderPanels.add()){ 22 | with(dialogColumns.add()){ 23 | staticTexts.add({staticLabel : "Add Layer"}); 24 | } 25 | with(dialogColumns.add()){ 26 | var lay=dropdowns.add({stringList : lname, selectedIndex:0}); 27 | } 28 | with(dialogColumns.add()){ 29 | var lis=dropdowns.add({stringList : loc, selectedIndex:0}); 30 | } 31 | } 32 | } 33 | } 34 | if(d.show()==true){ 35 | // var layerName=Nam.editContents; 36 | var targetLayer=doc.layers.itemByName(lname[lay.selectedIndex]); 37 | var locOption=locEnum[lis.selectedIndex]; 38 | var l=doc.layers.add(); 39 | // l.move(eval(locOption), targetLayer);//CS3だとエラーになる 40 | l.move(locOption, targetLayer); 41 | 42 | d.destroy() 43 | } 44 | else{ 45 | d.destroy(); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /library_snippet/add_to_library_w_name.js: -------------------------------------------------------------------------------- 1 | /* 2 | ライブラリーに名前を付けてオブジェクトを追加 3 | */ 4 | app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll; 5 | if (app.selection.length > 0){ 6 | //ライブラリーにフレーム枠の付かないように一時的にオフにする 7 | var tmp_frame_view = app.activeDocument.viewPreferences.showFrameEdges; 8 | app.activeDocument.viewPreferences.showFrameEdges = false; 9 | 10 | //ライブラリーがなければ、新規作成、キャンセルすれば終了 11 | var lib_obj; 12 | if(app.libraries.length == 0){ 13 | var indl_path = Folder.selectDialog("ライブラリの保存場所をきめてください"); 14 | if (indl_path === null) { 15 | app.activeDocument.viewPreferences.showFrameEdges = tmp_frame_view; 16 | exit(); 17 | } 18 | var indl_name = new File(indl_path + "/" + new Date().getTime() + ".indl"); 19 | lib_obj = app.libraries.add(indl_name); 20 | } 21 | lib_obj = app.libraries[0]; 22 | var sel_obj = app.selection; 23 | main(lib_obj, sel_obj); 24 | //フレーム枠の表示を元に戻す 25 | app.activeDocument.viewPreferences.showFrameEdges = tmp_frame_view; 26 | } 27 | 28 | function main (lib, sel) { 29 | var source_text;//ライブラリーの詳細テキスト 30 | for(var i = 0; i < sel.length; i++){ 31 | var sel_construtor_name = sel[i].constructor.name; 32 | switch(sel[i].constructor.name){ 33 | case "Group": 34 | lib.store (sel[i],{name:sel_construtor_name} ); 35 | break; 36 | case "TextFrame": 37 | if(sel[i].texts.length > 0){ 38 | if(sel[i].texts[0].contents.length == 0){ 39 | lib.store (sel[i], {name: "Empty " + sel_construtor_name}); 40 | } 41 | else{ 42 | source_text = sel[i].texts[0].contents; 43 | try{ 44 | source_text = sel[i].tables[0].cells[0].contents; 45 | }catch(e){} 46 | //内容のあたま16文字で名付ける 47 | lib.store (sel[i], { name:source_text.substring(0, 16), description: source_text }); 48 | } 49 | } 50 | break; 51 | case "Rectangle": 52 | case "GraphicLine": 53 | case "Oval": 54 | case "Polygon": 55 | if(sel[i].graphics.length != 0){ 56 | lib.store (sel[i], {name:sel[i].graphics[0].itemLink.name, description: sel[i].graphics[0].itemLink.filePath}); 57 | } 58 | else{ 59 | lib.store (sel[i], {name:sel_construtor_name}); 60 | } 61 | break; 62 | default: break; 63 | } 64 | } 65 | } 66 | 67 | 68 | -------------------------------------------------------------------------------- /library_snippet/place_snippet.js: -------------------------------------------------------------------------------- 1 | var x = 0; 2 | var y = 0; 3 | var placeditem = app.documents[0].pages[0].place(File("~/Desktop/a.inds"),undefined, undefined, false, false); 4 | //place (fileName, placePoint, destinationLayer, showingOptions, autoflowing, withProperties) 5 | -------------------------------------------------------------------------------- /link/check_link_missing_modified.jsx: -------------------------------------------------------------------------------- 1 | /** 2 | * check milling or outofdate links 3 | */ 4 | Array.prototype.include = function (key) { 5 | var i = this.length; 6 | while (i--) { 7 | if (key === this[i]) {return true} 8 | } 9 | return false 10 | }; 11 | 12 | var doc = app.documents[0]; 13 | $.writeln( check_link_missing (doc) ); 14 | 15 | function check_link_missing (doc) { 16 | var all_link_stat = doc.links.everyItem().status; 17 | var err_arr = []; 18 | 19 | if (all_link_stat.include (1819109747) || 20 | all_link_stat.include (1819242340) || 21 | all_link_stat.include (LINK_MISSING) || 22 | all_link_stat.include (LINK_OUT_OF_DATE) ) { 23 | var link_obj = doc.links; 24 | var m = 0; 25 | var o = 0; 26 | for(var i=0, iL=link_obj.length; i < iL; i++){ 27 | var link_stat = link_obj[i].status; 28 | if (link_stat === LinkStatus.LINK_MISSING){ 29 | err_arr.push("X\t" + link_obj[i].name); 30 | m++ 31 | } 32 | else if (link_stat === LinkStatus.LINK_OUT_OF_DATE) { 33 | err_arr.push("M\t" +link_obj[i].name); 34 | o++ 35 | }; 36 | } 37 | err_arr.unshift("リンク切れ(X):"+m+"と未更新のリンク(M):"+o+"がある"); 38 | } 39 | return err_arr.join("\n"); 40 | } 41 | 42 | -------------------------------------------------------------------------------- /link/relink_broken.js: -------------------------------------------------------------------------------- 1 | var doc_obj = app.documents[0]; 2 | var ex_path = doc_obj.filePath + "/" + "linklist.txt"; 3 | 4 | var conf = confirm("yes: export // no: import"); 5 | 6 | if (conf) { 7 | //export mode 8 | var export_link = new File(ex_path); 9 | if ( export_link ){ 10 | if( export_link.open('w') ){ 11 | var link_info_array = []; 12 | var link_obj = doc_obj.links; 13 | for (var li=0, liL=link_obj.length; li < liL ; li++) { 14 | var link_array = []; 15 | var fp_id = link_obj[li].id 16 | var fp = link_obj[li].name; 17 | var fp_rep = fp.replace(/[^0-9A-za-z_-\\.]/g,"_"); 18 | var stat = link_obj[li].status === LinkStatus.LINK_MISSING ? "x" : ""; 19 | export_link.writeln(stat + "\t" + fp_id + "\t" + fp + "\t" + fp_rep ); 20 | } 21 | }; 22 | } 23 | } 24 | else{ 25 | //import mode 26 | var sel_folder = Folder.selectDialog("select folder included images to replace"); 27 | if ( sel_folder ) { 28 | var fol = sel_folder.fsName; 29 | }else{ 30 | alert("exit"); 31 | } 32 | if( File(ex_path) ){ 33 | var import_link = new File(ex_path); 34 | if ( import_link.open('r') ) { 35 | var arr = []; 36 | while( !import_link.eof ){ 37 | arr.push(import_link.readln().split('\t') ); 38 | } 39 | import_link.close(); 40 | } 41 | link_obj = doc_obj.links; 42 | for (var li=0, liL=link_obj.length; li < liL ; li++) { 43 | if (arr[li][0] === "x") { 44 | try{ 45 | link_obj[li].relink( File(fol + "/" + arr[li][3]) ); 46 | } 47 | catch(e){alert(e);continue;} 48 | link_obj.everyItem().update(); 49 | }; 50 | } 51 | 52 | } 53 | } -------------------------------------------------------------------------------- /link/rename_and_relink.jsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Rename and Relink 3 | * "選択した配置画像のファイル名をリネームして再リンク" 4 | * ■他にもリネーム前の同名のファイルがある場合同階層であれば、それらもまとめて再リンク。ただし同名でも階層が違う(リンク切れをしない)場合はそのまま 5 | * ■リネームしたいファイル名が既に存在する場合そのファイルにリンクを変更(置換)するか、処理をキャンセルするかを選択してから処理 6 | */ 7 | 8 | var rename_and_relink = function (sel){ 9 | //現在の配置画像のファイルパスとファイル名 10 | var current_link = sel.itemLink; 11 | var current_file_name = current_link.name; 12 | var current_link_file = File(current_link.filePath); 13 | //ダイアログにてリネームする 14 | var new_file_name = prompt ("rename", current_file_name, "RenameTo"); 15 | //キャンセル押したときはリネームしない 16 | if(new_file_name == null) return; 17 | var new_link_file = current_link_file.rename(new_file_name); 18 | if(new_link_file == true){ 19 | current_link.relink(current_link_file); 20 | current_link.update(); 21 | } 22 | else { 23 | //リネームしたいファイル名のファイルが存在している 24 | //リネームせずに終了 25 | var replace_check = confirm("そのファイル名は既に存在しています。\r「はい/YES」ならそのファイルに置換、「いいえ/NO」なら処理をキャンセルします"); 26 | //既に存在しているファイル名に 27 | if(replace_check == true){ 28 | var existLinkFilePath = current_link.filePath.replace(current_file_name,new_file_name); 29 | var existLinkFile = File(existLinkFilePath); 30 | current_link.relink(existLinkFile); 31 | current_link.update(); 32 | } 33 | } 34 | //リンク情報全体を取得、ほかに同名ファイルがあるかどうか調べる。 35 | var all_links = app.documents[0].links; 36 | for(var i = all_links.length-1; i >= 0; i--){ 37 | if(all_links[i].name == current_file_name){ 38 | var other_link = all_links[i].parent.itemLink; 39 | //リンクが切れたらファイル名を置換、切れなかったらそれは無視=別階層 40 | if(all_links[i].status == LinkStatus.LINK_MISSING){ 41 | other_link.relink(current_link_file); 42 | other_link.update(); 43 | } 44 | } 45 | } 46 | } 47 | 48 | if (new File($.fileName).name==$.stack.replace(/[\[\]\n]/g,"")) { 49 | if (app.documents.length == 0) exit(); 50 | var sel = app.selection; 51 | if (sel.length == 1){ 52 | //選択しているものの判別 53 | switch (sel[0].constructor.name){ 54 | case "Rectangle": 55 | case "Oval": 56 | case "Polygon": 57 | if (sel[0].allGraphics.length != 0){ 58 | rename_and_relink(sel[0].allGraphics[0]); 59 | }; 60 | break; 61 | case "Image": 62 | case "EPS": 63 | case "PDF": 64 | case "PICT": 65 | case "ImportedPage": 66 | rename_and_relink(sel[0]); 67 | break; 68 | case "Group": 69 | alert("グループ化されてます。\rグループ解除して一つだけ選択、または、ダイレクト選択してください"); 70 | exit(); 71 | } 72 | } 73 | else { 74 | alert("一つだけ選択してください"); 75 | exit(); 76 | 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /pdf_hyperlink/create_hyperlink.js: -------------------------------------------------------------------------------- 1 | main(); 2 | 3 | function main() { 4 | with (app.findChangeGrepOptions) { 5 | includeFootnotes = true; 6 | includeHiddenLayers = false; 7 | includeLockedLayersForFind = false; 8 | includeLockedStoriesForFind = false; 9 | includeMasterPages = true; 10 | } 11 | app.findGrepPreferences = null; 12 | // URL 13 | app.findGrepPreferences.findWhat = '\\<(http|www)\\S*\\>'; 14 | var myURLs = app.activeDocument.findGrep(); 15 | makeHyperlink('http://', myURLs); 16 | // email 17 | app.findGrepPreferences.findWhat = '\\<\\S*@\\S*\\.\\w{2,3}\\>'; // '\\^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2, 4}\\>' 18 | var myEmails = app.activeDocument.findGrep(); 19 | makeHyperlink('mailto:', myEmails); 20 | } 21 | 22 | function makeHyperlink(aPrefix, myArray) { 23 | for (var i = myArray.length-1; i >= 0; i-- ) { 24 | try{ 25 | var aString = aPrefix + myArray[i].contents.replace(aPrefix, '') 26 | var myHyperlinkTextSource = app.activeDocument.hyperlinkTextSources.add(myArray[i]); 27 | var myHyperlinkDestination = app.activeDocument.hyperlinkURLDestinations.add({destinationURL:aString}); 28 | var myHyperlink = app.activeDocument.hyperlinks.add({source:myHyperlinkTextSource, destination:myHyperlinkDestination}); 29 | //myHyperlink.visible = true; 30 | } 31 | catch(e){} 32 | } 33 | } -------------------------------------------------------------------------------- /scriptui/auto_layout.js: -------------------------------------------------------------------------------- 1 | #targetengine "session" 2 | var rsc = "window{ \ 3 | orientation: 'row', \ 4 | st: StaticText { }, \ 5 | pb: Button {text:'Ok'}, \ 6 | et: EditText {characters:44, justify:'right'}, \ 7 | margins:[110,22,44,1], \ 8 | spacing:50 \ 9 | }"; 10 | 11 | 12 | var win = new Window(rsc); 13 | win.show(); -------------------------------------------------------------------------------- /scriptui/colorme.js: -------------------------------------------------------------------------------- 1 | // color my scriptui [window, palette, dialog] please 2 | (function() { 3 | var u; 4 | var w = new Window('dialog', "color me", u); 5 | w.orientation = 'column'; 6 | def = [0.9, 0.7, 0.7]; 7 | w.graphics.backgroundColor = w.graphics.newBrush (w.graphics.BrushType.SOLID_COLOR, def); 8 | 9 | r_sld = w.add('slider', u, def[0], 0, 1); 10 | g_sld = w.add('slider', u, def[1], 0, 1); 11 | b_sld = w.add('slider', u, def[2], 0, 1); 12 | rgb_txt = w.add('statictext', u, [r_sld.value, g_sld.value, b_sld.value].join(", ")); 13 | 14 | w.btn_g = w.add('group'); 15 | var ok_btn = w.btn_g.add('button', u, "this color", {name: "ok"}); 16 | 17 | r_sld.onChanging = function() { 18 | w.graphics.backgroundColor = w.graphics.newBrush (w.graphics.BrushType.SOLID_COLOR, [r_sld.value, g_sld.value, b_sld.value]); 19 | rgb_txt.text = [r_sld.value, g_sld.value, b_sld.value].join(", "); 20 | }; 21 | g_sld.onChanging = function() { 22 | w.graphics.backgroundColor = w.graphics.newBrush (w.graphics.BrushType.SOLID_COLOR, [r_sld.value, g_sld.value, b_sld.value]); 23 | rgb_txt.text = [r_sld.value, g_sld.value, b_sld.value].join(", "); 24 | }; 25 | b_sld.onChanging = function() { 26 | w.graphics.backgroundColor = w.graphics.newBrush (w.graphics.BrushType.SOLID_COLOR, [r_sld.value, g_sld.value, b_sld.value]); 27 | rgb_txt.text = [r_sld.value, g_sld.value, b_sld.value].join(", "); 28 | }; 29 | 30 | var flg = false; 31 | ok_btn.onClick = function () { 32 | flg = true; 33 | w.close(); 34 | } 35 | 36 | w.show(); 37 | if (flg) { 38 | var now = new Date().getTime().toString(); 39 | var file_path = "~/Desktop/rgb_"+now+".txt"; 40 | var file = File(file_path); 41 | if (file.open("w")) { 42 | var param = "w.graphics.backgroundColor = w.graphics.newBrush (w.graphics.BrushType.SOLID_COLOR, ["+rgb_txt.text+"] );" 43 | file.writeln(param); 44 | file.close(); 45 | var receipt = "do shell script \"open " + file_path + "\""; 46 | app.doScript(receipt, ScriptLanguage.APPLESCRIPT_LANGUAGE); 47 | }; 48 | }; 49 | })(); -------------------------------------------------------------------------------- /scriptui/counting_plt.js: -------------------------------------------------------------------------------- 1 | /** 2 | * counting palette 3 | * 4 | * 2010-12-03 mg 5 | */ 6 | #targetengine "session" 7 | var plt = new Window('palette', "Insert Sequential", undefined); 8 | 9 | var btn = plt.add('button',[0,0,120,40],"Insert"); 10 | 11 | //insert string 12 | var format_grp = plt.add('group'); 13 | var edt_prefix = format_grp.add('edittext', undefined, "["); 14 | var edt_base = format_grp.add('edittext', undefined, "1"); 15 | 16 | //set color to edittext CS4 or later 17 | if (app.version.split('.')[0] > 5) { 18 | edt_base.graphics.foregroundColor = 19 | edt_base.graphics.newPen(edt_base.graphics.PenType.SOLID_COLOR,[1,0,0, 1],1);//[r,g,b, transparency],Font? 20 | edt_base.graphics.backgroundColor = 21 | edt_base.graphics.newBrush(edt_base.graphics.BrushType.SOLID_COLOR,[1,1,0, 1]); 22 | }; 23 | var edt_postfix = format_grp.add('edittext', undefined, "]"); 24 | 25 | //setting for increament, decreament 26 | var setting_grp = plt.add('group'); 27 | setting_grp.add('statictext',undefined, "set digit: "); 28 | var edt_digit = setting_grp.add('edittext', undefined, "0"); 29 | setting_grp.add('statictext',undefined, "pitch: "); 30 | var edt_pitch = setting_grp.add('edittext', undefined, "1"); 31 | 32 | //set edittext width 33 | edt_prefix.characters = 8; 34 | edt_base.characters = 4; 35 | edt_postfix.characters = 8; 36 | edt_digit.characters = 4; 37 | edt_pitch.characters = 4; 38 | 39 | btn.onClick = function () { 40 | //change to number 41 | var base_num = edt_base.text * 1; 42 | var pitch_num = edt_pitch.text * 1; 43 | 44 | //fill zero 45 | var ad = add_zero (edt_base.text, edt_digit.text * 1); 46 | insert_this (edt_prefix.text + ad + Math.abs(edt_base.text * 1) + edt_postfix.text); 47 | //count up or down 48 | edt_base.text = base_num + pitch_num; 49 | } 50 | 51 | plt.show(); 52 | 53 | //insert to document 54 | function insert_this (string) { 55 | if (app.selection.length === 1 && app.selection[0].hasOwnProperty('baseline')) { 56 | var tar = app.selection[0].insertionPoints; 57 | // tar[-1].appliedCharacterStyle = c_style[style_ddl.selection.index]; 58 | tar[-1].contents = string; 59 | }; 60 | } 61 | 62 | // fill zero 63 | function add_zero (string, digit) { 64 | if (Math.abs(string).length > digit) { 65 | return "" 66 | }; 67 | var z = ''; 68 | if (string.charAt(0) === "-") { 69 | for (var i=0, iL=digit+1-string.length; i < iL; i++) { 70 | z += '0'; 71 | }; 72 | return "-" + z; 73 | }; 74 | else { 75 | for (var i=0, iL=digit-string.length; i < iL; i++) { 76 | z += '0'; 77 | }; 78 | return z; 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /scriptui/custom_color_and_font.jsx: -------------------------------------------------------------------------------- 1 | var scriptui_bgcolor = function(t, rgb, opacity) { 2 | var opacity = opacity || 1; 3 | t.graphics.backgroundColor = t.graphics.newBrush ( 4 | t.graphics.BrushType.SOLID_COLOR, rgb 5 | ); 6 | t.opacity = opacity; 7 | return t; 8 | }; 9 | 10 | var scriptui_fgcolor = function(t, rgb, opacity) { 11 | var opacity = opacity || 1; 12 | t.graphics.foregroundColor = t.graphics.newPen ( 13 | t.graphics.PenType.SOLID_COLOR, rgb, 1 14 | ); 15 | t.opacity = opacity; 16 | return t; 17 | }; 18 | 19 | var scriptui_setfont = function(t, font, style, size) { 20 | t.graphics.font = ScriptUI.newFont (font, style, size); 21 | return t; 22 | }; 23 | -------------------------------------------------------------------------------- /scriptui/flexible_dialog_test.js: -------------------------------------------------------------------------------- 1 | /** 2 | * のびのびダイアログ 3 | * コンテンツに応じてダイアログのサイズを可変させるサンプル 4 | * 機能: 5 | * InDesign のスウォッチとレイヤーの名前をリネームする 6 | */ 7 | 8 | var docObj = app.documents[0]; 9 | var swatchObj = unReservedSwatch(docObj); 10 | var layObj = docObj.layers; 11 | 12 | //create dialog 13 | //dialogはpanelのサイズに合わせて自動調整 14 | var dlg = new Window('dialog',"stretch dialog", undefined); 15 | //swatch panel 16 | dlg.panel = dlg.add('panel',[5,5,340,320],"Swaaaaaaaaaatch"); 17 | var sw_panelbon = dlg.panel.bounds; 18 | 19 | var y1 = 0, swArr = []; 20 | for (var isw=0; isw < swatchObj.length; isw++) { 21 | swatchObjName = dlg.panel.add('statictext', [20,20+y1,180,40+y1], ''+swatchObj[isw].name); 22 | swRenameName = dlg.panel.add('edittext', [180,20+y1,320,40+y1], '',{multiline: false}); 23 | y1 += 25; 24 | swArr.push([swatchObjName, swRenameName]); 25 | } 26 | var py = y1 +35; 27 | //panelのサイズを拡張のびーる 28 | dlg.panel.bounds = [sw_panelbon[0], sw_panelbon[1], sw_panelbon[2], py]; 29 | 30 | var ly_panelbon = [5, py, 340, py +100];//swatchのパネルの下端から作成、高さはとりあえず100 31 | //layer panel 32 | dlg.panel2 = dlg.add('panel', ly_panelbon, "Layeeeeeeeeeeeer"); 33 | 34 | var y2 = 0, lyArr = []; 35 | for (var ily=0; ily < layObj.length; ily++) { 36 | layObjName = dlg.panel2.add('statictext', [20,20+y2,180,40+y2], ''+layObj[ily].name); 37 | lyRenameName = dlg.panel2.add('edittext', [180,20+y2,320,40+y2], '',{multiline: false}); 38 | y2 += 25; 39 | lyArr.push([layObjName, lyRenameName]); 40 | } 41 | var py2 = y2 + 30; 42 | //panel2のサイズを拡張のびーる 43 | dlg.panel2.bounds = [ly_panelbon[0], ly_panelbon[1], ly_panelbon[2], ly_panelbon[1]+py2]; 44 | 45 | dlg.okButton = dlg.add('button',undefined,"ok",{name: 'ok'}); 46 | dlg.cancelButton = dlg.add('button',undefined,"cancel",{name: 'cancel'}); 47 | 48 | dlg.center(); 49 | var flg; 50 | dlg.okButton.onClick = function(){ 51 | flg = true 52 | dlg.close(); 53 | } 54 | dlg.cancelButton.onClick = function(){ 55 | flg = false 56 | dlg.close(); 57 | } 58 | 59 | dlg.show(); 60 | 61 | if(flg == true){ 62 | renameswatchObj(docObj, swArr); 63 | renamelayerObj(docObj, lyArr); 64 | } 65 | 66 | 67 | /** 68 | * raname object (swatch) 69 | * @param {Object} doc Document 70 | * @param {Array} array ==> [object, string] 71 | */ 72 | function renameswatchObj (doc, array) { 73 | for (var i=0; i < array.length; i++) { 74 | var stylename = array[i][0].text; 75 | var renamename = array[i][1].text; 76 | if(renamename.length > 0){ 77 | var styleObj = doc.swatches.item(stylename); 78 | retryRename (styleObj, renamename); //Fnへ 79 | } 80 | } 81 | } 82 | /** 83 | * raname object (layer) 84 | * @param {Object} doc Document 85 | * @param {Array} array ==> [object, string] 86 | */ 87 | function renamelayerObj (doc, array) { 88 | for (var i=0; i < array.length; i++) { 89 | var stylename = array[i][0].text; 90 | var renamename = array[i][1].text; 91 | if(renamename.length > 0){ 92 | var styleObj = doc.layers.item(stylename); 93 | retryRename (styleObj, renamename); //Fnへ 94 | } 95 | } 96 | } 97 | /** 98 | * regex check and retry rename 99 | * @param {Object} obj such as Swatch, Layers, ParagraphStyles(exist name property object) 100 | * @param {String} string rename string 101 | */ 102 | function retryRename (obj, string) { 103 | //リネームの正規表現チェック 104 | var regexCheck = string.match(/^[A-Za-z][0-9A-Za-z_-]*/g); 105 | if(regexCheck != string){ 106 | reg_retry = prompt("ルールにマッチしません",string); 107 | if(reg_retry){ 108 | string = reg_retry; 109 | retryRename (obj, string); 110 | } 111 | else{exit();} 112 | } 113 | //リネームの重複チェック 114 | try{ 115 | obj.name = string; 116 | } 117 | catch(e){ 118 | var retry = prompt("変更前「"+obj.name+"」:\r名前は既にあります。変更して下さい。",string); 119 | if(retry){ 120 | retryRename(obj, retry); 121 | } 122 | else{exit();} 123 | } 124 | 125 | } 126 | /** 127 | * unreserved swatch 128 | * @param {Object} doc Document 129 | * @returns {Array} otherSw the return value 130 | */ 131 | function unReservedSwatch(doc){ 132 | var swObj = doc.swatches; 133 | var otherSw = new Array(); 134 | if(swObj.length-4 > 0){ 135 | for(var i=0; i < swObj.length; i++){ 136 | switch(swObj[i].name){ 137 | case "None": 138 | case "Paper": 139 | case "Black": 140 | case "Registration": break; 141 | default : 142 | otherSw.push(swObj[i]); 143 | break; 144 | } 145 | } 146 | } 147 | return otherSw; 148 | } 149 | -------------------------------------------------------------------------------- /scriptui/progress_with_color.js: -------------------------------------------------------------------------------- 1 | /** 2 | * progress will fade in! 3 | * using scriptUI graphic to change font size and color 4 | */ 5 | 6 | #targetengine "session" 7 | var w = new Window('window', "progress"); 8 | var counter = w.add('statictext', undefined, ""); 9 | 10 | // var c = "◐◓◑◒".split(''); 11 | // var c = "⿰⿱⿲⿳⿴⿵⿶⿷⿸⿹⿺⿻".split(''); 12 | var c = "\\|/–".split(''); 13 | 14 | counter.characters = 2; 15 | counter.justify = 'center'; 16 | counter.graphics.font = ScriptUI.newFont("Helvetica", "Bold", 240); 17 | counter.graphics.foregroundColor = counter.graphics.newPen(w.graphics.PenType.SOLID_COLOR, [1,1,1], 1); 18 | 19 | var draw_area = 100; 20 | var ma = [ 21 | app.marginPreferences.top, 22 | app.marginPreferences.left, 23 | app.marginPreferences.bottom, 24 | app.marginPreferences.right 25 | ]; 26 | 27 | var doc = app.documents.add(); 28 | var ddp = doc.documentPreferences; 29 | with(ddp){ 30 | pageWidth = draw_area + ma[1] + ma[3]; 31 | pageHeight = draw_area + ma[0] + ma[2]; 32 | facingPages = false; 33 | } 34 | doc.textFrames.add({ 35 | geometricBounds : [ma[0], ma[1], draw_area+ma[0], draw_area+ma[1]] 36 | , contents : TextFrameContents.placeholderText 37 | }); 38 | 39 | var story_obj = doc.stories[0]; 40 | var char_obj = story_obj.characters; 41 | var char_ln = char_obj.length; 42 | obs = []; 43 | w.show(); 44 | 45 | for (var i = char_ln - 1; i >= 0; i--){ 46 | try { 47 | var ob = char_obj[i].createOutlines(false)[0]; 48 | obs.push(ob); 49 | } catch(e){} 50 | counter.text = c[ i%(c.length) ]; 51 | counter.graphics.foregroundColor = counter.graphics.newPen(w.graphics.PenType.SOLID_COLOR, [(char_ln-i)/char_ln, i/char_ln,0], 1); 52 | if (i == 0) { 53 | counter.text = "*"; 54 | // w.hide(); 55 | // do something 56 | }; 57 | }; 58 | 59 | 60 | -------------------------------------------------------------------------------- /scriptui/remember_dialog_setting.js: -------------------------------------------------------------------------------- 1 | /** 2 | * remember setting dialog test 3 | */ 4 | 5 | //config name 6 | var conf_name = "remember.txt"; 7 | //path to script panel folder 8 | var scrt_fol = app.scriptPreferences.scriptsFolder; 9 | var conf_file = new File( scrt_fol + "/" + conf_name ); 10 | conf_file.encoding = "UTF-8"; 11 | var conf_json = ""; 12 | if ( conf_file.open("r") ){ 13 | conf_json += conf_file.read(); 14 | if ( conf_json !== "" ) { 15 | var conf_obj = eval( conf_json );//eval("({key:value})") 16 | }; 17 | } 18 | else{ 19 | var conf_obj = {}; 20 | } 21 | 22 | //dialog 23 | var dlg = new Window('dialog', "remember", undefined, {borderless: false}); 24 | dlg.panel = dlg.add('panel'); 25 | dlg.panel.alignChildren = 'left'; 26 | var ddl = dlg.panel.add('dropdownlist', undefined, ["tokyo", "nagoya", "osaka", "kyoto", "fukuoka"]); 27 | var edt = dlg.panel.add('edittext', [0,0,150,90], undefined, {multiline: true}); 28 | //default value 29 | ddl.selection = conf_obj['place'] === undefined ? 0 : conf_obj['place']; 30 | edt.text = conf_obj['memo'] === undefined ? "this is defalut, tokyo is defalut selection": conf_obj['memo']; 31 | //button 32 | dlg.group = dlg.add('group'); 33 | var ok_btn = dlg.group.add('button', undefined,"OK", {name:'ok'}); 34 | var can_btn = dlg.group.add('button',undefined,"Cancel", {name:'cancel'}); 35 | var reset_btn = dlg.group.add('button',undefined,"Reset", {name:'reset'}); 36 | 37 | //export remember setting 38 | ok_btn.onClick = function () { 39 | var setting_obj = {}; 40 | setting_obj['place'] = ddl.selection.index; 41 | setting_obj['memo'] = edt.text; 42 | var ex_conf = new File(scrt_fol + "/" + conf_name); 43 | if ( ex_conf.open("w") ) { 44 | ex_conf.write( setting_obj.toSource() );// 45 | }; 46 | dlg.close(); 47 | } 48 | //reset to default value 49 | reset_btn.onClick = function () { 50 | ddl.selection = 0; 51 | edt.text = "this is defalut, tokyo is defalut selection"; 52 | } 53 | dlg.show(); -------------------------------------------------------------------------------- /scriptui/scriptui_bold_text.js: -------------------------------------------------------------------------------- 1 | var myMainPanel=new Window ('dialog', 'ずら', [0,0,300,150]); 2 | myMainPanel.center(); 3 | 4 | //普通のstatictext 5 | myMainPanel.add('statictext',[10,10,280,25], 6 | 'This is normal static text: ノーマル'); 7 | 8 | //Harbさんによるbold処理 9 | var font = myMainPanel.graphics.font.family; 10 | var fontSize = myMainPanel.graphics.font.size; 11 | var boldFont = ScriptUI.newFont (font,'BOLD',fontSize); 12 | var myText = myMainPanel.add('statictext',[10,10+20,280,25+20], 13 | 'This is ScriptUI bold text: 正統派ボールド処理'); 14 | myText.graphics.font = boldFont; 15 | 16 | 17 | //Roy Marshallさんによるずらし処理 18 | myMainPanel.add('statictext',[10,10+60,280,25+60], 19 | 'This is shifted text 0.5px: ずらしてみる処理'); 20 | myMainPanel.add('statictext',[10,10+60.5,280,25+60.5], 21 | 'This is shifted text 0.5px: ずらしてみる処理'); 22 | 23 | myMainPanel.add('statictext',[10,10+80,280,25+80], 24 | 'This is shifted text 1px: ずらしてみる処理'); 25 | myMainPanel.add('statictext',[10,10+81,280,25+81], 26 | 'This is shifted text 1px: ずらしてみる処理'); 27 | 28 | myMainPanel.add('statictext',[10,10+100,280,25+100], 29 | 'This is shifted text 1.5px: ずらしてみる処理'); 30 | myMainPanel.add('statictext',[10,10+101.5,280,25+101.5], 31 | 'This is shifted text 1.5px: ずらしてみる処理'); 32 | 33 | myMainPanel.show(); 34 | 35 | -------------------------------------------------------------------------------- /scriptui/scriptui_copiable_alert.js: -------------------------------------------------------------------------------- 1 | /** 2 | * copiable alert for indesign 3 | * 4 | * @param {String|Object|Array|Boolean|Number} alert_str Any 5 | */ 6 | CopiableAlert( alert_str ); 7 | 8 | function CopiableAlert( alert_str ){ 9 | if (typeof alert_str !== "string") { 10 | switch(typeof alert_str){ 11 | case 'number': alert_str = ""+alert_str; break; 12 | case 'boolean': alert_str = alert_str == true ? "true":"false"; break; 13 | case 'object': alert_str = alert_str.toSource(); break; 14 | case 'function': alert_str = alert_str.toSource(); break; 15 | case 'null': alert_str = "null"; break; 16 | case 'undefined': alert_str = "undefined"; break; 17 | default: return; break; 18 | } 19 | }; 20 | var dlg = app.dialogs.add({name: "Copiable Alert"}); 21 | with(dlg){ 22 | with(dialogColumns.add()){ 23 | with(dialogRows.add()){ 24 | staticTexts.add({staticLabel: "Copy It"}); 25 | } 26 | with(dialogRows.add()){ 27 | textEditboxes.add({editContents: alert_str, minWidth: 320}); 28 | } 29 | } 30 | } 31 | if(dlg.show() === true){ 32 | dlg.destroy(); 33 | } 34 | else{ 35 | dlg.destroy(); 36 | } 37 | }; -------------------------------------------------------------------------------- /scriptui/switch_button_font.js: -------------------------------------------------------------------------------- 1 | /** 2 | * button font change test 3 | * 4 | * 2010-12-01 mg 5 | */ 6 | var dlg = new Window('dialog',"switch button font"); 7 | dlg.orientation = 'row' 8 | var btn = dlg.add('button', [0,0,200,200], 'abcde\nあいうえ\nお猪口\n1234'); 9 | 10 | dlg.grp = dlg.add('group'); 11 | dlg.grp.orientation = 'column'; 12 | 13 | var font_ddl = dlg.grp.add('dropdownlist', [0,0,120,23], app.fonts.everyItem().name); 14 | var size_arr = [12,18,24,32,48,56]; 15 | var size_ddl = dlg.grp.add('dropdownlist', [0,0,120,23], size_arr); 16 | font_ddl.selection = 0; 17 | size_ddl.selection = 0; 18 | 19 | font_ddl.onChange = function () { 20 | btn.graphics.font = ScriptUI.newFont( 21 | app.fonts[font_ddl.selection.index].fontFamily, 22 | app.fonts[font_ddl.selection.index].fontStyleName, 23 | size_arr[size_ddl.selection.index] 24 | ); 25 | } 26 | size_ddl.onChange = function () { 27 | btn.graphics.font = ScriptUI.newFont( 28 | app.fonts[font_ddl.selection.index].fontFamily, 29 | app.fonts[font_ddl.selection.index].fontStyleName, 30 | size_arr[size_ddl.selection.index] 31 | ); 32 | } 33 | dlg.show(); -------------------------------------------------------------------------------- /scriptui/tabbed_panel_scriptui.js: -------------------------------------------------------------------------------- 1 | var w = new Window ('dialog', "Tabbed Panel", undefined); 2 | var tpanel = w.add('tabbedpanel'); 3 | tpanel.preferredSize = [350,300]; 4 | var general = tpanel.add('tab', undefined, "Test1"); 5 | general.add('statictext', undefined, "within Test1 Tab"); 6 | 7 | var images = tpanel.add('tab', undefined, "Test2"); 8 | images.add('statictext', undefined, "within Test2 Tab"); 9 | tpanel.selection = images; 10 | 11 | var buttons = w.add('group'); 12 | buttons.add ('button', undefined, "OK", {name: 'ok'}); 13 | w.show (); -------------------------------------------------------------------------------- /scriptui/window_test1.js: -------------------------------------------------------------------------------- 1 | var win = new Window('dialog',"Test",undefined,{resizeable: true}); 2 | 3 | 4 | win.edt = win.add('edittext', [0,0,240,60], {multiline: true}) 5 | win.btn = win.add('button',undefined,"resize"); 6 | 7 | win.sld = win.add('slider',[0,30,70,60],50,50,600); 8 | 9 | win.btn.onClick = function () { 10 | s = new Date().getSeconds(); 11 | m = new Date().getMinutes(); 12 | h = new Date().getHours(); 13 | win.bounds = [0, 0, s * 10, s * m * h /10]; 14 | win.center(); 15 | } 16 | 17 | win.sld.onChange = function () { 18 | win.bounds = [0, 0, win.sld.value * 1.0, win.sld.value * 1.0 ]; 19 | win.center(); 20 | this.layout.layout(true) 21 | } 22 | 23 | win.sld.onChanging = function () { 24 | win.edt.bounds = [0, 0, 1 + win.sld.value, 1 + win.sld.value] 25 | } 26 | 27 | win.center(); 28 | win.show(); -------------------------------------------------------------------------------- /scriptui/window_test2.js: -------------------------------------------------------------------------------- 1 | wu = new Window('dialog'); 2 | // wu.orientation = "column" 3 | wu.alignChildren = "left" 4 | for (var i=0; i < 20; i++) { 5 | t = wu.add('statictext',undefined, "message") 6 | // t.characters = 12; 7 | t.indent = i*25; 8 | }; 9 | b = wu.add('button', undefined,"nunu") 10 | b.size = [300,20]; 11 | 12 | b.onClick = function () { 13 | this.text = this.text+"nu" 14 | // ed.size = [90,90] 15 | } 16 | 17 | wu.show() -------------------------------------------------------------------------------- /shape/add_pathpoint_index.js: -------------------------------------------------------------------------------- 1 | // add index label to each pathpoints 2 | 3 | var doc = app.documents[0]; 4 | var sel = doc.selection[0]; 5 | var ppp = sel.paths[0].pathPoints; 6 | var gr = []; 7 | for(var i=0; i < ppp.length; i++){ 8 | var ppAn = ppp[i].anchor; 9 | var ppIn = ppp[i].index; 10 | var tf = sel.parent.textFrames.add(); 11 | tf.contents = ppIn.toString(); 12 | tf.fillColor = "Yellow"; 13 | tf.geometricBounds=[ppAn[1], ppAn[0], ppAn[1]+4, ppAn[0]+6]; 14 | tf.textWrapPreferences.textWrapType = TextWrapTypes.NONE; 15 | gr.push(tf); 16 | } 17 | 18 | var ggg = sel.parent.groups.add( gr ); 19 | //ggg.remove(); -------------------------------------------------------------------------------- /shape/adjust_polygon.js: -------------------------------------------------------------------------------- 1 | /** 2 | 星型をととのえる 3 | 4 | 使い方: 5 | 多角形オブジェクトを選んで実行。 6 | ダイアログが出るので、頂点の数と星型の比率を入力して続行。 7 | */ 8 | 9 | if(app.documents.length > 0 && app.selection.length === 1){ 10 | var selObj = app.selection[0]; 11 | switch (selObj.constructor.name){ 12 | case "Polygon": 13 | case "Rectangle": 14 | case "TextFrame": 15 | main(); 16 | break; 17 | default : break; 18 | } 19 | } 20 | else { 21 | alert("select one object"); 22 | } 23 | 24 | function main(){ 25 | var currentPP = selObj.paths[0].pathPoints.length; 26 | var selGBon = selObj.geometricBounds; 27 | var selC = [selGBon[1]+(selGBon[3]-selGBon[1])/2, selGBon[0]+(selGBon[2]-selGBon[0])/2]; 28 | 29 | //ピタゴラスの定理からだいたいの比率をもとめる 30 | var starA, starB, rA, rB; 31 | starA = selObj.paths[0].pathPoints[0].anchor; 32 | starB = selObj.paths[0].pathPoints[1].anchor; 33 | rA = Math.sqrt (Math.pow(selC[0]-starA[0], 2)+Math.pow(selC[1]-starA[1], 2)); 34 | rB = Math.sqrt(Math.pow(selC[0]-starB[0], 2)+Math.pow(selC[1]-starB[1], 2)); 35 | 36 | var insPer; 37 | if(rA > rB){ 38 | insPer = 100-rB/rA*100; 39 | } 40 | else{ 41 | insPer = 100-rA/rB*100; 42 | } 43 | 44 | var current_pp = Math.floor(Math.max(3, currentPP/2)); 45 | var inset_per = Math.floor(insPer); 46 | var result = dlg (current_pp, inset_per); 47 | if (result !== undefined) { 48 | selObj.convertShape (ConvertShapeOptions.CONVERT_TO_POLYGON, result[0], result[1]);//(convertShapeOption, numberOfSides, insetPercentage, cornerRadius) 49 | }; 50 | } 51 | 52 | function dlg (current_pp, inset_per) { 53 | var u; 54 | var w = new Window('dialog', "Adjust Polygon", u); 55 | w.orientation = 'column'; 56 | // w.margins = 5; 57 | // w.spacing = 10; 58 | w.alignChildren = ['fill', 'fill']; 59 | w.g1 = w.add('group'); 60 | w.g1.add('statictext', u, "頂点の数: "); 61 | edt_num_of_side = w.g1.add('edittext', u, current_pp+""); 62 | w.g1.add('statictext', u, "(3-100)"); 63 | 64 | w.g2 = w.add('group'); 65 | w.g2.add('statictext', u, "星形の比: "); 66 | edt_inset_per = w.g2.add('edittext', u, inset_per+""); 67 | w.g2.add('statictext', u, "(0-100)"); 68 | edt_num_of_side.characters = 4; 69 | edt_inset_per.characters = 4; 70 | 71 | w.btn_g = w.add('group'); 72 | var ok_btn = w.btn_g.add('button', u, "OK", {name: "ok"}); 73 | var can_btn = w.btn_g.add('button', u, "Cancel", {name: "cancel"}); 74 | 75 | ok_btn.minimumSize = can_btn.minimumSize = [66,23]; 76 | ok_btn.size = ok_btn.minimumSize; 77 | can_btn.size = can_btn.minimumSize; 78 | var value_arr; 79 | ok_btn.onClick = function () { 80 | value_arr = [ 81 | Math.floor(edt_num_of_side.text * 1), 82 | Math.floor(edt_inset_per.text * 1) 83 | ]; 84 | if (value_arr[0] >= 3 && value_arr[0] <= 100 && value_arr[1] >= 0 && value_arr[1] <= 100) { 85 | w.close(); 86 | } 87 | else { 88 | alert("out of range or invaid value"); 89 | } 90 | } 91 | 92 | can_btn.onClick = function () { 93 | w.close(); 94 | } 95 | 96 | w.show(); 97 | return value_arr; 98 | } -------------------------------------------------------------------------------- /shape/convert_linear_line_to_swirling_curve.js: -------------------------------------------------------------------------------- 1 | /** 2 | 抽き出し線をくりんとまるめる 3 | "convert linear line to swirling curve" 4 | 5 | 使い方: 6 | ドキュメント上の線または多角形を選んで実行(複数可能)。 7 | オブジェクトの1番目の線をくりんとした曲線に変換します。 8 | 開始点から終了点みて右側にくりんをつくります。 9 | 10 | 動作確認:OS10.4.11 InDesign CS3 11 | 12 | milligramme 13 | www.milligramme.cc 14 | */ 15 | 16 | var selObj = app.selection; 17 | var pi = Math.PI/180; //degree to radian 18 | 19 | for (var i=0; i < selObj.length; i++){ 20 | //線と多角形のみを対象に。 21 | if(selObj[i].constructor.name != "GraphicLine" && selObj[i].constructor.name != "Polygon"){continue} 22 | //多角形のうち孤立点は除外 23 | if(selObj[i].paths[0].pathPoints.length < 2) {continue} 24 | //開始点と終了点(2番目の点)の座標 25 | var stAnch = selObj[i].paths[0].pathPoints[0].anchor; 26 | var enAnch = selObj[i].paths[0].pathPoints[1].anchor; 27 | //中間点の位置の比率。固定値かランダムか 28 | //var ratioMid = 0.5; 29 | var ratioMid = (30+40*Math.random())/100;// 30〜70%の範囲でランダム 30 | 31 | //開始点と終了点間の角度 32 | var theta; 33 | if(enAnch[0]-stAnch[0] == 0 && enAnch[1] > stAnch[0]){ 34 | theta = 90; 35 | } 36 | else if(enAnch[0]-stAnch[0] == 0 && enAnch[1] < stAnch[0]){ 37 | theta = -90; 38 | } 39 | else{ 40 | theta = Math.atan2(enAnch[1]-stAnch[1], enAnch[0]-stAnch[0])/pi; 41 | } 42 | // $.writeln(theta); 43 | //開始点と終了点の距離 44 | var selDist = Math.sqrt (Math.pow(enAnch[0]-stAnch[0], 2)+Math.pow(enAnch[1]-stAnch[1], 2)); 45 | 46 | //中間点の座標 47 | var midAnch = [stAnch[0]+(enAnch[0]-stAnch[0])*ratioMid, stAnch[1]+ (enAnch[1]-stAnch[1])*ratioMid]; 48 | 49 | //開始点からみて右側にくりんをつくる 50 | //ベジェ曲線のコントロールハンドルの座標 51 | var stHandle = enHandle = [midAnch[0]+Math.cos((theta+90)*pi)* selDist*ratioMid , midAnch[1]+Math.sin((theta+90)*pi)*selDist*ratioMid]; 52 | var midHndL = [midAnch[0]+(enAnch[0]-midAnch[0])/2, midAnch[1]+(enAnch[1]-midAnch[1])/2]; 53 | var midHndR = [stAnch[0]+(midAnch[0]-stAnch[0])/2, stAnch[1]+(midAnch[1]-stAnch[1])/2]; 54 | 55 | //くりンとした曲線のための新しい座標の配列を直線のと入れ替える 56 | var nwPath = [[stAnch, stAnch,stHandle],[midHndL,midAnch, midHndR],[enHandle, enAnch, enAnch]]; 57 | selObj[i].paths[0].entirePath=nwPath; 58 | } 59 | -------------------------------------------------------------------------------- /shape/convert_shape.js: -------------------------------------------------------------------------------- 1 | var convOption; 2 | var convOptNo = prompt("1.斜角の四角形 2.内丸角の四角形 3.多角形 \r4.四角形 5.丸角の四角形 6.三角形 7.楕円",4); 3 | 4 | switch(convOptNo){ 5 | case "1": convOption = ConvertShapeOptions.CONVERT_TO_BEVELED_RECTANGLE; break; 6 | case "2": convOption = ConvertShapeOptions.CONVERT_TO_INVERSE_ROUNDED_RECTANGLE; break; 7 | case "3": convOption = ConvertShapeOptions.CONVERT_TO_POLYGON; break; 8 | case "4": convOption = ConvertShapeOptions.CONVERT_TO_RECTANGLE; break; 9 | case "5": convOption = ConvertShapeOptions.CONVERT_TO_ROUNDED_RECTANGLE; break; 10 | case "6": convOption = ConvertShapeOptions.CONVERT_TO_TRIANGLE; break; 11 | case "7": convOption = ConvertShapeOptions.CONVERT_TO_OVAL; break; 12 | default : convOption = ConvertShapeOptions.CONVERT_TO_OVAL; break; 13 | } 14 | 15 | var childrenP = app.selection[0].pageItems; 16 | for(var j = 0; j < childrenP.length; j++){ 17 | childrenP[j].convertShape (convOption, 5, 50, 3);//(convertShapeOption, numberOfSides, insetPercentage, cornerRadius) 18 | } 19 | -------------------------------------------------------------------------------- /shape/fatten_the_line_like_a_calligraphy.js: -------------------------------------------------------------------------------- 1 | /** 2 | 筆書きのように線をふとらせる 3 | 4 | 使い方: 5 | ドキュメント上の線または楕円、四角形、多角形などを選んで実行(複数可能)。 6 | できるだけ3点以上で構成された図形の方が効果的。 7 | パスを複製してランダムな太さの線のようなものにします。 8 | 9 | */ 10 | //パラメーター 11 | //太さの目安、複製したパスの移動量(ランダム) 12 | var aBurrenBow=3; 13 | 14 | var selObj = app.selection; 15 | for (var i = 0; i < app.selection.length; i++){ 16 | 17 | var dupObj = selObj[i].duplicate(); 18 | 19 | //パスを閉じて、両端をとんがらせる 20 | selObj[i].paths[0].pathType = PathType.CLOSED_PATH; 21 | selObj[i].paths[0].pathPoints[0].pointType = PointType.LINE_TYPE; 22 | selObj[i].paths[0].pathPoints[-1].pointType = PointType.LINE_TYPE; 23 | 24 | //パスポイントが3以上なら始点と終点を削除 25 | if(dupObj.paths[0].pathPoints.length >= 3){ 26 | dupObj.paths[0].pathPoints[0].remove(); 27 | dupObj.paths[0].pathPoints[-1].remove(); 28 | } 29 | 30 | var dupRevArray = new Array(); 31 | for(j=dupObj.paths[0].pathPoints.length-1; j >= 0; j--){ 32 | var dupRevPathPoint; 33 | //スムースならばコントロールハンドルも反転 34 | if(dupObj.paths[0].pathPoints[j].pointType == PointType.SMOOTH){ 35 | dupRevPathPoint = [ 36 | randomMove(dupObj.paths[0].pathPoints[j].rightDirection, aBurrenBow), 37 | randomMove(dupObj.paths[0].pathPoints[j].anchor, aBurrenBow), 38 | randomMove(dupObj.paths[0].pathPoints[j].leftDirection, aBurrenBow) 39 | ] 40 | } 41 | else{ 42 | dupRevPathPoint = 43 | randomMove(dupObj.paths[0].pathPoints[j].anchor, aBurrenBow); 44 | } 45 | //パスの配列を反転していく 46 | dupRevArray.push(dupRevPathPoint); 47 | } 48 | //ひっくり返した複製パス配列を元のパス配列と結合して入れ替える。 49 | var jointArray=selObj[i].paths[0].entirePath.concat(dupRevArray); 50 | selObj[i].paths[0].entirePath=jointArray; 51 | 52 | //線に色があればその色にします。なければ[黒]に 53 | if(selObj[i].strokeWeight != 0){ 54 | var currentStrColor = selObj[i].strokeColor; 55 | selObj[i].fillColor = currentStrColor; 56 | selObj[i].strokeColor = "None"; 57 | } 58 | else{ 59 | selObj[i].fillColor = "Black" 60 | } 61 | dupObj.remove(); 62 | } 63 | 64 | function randomMove(anch,dim){ 65 | x = anch[0]-dim+2*dim*Math.random(); 66 | y = anch[1]-dim+2*dim*Math.random(); 67 | return [x, y] 68 | } -------------------------------------------------------------------------------- /style/create_obj_style_w_anchored_obj.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @description アンカー付きオブジェクトだけ設定したオブジェクトスタイルをドキュメントに作る 3 | * 4 | * @param {Object} doc document object 5 | * @param {String} objStyleName object-style name 6 | * @example createObjStyl(app.documents[0],"ancho_only"); 7 | */ 8 | function createObjStyl (doc, objStyleName) { 9 | var objStyle; 10 | try { 11 | objStyle = doc.objectStyles.add({name:objStyleName}); 12 | } 13 | catch(e){ 14 | var rep = confirm("already existed object-style named \'"+objStyleName+"\'.\rdo you replace to this?"); 15 | if(rep){ 16 | //問答無用で置換するなら、confirmとif/elseはいらない。下の一行だけでよし 17 | objStyle = doc.objectStyles.item(objStyleName); 18 | } 19 | else { 20 | alert("replacement was canceled by you"); 21 | exit(); 22 | } 23 | } 24 | with(objStyle){ 25 | //アンカー付きオブジェクトを有効にする 26 | enableAnchoredObjectOptions = true; 27 | //それ以外を無効にしておく 28 | enableParagraphStyle = false; 29 | enableFill = false; 30 | enableStroke = false; 31 | enableStrokeAndCornerOptions = false; 32 | enableTextFrameGeneralOptions = false; 33 | enableTextFrameBaselineOptions = false; 34 | enableStoryOptions = false; 35 | enableTextWrapAndOthers = false; 36 | enableFrameFittingOptions = false; 37 | } 38 | 39 | with(objStyle.anchoredObjectSettings){ 40 | anchoredPosition = AnchorPosition.ANCHORED; 41 | //親の文字からの間隔:カスタム、インライン、行の上 42 | //ANCHORED //INLINE_POSITION //ABOVE_LINE 43 | 44 | anchorXoffset = 0;//Xオフセット(カスタム) 45 | anchorYoffset = 0;//Yオフセット(インライン/カスタム)、後ろスペース(行の上) 46 | anchorSpaceAbove = 0;//前スペース(行の上) 47 | 48 | lockPosition = false;//手動配置を防ぐ 49 | 50 | pinPosition = false;//段の上下境界線内に収める(カスタム) 51 | spineRelative = false;//ノド元を基準(カスタム/行の上) 52 | 53 | anchorPoint = AnchorPoint.CENTER_ANCHOR; 54 | //アンカー付き位置 基準点(カスタム) 55 | //TOP_CENTER_ANCHOR //TOP_LEFT_ANCHOR //TOP_RIGHT_ANCHOR 56 | //CENTER_ANCHOR //LEFT_ANCHOR //RIGHT_ANCHOR 57 | //BOTTOM_CENTER_ANCHOR //BOTTOM_LEFT_ANCHOR //BOTTOM_RIGHT_ANCHOR 58 | 59 | horizontalAlignment = HorizontalAlignment.CENTER_ALIGN; 60 | //揃え(行の上) ノド元に〜〜はspineRelative = true と併用する 61 | //CENTER_ALIGN //LEFT_ALIGN //RIGHT_ALIGN //TEXT_ALIGN 62 | 63 | verticalAlignment = VerticalAlignment.CENTER_ALIGN; 64 | //垂直方向の揃え??? 65 | //BOTTOM,TOPを設定しても、CENTER_ALIGN 1667591796 になる 66 | //BOTTOM_ALIGN //CENTER_ALIGN //TOP_ALIGN 67 | 68 | horizontalReferencePoint = AnchoredRelativeTo.COLUMN_EDGE; 69 | //アンカー付き位置 X基準(カスタム) 70 | //ANCHOR_LOCATION //COLUMN_EDGE //PAGE_EDGE 71 | //PAGE_MARGINS //TEXT_FRAME 72 | 73 | verticalReferencePoint = VerticallyRelativeTo.COLUMN_EDGE; 74 | //アンカー付き位置 Y基準(カスタム) 75 | //CAPHEIGHT //COLUMN_EDGE 76 | //LINE_ASCENT //LINE_BASELINE //LINE_XHEIGHT 77 | //PAGE_EDGE //PAGE_MARGINS 78 | //TEXT_FRAME //TOP_OF_LEADING 79 | } 80 | } -------------------------------------------------------------------------------- /style/deactivate_basic_paragraph_style.js: -------------------------------------------------------------------------------- 1 | //ドキュメント上の基本段落ベースの段落を 2 | //「スタイルとのリンクを切断」して[段落スタイルなし]の 3 | //オーバーライド状態にします。 4 | // 5 | //段落スタイルで[基本段落]をベースにしているものがあれば 6 | //「段落スタイルなし」ベースに変更します。 7 | 8 | var doc=app.documents[0]; 9 | var storyObj=doc.stories; 10 | //段落スタイルを処理 11 | replaceBasedOnBasicParagraphStyle() 12 | //ストーリーと表を処理 13 | for(var i=0, L=storyObj.length; i < L; i++){ 14 | replaceToNoParaStyle (storyObj[i], doc); 15 | 16 | var tableObj=storyObj[i].tables; 17 | for(var ii=0, LL=tableObj.length; ii < LL; ii++){ 18 | replaceToNoParaStyleTable (tableObj[ii], doc) 19 | } 20 | } 21 | 22 | //Function様たち 23 | //Paragraph ごとに[基本段落]を使っていないか調べる。 24 | function replaceToNoParaStyle (target, doc){ 25 | var txstrgObj=target.paragraphs; 26 | for(var itx=0, Ltx=txstrgObj.length; itx < Ltx; itx++){ 27 | if(txstrgObj[itx].appliedParagraphStyle.name=="[基本段落]"){ 28 | //appliedParagraphStyleだとオーバーライドを保持できないので 29 | //applyParagraphStyle()メソッドをオプションfalseで使う 30 | txstrgObj[itx].applyParagraphStyle (doc.paragraphStyles.item("[段落スタイルなし]"), false); 31 | } 32 | } 33 | } 34 | 35 | //表の中での捜索、入れ子の表も捜索。 36 | function replaceToNoParaStyleTable (table, doc){ 37 | var existTable=new Array(); 38 | for(var iCe=0, LCe=table.cells.length; iCe < LCe; iCe++){ 39 | replaceToNoParaStyle (table.cells[iCe], doc); 40 | if(table.cells[iCe].tables.length !=0){//入れ子の表をチェック 41 | existTable.push(iCe);//セル位置を覚えておく 42 | } 43 | } 44 | for(var iExTb=0, LexTb=existTable.length; iExTb < LexTb; iExTb++){ 45 | var inTable=table.cells[existTable[iExTb]].tables; //入れ子の表があるセルの表 46 | for(var inTb=0, LinTb=inTable.length; inTb < LinTb; inTb++){ 47 | replaceToNoParaStyleTable (inTable[inTb], doc); 48 | } 49 | } 50 | } 51 | 52 | // 段落スタイルをチェック 53 | //[基本段落]ベースの段落スタイルを[段落スタイルなし]ベースにリセット 54 | function replaceBasedOnBasicParagraphStyle(){ 55 | var paraStyle=doc.paragraphStyles; 56 | for(var j=0, K=paraStyle.length; j < K; j++){ 57 | if(paraStyle[j].name !="[段落スタイルなし]"){ 58 | if(paraStyle[j].basedOn==doc.paragraphStyles.item("[基本段落]")){ 59 | paraStyle[j].basedOn=doc.paragraphStyles.item("[段落スタイルなし]"); 60 | } 61 | } 62 | } 63 | } 64 | 65 | -------------------------------------------------------------------------------- /style/get_nested_style.js: -------------------------------------------------------------------------------- 1 | /** 2 | * get nested character styles from paragraph style 3 | */ 4 | get_nested_char_style(app.selection[0].appliedParagraphStyle); 5 | 6 | function get_nested_char_style (p_style) { 7 | var nst_arr = []; 8 | var nst_style = p_style.nestedStyles; 9 | for (var i=0; i < nst_style.length; i++) { 10 | nst_arr.push(nst_style[i].appliedCharacterStyle); 11 | }; 12 | return nst_arr 13 | } 14 | -------------------------------------------------------------------------------- /style/paragraphstyle_apply_test.js: -------------------------------------------------------------------------------- 1 | //paragraph style test 2 | //appliedParagraphStyle と applyParagraphStyle() 3 | 4 | 5 | var doc = app.documents[0]; 6 | var tfr = doc.textFrames; //3 textframes exist 7 | var p_style = doc.paragraphStyles.itemByName("blue"); 8 | 9 | tfr[0].parentStory.texts[0].applyParagraphStyle (p_style, false); 10 | tfr[0].parentStory.insertionPoints[0].contents = "1::"; 11 | 12 | tfr[1].parentStory.texts[0].applyParagraphStyle (p_style, true); 13 | tfr[1].parentStory.insertionPoints[0].contents = "2::"; 14 | 15 | tfr[2].parentStory.texts[0].appliedParagraphStyle = p_style; 16 | tfr[2].parentStory.insertionPoints[0].contents = "3::"; 17 | 18 | -------------------------------------------------------------------------------- /style/relative_size_checker.js: -------------------------------------------------------------------------------- 1 | /** 2 | * relative size check in styles 3 | * 4 | * 2010-11-30 mg 5 | */ 6 | if (app.documents.length === 0) { 7 | exit(); 8 | }; 9 | var docObj = app.documents[0]; 10 | var p_sty = docObj.paragraphStyles; 11 | var c_sty = docObj.characterStyles; 12 | 13 | 14 | var dlg = new Window('dialog', "relative size check", undefined); 15 | 16 | // group and panel 17 | dlg.pnl = dlg.add('panel'); 18 | dlg.pnl.alignChildren = 'left'; 19 | 20 | 21 | // in p_grp 22 | var p_grp = dlg.pnl.add('group'); 23 | var p_tag = p_grp.add('statictext', undefined, "ParagraphStyle: "); 24 | var p_ddl = p_grp.add('dropdownlist', [0,0,160,22], p_sty.everyItem().name); 25 | p_tag.characters = 15; 26 | 27 | // in c_grp 28 | var c_grp = dlg.pnl.add('group'); 29 | c_tag = c_grp.add('statictext', undefined, "CharcterStyle: "); 30 | var c_ddl = c_grp.add('dropdownlist', [0,0,160,22], c_sty.everyItem().name); 31 | c_tag.characters = 15; 32 | 33 | // in rsl_grp 34 | var rsl_grp = dlg.pnl.add('group'); 35 | rsl_grp.alignChildren = 'bottom'; 36 | var result_edt = rsl_grp.add('edittext',[0,0,320,240], "result here", {multiline: true}); 37 | 38 | var btn_grp = rsl_grp.add('group'); 39 | btn_grp.orientation = 'column'; 40 | 41 | // disable 42 | // var sel_all_btn = btn_grp.add('button', undefined, "Select All"); 43 | 44 | var export_btn = btn_grp.add('button', undefined, "Export", {name: "ok"}); 45 | var can_btn = btn_grp.add('button', undefined, "Cancel", {name: "cancel"}); 46 | 47 | p_ddl.onChange = function () { 48 | var p_base = p_ddl.selection.index; 49 | var base_pointsize = p_sty[p_base].pointSize; 50 | var rest = []; 51 | for (var i=0, iL=p_sty.length; i < iL ; i++) { 52 | var is_base = i === p_base ? "\t[[BASE]]" : ""; 53 | rest.push( 54 | p_sty[i].name + ": \t" + 55 | Math.round(p_sty[i].pointSize / base_pointsize * 10000) / 100 + "%" + is_base); 56 | }; 57 | result_edt.text = rest.join('\r'); 58 | }; 59 | 60 | c_ddl.onChange = function () { 61 | var c_base = c_ddl.selection.index; 62 | //if point size isnt defined set 0 63 | var base_pointsize = c_sty[c_base].pointSize === NothingEnum.NOTHING ? 0 : c_sty[c_base].pointSize; 64 | var rest = []; 65 | if (base_pointsize == 0) { 66 | rest.push("!!! [[BASE]] style doesn\'t have point size value !!!"); 67 | } 68 | else{ 69 | for (var i=0, iL=c_sty.length; i < iL ; i++) { 70 | var is_base = i === c_base ? "\t[[BASE]]" : ""; 71 | var tar_pointsize = c_sty[i].pointSize === NothingEnum.NOTHING ? 0 : c_sty[i].pointSize; 72 | rest.push( 73 | c_sty[i].name + ": \t" + 74 | Math.round(tar_pointsize / base_pointsize * 10000) / 100 + "%" + is_base); 75 | }; 76 | } 77 | result_edt.text = rest.join('\r'); 78 | }; 79 | 80 | // disable 81 | // sel_all_btn.onClick = function () { 82 | // result_edt.active = true; 83 | // }; 84 | 85 | export_btn.onClick = function () { 86 | ex_string = result_edt.text; 87 | flg = 1; 88 | dlg.close(); 89 | }; 90 | 91 | can_btn.onClick = function () { 92 | flg = 0; 93 | dlg.close(); 94 | }; 95 | 96 | dlg.show(); 97 | if (flg === 1) { 98 | //export report 99 | export_path = File.saveDialog('choose save location'); 100 | if (export_path !== undefined) { 101 | fileObj = new File(export_path); 102 | fileObj.encoding = 'UTF8'; 103 | if(fileObj.open('w') == true){ 104 | fileObj.write(ex_string); 105 | fileObj.close(); 106 | }; 107 | } 108 | }; -------------------------------------------------------------------------------- /swatch_color/create_gradient_swatch.js: -------------------------------------------------------------------------------- 1 | /* 2 | 選択したかラーチップの塗りでグラデーション作成 3 | "make gradient by color objects 4 | id_MKGR.jsx 5 | 6 | 使い方: 7 | グラーデーションを構成したい色のカラーチップをページ内に配置し、選択して実行します。 8 | カラーチップの並べ方(スプレッド内の位置)でグラデーションストップの位置が決まります。 9 | カラーチップが楕円なら、グラデーションタイプは「円形」、それ以外は「線形」になります。 10 | グラデーションのサンプル作成後、グラデーション名を設定するダイアログがでます。 11 | 12 | 注意: 13 | 選択したカラーチップが同じX座標だと、ぱっきりグラデーションができます。 14 | スウォッチとして保存されていない濃淡付きスウォッチは濃度100%扱いになります。 15 | カラーチップがグラデーションの場合[黒]扱い、塗り[なし]は[紙色]扱いになります。 16 | グループ化したカラーチップではエラーになります。 17 | 18 | 19 | 動作確認:OS10.4.11 InDesign CS2、CS3 20 | 21 | milligramme(mg) 22 | www.milligramme.cc 23 | */ 24 | 25 | 26 | //おまじない 27 | app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll; 28 | 29 | (function(){ 30 | var docObj = app.activeDocument; 31 | var pgWidth = docObj.documentPreferences.pageWidth; 32 | 33 | if(app.selection.length < 2){ 34 | alert("色付きカラーチップを2個以上選択して下さい。"); 35 | } 36 | else{ 37 | //ルーラー原点をバックアップして「スプレッドに」 38 | var rulerBk = docObj.viewPreferences.rulerOrigin; 39 | var rulerTemp = 1380143983; 40 | docObj.viewPreferences.rulerOrigin = rulerTemp; 41 | 42 | var selObj = docObj.selection; 43 | var count = selObj.length; 44 | 45 | //選択したカラーチップのあるページの親スプレッド内の子ページの数 46 | var parentPg = selObj[0].parent; 47 | var pageCntInSpred = parentPg.parent.pages.length; 48 | 49 | //グラデーションストップを作成。グラデーションを作成すると、 50 | //既に2つのストップが存在するのでその分を引いた数をつくる。 51 | var grObj = docObj.gradients.add(); 52 | var grStp = grObj.gradientStops; 53 | for(var i = 0; i < count-2; i++){ 54 | grStp.add(); 55 | } 56 | 57 | for(var j = 0; j < count; j++){ 58 | var selX = selObj[j].geometricBounds[1]; 59 | //PB上のカラーチップはそれぞれ、ページの端に丸め込みます。 60 | if(selX < 0){ 61 | selX = 0; 62 | } 63 | else if(selX > pgWidth*pageCntInSpred){ 64 | selX = pgWidth*pageCntInSpred; 65 | } 66 | var selColr = selObj[j].fillColor; 67 | //塗り[なし]とグラデーションの時の処理 68 | //[なし]は[紙色]、グラデーションは[黒]に。 69 | switch(selColr.constructor.name){ 70 | case "Swatch": 71 | selColr = docObj.swatches.item("Paper"); 72 | break; 73 | case "Gradient": 74 | selColr = docObj.swatches.item("Black"); 75 | break; 76 | } 77 | grStp[j].stopColor = selColr; 78 | grStp[j].location = 100*selX/(pgWidth*pageCntInSpred); 79 | } 80 | 81 | //グラデーションサンプル作成と名前設定ダイアログ 82 | var rectObj = docObj.rectangles.add(); 83 | rectObj.geometricBounds = [30,30,100,150]; 84 | rectObj.fillColor = grObj; 85 | 86 | //命名空欄またはキャンセルなら「新規グラデーションスウォッチ〜〜」 87 | var setName = prompt("命名",""); 88 | if(setName != null){ 89 | grObj.name = setName; 90 | } 91 | 92 | //カラーチップが楕円ならば、グラデーションタイプを「円形」にする 93 | switch(selObj[0].constructor.name){ 94 | case "Rectangle": 95 | case "Polygon": 96 | case "TextFrame": 97 | case "GraphicLine": 98 | grTyp = 1635282023; break;//linear(線形); 99 | case "Oval": 100 | grTyp = 1918985319; break;// radial(円形); 101 | } 102 | //作ったグラデーションのタイプを設定 103 | var grID = grObj.id; 104 | docObj.gradients.itemByID(grID).type = grTyp; 105 | 106 | //ルーラーを戻す。 107 | docObj.viewPreferences.rulerOrigin = rulerBk; 108 | 109 | } 110 | })(); -------------------------------------------------------------------------------- /swatch_color/invert_color.js: -------------------------------------------------------------------------------- 1 | /* 2 | 疑似補色 3 | "invert cmyk colors" 4 | 5 | 使い方: 6 | オブジェクトを選択して実行 7 | 選択中のオブジェクトの補色オブジェクトとスウォッチを作成します。 8 | 特色、塗りなし、白、黒、レジストレーションは処理しません。 9 | CMYK→RGB→補色RGB→CMYK変換しているので、厳密な補色ではありませんので実行後に調整してください。 10 | 同じ色のオブジェクトで実行すると同名補色スウォッチの上書きをしません。増えます。 11 | 12 | 動作確認:OS10.4.11 InDesign CS3 13 | 14 | milligramme 15 | www.milligramme.cc 16 | */ 17 | var doc = app.documents[0]; 18 | var selObj = doc.selection; 19 | if(selObj.length! = 0){ 20 | for(var i = 0; i 0){ 16 | for(var i = 0; i < swatch_obj.length; i++){ 17 | switch(swatch_obj[i].name){ 18 | case "None": 19 | case "Paper": 20 | case "Black": 21 | case "Registration": 22 | break; 23 | default : 24 | otherSwList.push (swatch_obj[i].name); 25 | } 26 | } 27 | } 28 | return otherSwList 29 | } -------------------------------------------------------------------------------- /table_and_cell/cell_merge.js: -------------------------------------------------------------------------------- 1 | var doc=app.documents.add(); doc.textFrames.add({geometricBounds:[20,20,100,100]}); var table=doc.textFrames[0].tables.add(); table.bodyRowCount=16; table.columnCount=4; for(var i=0; i0){alert("失敗しました")} -------------------------------------------------------------------------------- /table_and_cell/cell_merge_cs2.js: -------------------------------------------------------------------------------- 1 | (function(){ var selObj = app.selection[0]; //選択した行が2つ以上のときに処理する。 var rowLng = selObj.rows.length; if(rowLng >= 2){ var baseCell=selObj.cells[0].name.split(":"); //セルの開始位置 var baseCe=baseCell[1]-=0;//ゼロをひいて数値にする var colObj=selObj.columns; for(var co=0; co < colObj.length; co++){ /////CS2用 var empArr=[];//空セル用配列 for(var ce=rowLng+baseCe-1; ce >= baseCe; ce--){ if(colObj[co].cells[ce].contents ==""){ empArr.push(ce);//空セルのceを入れておく } else{ colObj[co].cells[ce].merge(colObj[co].cells[empArr[0]]); empArr=[];//初期化 } } } alert("Merge completes"); } else{alert("Select 2 rows at least");} })(); -------------------------------------------------------------------------------- /table_and_cell/export_contents_to_plaintext.js: -------------------------------------------------------------------------------- 1 | app.documents[0].stories.everyItem().tables.everyItem().convertToText("\t", "\r"); app.documents[0].stories.everyItem().contents; -------------------------------------------------------------------------------- /table_and_cell/insert_text_to_table.js: -------------------------------------------------------------------------------- 1 | //選択した表の本文行にデータ流し込み 2 | //表全体か一部を選択して実行 3 | 4 | //列が足りなければログに書き出し 5 | //行が足りなければセルを追加 6 | 7 | //var st=new Date().getTime(); 8 | if(app.documents.length > 0 && app.selection.length = 1) 9 | (function(){ 10 | var selObj=app.selection[0];//tableを選択 11 | var tableObj; 12 | switch(selObj.constructor.name){ 13 | case "Table": tableObj=selObj ; break; 14 | case "Cell" : tableObj=selObj.parent; break; 15 | default : 16 | alert("please select any cell of table to place the data"); 17 | exit();//セルやテーブル以外では抜ける 18 | break; 19 | } 20 | //本文行、ヘッダ行、フッダ行 21 | var rowObj=tableObj.rows; 22 | var hRowLength=tableObj.headerRowCount; 23 | var bRowLength=tableObj.bodyRowCount; 24 | 25 | //タブ区切りテキストを選択して読み込む、二次配列にする 26 | var filePath= File.openDialog("please select tab separated text"); 27 | if(filePath){ 28 | var fileObj=new File(filePath); 29 | var flg=fileObj.open("r"); 30 | if(flg){ 31 | var impoLine=new Array(); 32 | while(!fileObj.eof){ 33 | impoLine.push(fileObj.readln().split("\t")); 34 | } 35 | fileObj.close(); 36 | } 37 | } 38 | //読み込んだソースと表の本文行の数を比較して行数を調整する 39 | var n=impoLine.length-bRowLength; 40 | tableObj.bodyRowCount=bRowLength+n; 41 | //オーバーフロー箇所の書き出しのための配列 42 | var elog=new Array(); 43 | for(var r=0, rL=tableObj.bodyRowCount; r < rL; r++){ 44 | for(var c=0, cL=rowObj[r].cells.length; c < cL; c++){ 45 | //読み込んだソースをタブで分割して各セルに配置 46 | try{rowObj[r+hRowLength].cells[c].texts[0].contents= impoLine[r][c];} 47 | catch(e){rowObj[r+hRowLength].cells[c].texts[0].contents="";} 48 | } 49 | } 50 | for(var r=0, rL=tableObj.bodyRowCount; r < rL; r++){ 51 | //表の列がソースよりも足りない場合オーバーフローした箇所を書き出す 52 | var spn=impoLine[r].length; 53 | if(rowObj[r+hRowLength].cells.length < spn){ 54 | elog.push("line:" +(r+1)+"\t"+" OV= " +impoLine[r].splice(rowObj[r].cells.length, spn)+" \r" ); 55 | } 56 | } 57 | //$.writeln(" elog="+elog.length); 58 | //オーバーフロー内容を書き出し 59 | if(elog.length > 0){ 60 | var logFileObj= new File("~/Desktop/overflow"+new Date().getTime().toString()+".txt"); 61 | if(logFileObj){ 62 | logFlg=logFileObj.open("w"); 63 | if(logFlg){ 64 | logFileObj.write(elog.toString()); 65 | logFileObj.close() 66 | alert("there has been overflowing lines \r logfile =>"+logFileObj); 67 | } 68 | } 69 | } 70 | })(); 71 | 72 | //var en=new Date().getTime(); 73 | //$.writeln((en-st)/1000+"sec"); 74 | -------------------------------------------------------------------------------- /table_and_cell/is_cells_merged.js: -------------------------------------------------------------------------------- 1 | //id cells merged check 2 | function cell_merged_check (cell_obj) { 3 | var merge_checker = new Array(); 4 | for(var i=0; i < cell_obj.length; i++){ 5 | merge_checker.push(1); 6 | } 7 | if(cell_obj.everyItem().columnSpan == merge_checker.toString()){ 8 | return false; 9 | } 10 | else{ 11 | return true; 12 | } 13 | } -------------------------------------------------------------------------------- /table_and_cell/set_cells_size_keep_whole.js: -------------------------------------------------------------------------------- 1 | /** 2 | 表全体幅を維持して、選択セル幅を足したり引いたり 3 | "increase / decrease cell width with keep table width" 4 | 5 | 使い方: 6 | 表選択範囲の中でマスターとスレイブのセルを設定し増減値を決めて実行。 7 | マスターで足した値を、スレイブで引きます。 8 | 9 | 実行条件: 10 | 表またはセルを選択している 11 | 選択範囲内に結合セルを含まないこと 12 | 1行のみ選択していること 13 | 14 | 動作確認:OS10.4.11 InDesign CS3 15 | 16 | milligramme 17 | www.milligramme.cc 18 | */ 19 | if(app.documents.length==0 || app.selection.length==0){exit();} 20 | 21 | var docObj=app.documents[0]; 22 | var selObj=app.selection[0]; 23 | switch(selObj.constructor.name){ 24 | case "Table": 25 | case "Cell": 26 | if(selObj.rows.length==1){ 27 | dlg(selObj); 28 | } 29 | else{ 30 | alert("select only one rows"); 31 | exit(); 32 | } 33 | break; 34 | default :// TableとCell以外は無視 35 | alert("select Tables or Cells"); 36 | break; 37 | } 38 | 39 | function dlg(selObj){ 40 | var cellObj=selObj.cells; 41 | 42 | var Dlg=app.dialogs.add({name:"cell width adjuster", canCancel: true}); 43 | with(Dlg){ 44 | with(dialogColumns.add()){ 45 | with(borderPanels.add()){ 46 | staticTexts.add({staticLabel: "incremental / decremental value "}); 47 | var adjustVal=realEditboxes.add({ 48 | editValue: 0, //増減値の初期値 49 | largeNudge: 0.5, //シフト押しながらの↑↓カーソルキーでの増減 50 | smallNudge: 0.1 //↑↓カーソルキーでの増減 51 | }); 52 | }// with borderpanel 1 53 | with(borderPanels.add()){ 54 | staticTexts.add({staticLabel:"MasterCell"}) 55 | var masterCell=integerEditboxes.add({ 56 | editValue: 1, 57 | minimumValu: 1, 58 | maximumValue: cellObj.length, 59 | smallNudge: 1 60 | }); 61 | staticTexts.add({staticLabel:"SlaveCell"}) 62 | var slaveCell=integerEditboxes.add({ 63 | editValue: Math.min(2, cellObj.length), 64 | minimumValu: 1, 65 | maximumValue: cellObj.length, 66 | smallNudge: 1 67 | }); 68 | }// with borderpanel 2 69 | }// with dialogcolumn 70 | }// with Dlg 71 | 72 | if(Dlg.show()==true){ 73 | var val=adjustVal.editValue; 74 | var master=masterCell.editValue; 75 | var slave=slaveCell.editValue; 76 | adjustCellWidth(cellObj, val, master, slave); 77 | Dlg.destroy(); 78 | } 79 | else{ 80 | Dlg.destroy(); 81 | exit(); 82 | } 83 | } 84 | function adjustCellWidth(cellObj, val, master, slave){ 85 | //ここがご本尊 86 | //セルが結合してないかチェック 87 | var mergeChecker=new Array(); 88 | for(var i=0; i < cellObj.length; i++){ 89 | mergeChecker.push(1); 90 | } 91 | if(cellObj.everyItem().columnSpan==mergeChecker.toString()){ 92 | //小さくなりすぎた時のための予防 93 | masterBk=cellObj[master-1].width; 94 | slaveBk=cellObj[slave-1].width; 95 | try{ 96 | cellObj[master-1].width+=val; 97 | } 98 | catch(e){ 99 | cellObj[master-1].width=masterBk; 100 | alert("master cell width can not be decreased"); 101 | exit(); 102 | } 103 | try{ 104 | cellObj[slave-1].width-=val; 105 | } 106 | catch(e){ 107 | cellObj[master-1].width=masterBk; 108 | cellObj[slave-1].width=slaveBk; 109 | alert("slave cell width can not be decreased"); 110 | } 111 | } 112 | else{alert("select unmerged cells");} 113 | }//function 114 | 115 | 116 | -------------------------------------------------------------------------------- /table_and_cell/set_cells_size_w_calc.js: -------------------------------------------------------------------------------- 1 | /** 2 | * cells size setter (with cals) 3 | * 4 | */ 5 | if(app.documents.length == 0 || app.selection.length == 0){exit();} 6 | 7 | var cellColumn, cellRow; 8 | selObj = app.selection[0]; 9 | switch(selObj.constructor.name){ 10 | case "Table": 11 | cellColumn = selObj.columnCount; 12 | cellRow = selObj.bodyRowCount + selObj.headerRowCount + selObj.footerRowCount; 13 | break; 14 | case "Cell": 15 | cellColumn = selObj.columnSpan; 16 | cellRow = selObj.rowSpan; 17 | break; 18 | default :// TableとCell以外は無視 19 | alert("choose table or cells"); 20 | exit(); 21 | } 22 | 23 | set_cells_size (selObj, cellColumn, cellRow); 24 | 25 | function set_cells_size (selObj, cellColumn, cellRow) { 26 | //結合セルも個別セルとして幅と高さを取得 27 | var eachCellW = selObj.columns.everyItem().width; 28 | var eachCellH = selObj.rows.everyItem().height; 29 | 30 | //edittextの大きさ,パネルのマージンなどを設定 31 | var editbox = {'w': 60, 'h': 20}; //edittextの大きさ 32 | var startPt; //edittext作成の開始点 33 | var pnlMargin = [10,10,10,15]; //パネルのマージン 34 | var gutter = 5; //edittextの間隔 35 | var wArr = []; 36 | var hArr = []; 37 | 38 | var dlg = new Window('dialog',"cells size setter",undefined); 39 | dlg.pnl = dlg.add('panel',undefined);//サイズは仮 40 | 41 | //幅用のedittext 42 | startPt = [pnlMargin[0], pnlMargin[1]]; 43 | startPt[0] += editbox['w'] + gutter;//開始点を右にずらす 44 | 45 | for (var ic=0; ic < cellColumn; ic++) { 46 | var wValue = dlg.pnl.add('edittext',[startPt[0], startPt[1], startPt[0]+editbox['w'], startPt[1]+editbox['h']],eachCellW[ic]); 47 | startPt[0] = startPt[0] + editbox['w'] + gutter; 48 | wArr.push(wValue); 49 | } 50 | var pnlW = startPt[0]+pnlMargin[2];//dlg.pnl width 51 | 52 | //高さ用のedittext 53 | startPt = [pnlMargin[0], pnlMargin[1]]; 54 | startPt[1] += editbox['h'] + gutter;//開始点を下にずらす 55 | 56 | for (var ir=0; ir < cellRow; ir++) { 57 | var hValue = dlg.pnl.add('edittext',[startPt[0], startPt[1], startPt[0]+editbox['w'], startPt[1]+editbox['h']],eachCellH[ir]); 58 | startPt[1] = startPt[1] + editbox['h'] + gutter; 59 | hArr.push(hValue); 60 | } 61 | var pnlH = startPt[1]+pnlMargin[3];//dlg.pnl height 62 | 63 | dlg.pnl.bounds = [0, 0, pnlW, pnlH];//パネルのサイズを設定 64 | 65 | dlg.grp = dlg.add('group') 66 | dlg.okButton = dlg.grp.add('button',undefined,'ok',{name: 'ok'}); 67 | dlg.cancelButton = dlg.grp.add('button',undefined,'cancel',{name: 'cancel'}); 68 | 69 | dlg.okButton.onClick = function(){ 70 | dlg.close(); 71 | flg = true; 72 | } 73 | dlg.cancelButton.onClick = function(){ 74 | dlg.close(); 75 | flg = false; 76 | } 77 | dlg.center(); 78 | dlg.show(); 79 | 80 | if(flg == true){ 81 | for (var iw=0; iw < wArr.length; iw++) { 82 | if (eval(wArr[iw].text)*1 > 0) { 83 | selObj.columns[iw].width = eval(wArr[iw].text) * 1; 84 | } 85 | } 86 | for (var ih=0; ih < hArr.length; ih++) { 87 | if (eval(hArr[ih].text)*1 > 0) { 88 | selObj.rows[ih].autoGrow = false; 89 | selObj.rows[ih].height = eval(hArr[ih].text) * 1; 90 | } 91 | } 92 | } 93 | } -------------------------------------------------------------------------------- /tagged_text/export_tagged_text_and_putback.js: -------------------------------------------------------------------------------- 1 | #include "hira_kana_upcase.js" 2 | 3 | export_tagged_text_and_putback(app.selection[0].parentStory, "h_k_up"); 4 | 5 | /** 6 | * export tagged text, do something and put it back 7 | * 8 | * @param {Object} story Story 9 | * @param {String} method Switch included .js 10 | * 11 | * return Array to included js 12 | * included js must return String 13 | */ 14 | function export_tagged_text_and_putback (story, method) { 15 | var path = app.activeScript.parent; 16 | 17 | //export tagged text 18 | with(app.taggedTextExportPreferences){ 19 | characterSet = TagTextExportCharacterSet.SHIFT_JIS; 20 | tagFrom = TagTextForm.VERBOSE; 21 | } 22 | var tmp_file = File( path + "/_tmp.txt" ); 23 | story.exportFile(ExportFormat.TAGGED_TEXT, tmp_file); 24 | 25 | // read tagged text 26 | var a_arr = []; 27 | tmp_file.encoding = "SHIFT_JIS"; 28 | if (tmp_file.open('r')) { 29 | while(! tmp_file.eof){ 30 | a_arr.push( tmp_file.readln() ); 31 | } 32 | }; 33 | tmp_file.close(); 34 | var src; 35 | 36 | switch(method){ 37 | case "h_k_up": src = hira_kata_upcase (a_arr); break; 38 | // case "h2k": Do_something; break; 39 | // case "k2h": Do_something; break; 40 | default: ; break; 41 | } 42 | 43 | var rev_file = File(path+"/_rest.txt"); 44 | rev_file.encoding = "SHIFT_JIS"; 45 | rev_file.lineFeed = "UNIX"; 46 | rev_file.open('w'); 47 | rev_file.write(src); 48 | rev_file.close(); 49 | 50 | // import tagged text 51 | with(app.taggedTextImportPreferences){ 52 | removeTextFormatting = false; 53 | styleConflict = StyleConflict.PUBLICATION_DEFINITION; 54 | useTypographersQuotes = true; 55 | } 56 | // remove original story and place new 57 | story.remove(); 58 | story.parent.place(rev_file, /*showing-option*/false); 59 | 60 | // remove temp files 61 | tmp_file.remove(); 62 | rev_file.remove(); 63 | } 64 | -------------------------------------------------------------------------------- /tagged_text/hira_kata_upcase.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @param {Array} arr Array of InDesign Tagged Text 3 | * @returns {String} InDesign Tagged Text 4 | */ 5 | function hira_kata_upcase (arr) { 6 | var a_arr = arr; 7 | var c_arr = []; 8 | for (var ai=0, aiL=a_arr.length; ai < aiL ; ai++) { 9 | b_arr = a_arr[ai].replace(/>/g,">\n").split('\n'); 10 | for (var bi=0, biL=b_arr.length; bi < biL ; bi++) { 11 | // replace rubystrings 12 | if (b_arr[bi].match(//) !== null){ 13 | b_arr[bi] = b_arr[bi] 14 | .replace(/ぁ/g,'あ') 15 | .replace(/ぃ/g,'い') 16 | .replace(/ぅ/g,'う') 17 | .replace(/ぇ/g,'え') 18 | .replace(/ぉ/g,'お') 19 | .replace(/っ/g,'つ') 20 | .replace(/ゃ/g,'や') 21 | .replace(/ゅ/g,'ゆ') 22 | .replace(/ょ/g,'よ') 23 | .replace(/ァ/g,'ア') 24 | .replace(/ィ/g,'イ') 25 | .replace(/ゥ/g,'ウ') 26 | .replace(/ェ/g,'エ') 27 | .replace(/ォ/g,'オ') 28 | .replace(/ッ/g,'ツ') 29 | .replace(/ャ/g,'ヤ') 30 | .replace(/ュ/g,'ユ') 31 | .replace(/ョ/g,'ヨ'); 32 | } 33 | }; 34 | // reconstruct tagged text 35 | c_arr.push(b_arr.join('')); 36 | }; 37 | var src = c_arr.join('\n'); 38 | return src 39 | } -------------------------------------------------------------------------------- /text_edit/add_parenthesis_pair.js: -------------------------------------------------------------------------------- 1 | /** 2 | * add parenthesis 3 | * 4 | * 2010-11-22. 5 | */ 6 | #targetengine "session" 7 | if (app.documents.length === 0){ 8 | exit(); 9 | } 10 | var pare_arr = [ 11 | "()", //0 12 | "「」", //1 13 | "【】", //2 14 | "《》", //3 15 | "『』", //4 16 | "“”", //5 17 | "〝〟", //6 18 | "[]", //7 19 | "{}", //8 20 | "〔〕", //9 21 | "〈〉", //10 22 | // "" //11 23 | ]; 24 | 25 | //selection option 26 | //0: select source text with parenthesis, 1: insert cursole into forward of source text 27 | var after_touch = 1; 28 | 29 | var plt = new Window('palette', "Wrap with?", undefined); 30 | plt.bt_grp1 = plt.add('group'); 31 | plt.bt_grp2 = plt.add('group'); 32 | plt.bt_grp3 = plt.add('group'); 33 | 34 | var par00_btn = plt.bt_grp1.add('button', [0,0,23,23], pare_arr[0]); 35 | var par01_btn = plt.bt_grp1.add('button', [0,0,23,23], pare_arr[1]); 36 | var par02_btn = plt.bt_grp1.add('button', [0,0,23,23], pare_arr[2]); 37 | var par03_btn = plt.bt_grp1.add('button', [0,0,23,23], pare_arr[3]); 38 | var par04_btn = plt.bt_grp2.add('button', [0,0,23,23], pare_arr[4]); 39 | var par05_btn = plt.bt_grp2.add('button', [0,0,23,23], pare_arr[5]); 40 | var par06_btn = plt.bt_grp2.add('button', [0,0,23,23], pare_arr[6]); 41 | var par07_btn = plt.bt_grp2.add('button', [0,0,23,23], pare_arr[7]); 42 | var par08_btn = plt.bt_grp3.add('button', [0,0,23,23], pare_arr[8]); 43 | var par09_btn = plt.bt_grp3.add('button', [0,0,23,23], pare_arr[9]); 44 | var par10_btn = plt.bt_grp3.add('button', [0,0,23,23], pare_arr[10]); 45 | var par11_btn = plt.bt_grp3.add('button', [0,0,23,23], pare_arr[11]); 46 | 47 | //callback (duplicated) 48 | par00_btn.onClick = function(){ 49 | wrap_with_parenthesis (app.selection[0], this.text, after_touch); 50 | } 51 | par01_btn.onClick = function(){ 52 | wrap_with_parenthesis (app.selection[0], this.text, after_touch); 53 | } 54 | par02_btn.onClick = function(){ 55 | wrap_with_parenthesis (app.selection[0], this.text, after_touch); 56 | } 57 | par03_btn.onClick = function(){ 58 | wrap_with_parenthesis (app.selection[0], this.text, after_touch); 59 | } 60 | par04_btn.onClick = function(){ 61 | wrap_with_parenthesis (app.selection[0], this.text, after_touch); 62 | } 63 | par05_btn.onClick = function(){ 64 | wrap_with_parenthesis (app.selection[0], this.text, after_touch); 65 | } 66 | par06_btn.onClick = function(){ 67 | wrap_with_parenthesis (app.selection[0], this.text, after_touch); 68 | } 69 | par07_btn.onClick = function(){ 70 | wrap_with_parenthesis (app.selection[0], this.text, after_touch); 71 | } 72 | par08_btn.onClick = function(){ 73 | wrap_with_parenthesis (app.selection[0], this.text, after_touch); 74 | } 75 | par09_btn.onClick = function(){ 76 | wrap_with_parenthesis (app.selection[0], this.text, after_touch); 77 | } 78 | par10_btn.onClick = function(){ 79 | wrap_with_parenthesis (app.selection[0], this.text, after_touch); 80 | } 81 | 82 | plt.show(); 83 | 84 | /** 85 | * wrap with parenthesis 86 | * 87 | * @param {Object} sel TextObject (exclude InsertionPoint) 88 | * @param {String} with_what Parenthesis pair 89 | * @param {Number} after_touch 0: Select with parenthesis, 1: Insert after parenthesis 90 | */ 91 | function wrap_with_parenthesis (sel, with_what, after_touch) { 92 | if (sel.hasOwnProperty('baseline') && sel.constructor.name !== 'InsertionPoint') { 93 | if (check_if_return(sel.contents) === 0) { 94 | return 95 | }; 96 | else{ 97 | var mode = check_if_return(sel.contents); 98 | } 99 | sel.insertionPoints[-mode].contents = with_what; 100 | var sel2 = app.selection[0];// sel + with_what(st, en) 101 | sel2.characters[-mode -1].duplicate(LocationOptions.before, sel2.insertionPoints[0]);//with_what(st) + sel + with_what(st, en) 102 | sel2.characters[-mode].remove(); // with_what(st) + sel + with_what(en) 103 | if (after_touch === 0) { 104 | app.selection = sel2.insertionPoints[-mode]; 105 | } 106 | else if (after_touch === 1){ 107 | app.selection = sel2.texts[0]; 108 | } 109 | }; 110 | } 111 | /** 112 | * check tail is return? 113 | * 114 | * @param {String} str any string 115 | * @returns {Number} 0: for dont work, 2: returns, 1: others 116 | */ 117 | function check_if_return (str) { 118 | if (str.length > 1 && str.charCodeAt(str.length-1).toString(16) === "d"){ 119 | return 2 120 | } //return 121 | if (str.length > 1 && str.charCodeAt(str.length-1).toString(16) === "a"){ 122 | return 2 123 | } //forced line break 124 | if (str.length === 1 && str.charCodeAt(str.length-1).toString(16) === "d"){ 125 | return 0 126 | } 127 | if (str.length === 1 && str.charCodeAt(str.length-1).toString(16) === "a"){ 128 | return 0 129 | } 130 | else{ 131 | return 1 132 | } //other character 133 | } -------------------------------------------------------------------------------- /text_edit/each_outline.js: -------------------------------------------------------------------------------- 1 | var doc = app.documents[0]; 2 | outline_each_char(doc, false); 3 | 4 | /** 5 | * outline each character 6 | * 7 | * 個別にテキストグラフィック化 8 | * 9 | * 使い方: 10 | * テキストフレームまたは範囲選択して実行。 11 | * テキストフレーム内の各文字、選択範囲の各文字を個別にグラフィック化。 12 | * ちょっと位置をずらして複製します。 13 | * グラフィック化後のオブジェクトのオーバープリントは勝手にオフにします。 14 | * 15 | * @param {Object} doc Document 16 | * @param {Boolean} remove_org If true remove original text 17 | */ 18 | function outline_each_char (doc, remove_org) { 19 | // selection check 20 | if (doc.selection.length !== 1) {return}; 21 | var sel_obj = doc.selection[0]; 22 | if (sel_obj.constructor.name === "InsertionPoint") {return}; 23 | if (sel_obj.hasOwnProperty('baseline') || sel_obj.constructor.name === "TextFrame") { 24 | var char_obj = sel_obj.characters; 25 | var outline_arr = []; 26 | for (var i=0, iL=char_obj.length; i < iL ; i++) { 27 | var outlined_obj; 28 | // スペースなどの無形の字はエラーになるのではじく。 29 | try{ 30 | outlined_obj = char_obj[i].createOutlines ( remove_org ); 31 | } catch(e){} 32 | if (outlined_obj !== undefined) { 33 | outline_arr.push( outlined_obj[0] ); 34 | } 35 | } 36 | for (var j=0, jL=outline_arr.length; j < jL ; j++) { 37 | outline_arr[j].move(undefined,[2, 2]); // ずらしたくなければコメントアウト 38 | //元の塗り色線色をバックアップ 39 | var current_fill_color = outline_arr[j].fillColor; 40 | var current_stroke_color = outline_arr[j].strokeColor; 41 | //オーバープリントオフにする処理、簡易版 42 | outline_arr[j].fillColor = "Paper"; 43 | outline_arr[j].fillColor = current_fill_color; 44 | outline_arr[j].strokeColor = "Paper"; 45 | outline_arr[j].strokeColor = current_stroke_color; 46 | } 47 | //グループ化しておく 48 | doc.pages[0].groups.add(outline_arr); 49 | }; 50 | 51 | } -------------------------------------------------------------------------------- /text_edit/get_current_line.js: -------------------------------------------------------------------------------- 1 | /** 2 | * return line number 3 | * 4 | * @param {Object} target_obj InsertionPoint, Character, Word... 5 | * @returns {Number} Line number 6 | */ 7 | 8 | var get_current_line = function() { 9 | $.localize = true; 10 | if (app.selection.length !== 1 ) {return}; 11 | 12 | var sel_obj = app.selection[0]; 13 | if (! sel_obj.hasOwnProperty('baseline')) {alert("テキストじゃないね"); return}; 14 | 15 | var result = get_lines_intext (sel_obj); 16 | var enline = result === 1 ? 'Line ' : 'Lines '; 17 | alert({en:enline + result, ja:result + "行目です"}); 18 | 19 | function get_lines_intext (target_obj) { 20 | var line_obj = target_obj.lines[0]; 21 | if (line_obj.parent.constructor.name === "Cell") { 22 | var parent_line_obj = target_obj.parent.texts[0].lines; 23 | } 24 | else{ 25 | var parent_line_obj = target_obj.parentTextFrames[0].texts[0].lines; 26 | } 27 | for (var i=0, iL=parent_line_obj.length; i < iL ; i++) { 28 | if (parent_line_obj[i].index === line_obj.index){ 29 | return i+1; 30 | } 31 | }; 32 | } 33 | }; 34 | 35 | // run 36 | get_current_line(); -------------------------------------------------------------------------------- /text_edit/import_text_skip_anchored_obj.js: -------------------------------------------------------------------------------- 1 | /** 2 | * place text 3 | * 4 | * 2011-02-15 5 | */ 6 | 7 | if ( app.documents.length !== 0 && app.selection.length ===1 ) { 8 | var doc_obj = app.documents[0]; 9 | var sel_obj = doc_obj.selection[0]; 10 | var sel_fr = sel_obj.parentTextFrames[0]; 11 | 12 | // marker for place anchored objects 13 | var anch_tag = "[[an]]"; 14 | 15 | if (sel_obj.hasOwnProperty('baseline')) { 16 | sel_obj.parentTextFrames[0].insertLabel('anch','master'); 17 | 18 | // GOTO FUNC remove all text but exclude anchored objects 19 | var bk_frame = remain_anch (sel_obj); 20 | 21 | // GOTO FUNC import text source 22 | var imp_source = import_source (); 23 | if ( !imp_source ) { 24 | exit(); 25 | } 26 | for (var i=0, iL=imp_source.length; i < iL ; i++) { 27 | sel_fr.parentStory.contents = imp_source.join('\r'); 28 | }; 29 | // sel_obj.select(); 30 | 31 | var bk_frame_char = bk_frame.parentStory.characters; 32 | 33 | app.findTextPreferences = null; 34 | app.findTextPreferences.findWhat = anch_tag; 35 | var match_obj = sel_fr.parentStory.findText(); 36 | 37 | for (var i=0, iL=match_obj.length; i < iL ; i++) { 38 | try { 39 | if (app.version.split(".")[0] >= 6) { 40 | bk_frame_char[i].duplicate(LocationOptions.BEFORE, match_obj[i]); 41 | } 42 | else { 43 | bk_frame_char[i].duplicate(LocationOptions.AFTER, match_obj[i]); 44 | } 45 | } 46 | catch(e){} 47 | if (bk_frame_char[i].isValid) { 48 | // SHIT !! 49 | // when CS4 LocationOptions.AFTER remove both tag and anchored obj 50 | // when CS3 LocationOptions.BEFORE remove both tag and anchored obj 51 | match_obj[i].remove(); 52 | }; 53 | }; 54 | diff_num = bk_frame.parentStory.characters.length - match_obj.length; 55 | if (diff_num === 0) { 56 | bk_frame.remove(); 57 | alert( "done." ); 58 | } 59 | else { 60 | var result = diff_num > 0 ? Math.abs(diff_num) + " anchor(s) left" : Math.abs(diff_num) + " tag(s) left" 61 | alert( result ); 62 | } 63 | }; 64 | }; 65 | 66 | 67 | /** 68 | * remain anchored object in story 69 | * 70 | * @param {Object} sel TextObject 71 | * @returns {Object} Return textframe includes only anchored objects 72 | */ 73 | 74 | function remain_anch (sel) { 75 | var bk = sel.parentTextFrames[0].duplicate(); 76 | // bk.insertLabel('anch','slave'); 77 | var story_obj = bk.parentStory; 78 | story_obj.texts[0].select(); 79 | 80 | // FUNC 81 | remove_otherthan_key(story_obj, String.fromCharCode("0xfffc")); 82 | return bk; 83 | } 84 | 85 | 86 | 87 | /** 88 | * import text source 89 | * 90 | * @returns {Array} Text source as array 91 | */ 92 | 93 | function import_source () { 94 | var src_path = File.openDialog("choose"); 95 | if (src_path !== null) { 96 | src_obj = new File(src_path); 97 | flg = src_obj.open("r"); 98 | if (flg) { 99 | var src_arr = []; 100 | while ( ! src_obj.eof ) { 101 | src_arr.push(src_obj.readln()); 102 | }; 103 | src_obj.close(); 104 | return src_arr 105 | }; 106 | } 107 | else{ 108 | return 109 | } 110 | } 111 | 112 | /** 113 | * remain keyword / remove other than key 114 | * 115 | * @param {Object} sel Text Selection 116 | * @param {String} key Keyword 117 | * 118 | * @example 119 | * var keyword = "any keyword"; 120 | * var keyword = String.fromCharCode("0xfffc"); 121 | * remove_otherthan_key(app.selection[0], keyword); 122 | */ 123 | 124 | function remove_otherthan_key (sel, key) { 125 | if (sel == null) { 126 | return 127 | }; 128 | var sel_con = sel.contents; 129 | var check_arr = []; 130 | 131 | var start_p = 0; 132 | for (var i=0, iL=sel_con.length; i < iL ; i++) { 133 | var an = sel_con.indexOf(key, start_p); 134 | if (an === -1) { 135 | break; 136 | }; 137 | check_arr.push(an); 138 | start_p = an+1; 139 | }; 140 | 141 | // $.writeln(check_arr); //index 142 | var char_obj = sel.characters; 143 | try { 144 | char_obj.itemByRange(check_arr[check_arr.length-1]+1,-1).remove(); 145 | } 146 | catch(e){} 147 | 148 | char_obj = app.selection[0].characters; // define again after remove 149 | 150 | for (var ii = check_arr.length -1 ; ii >= 1; ii--){ 151 | var start = check_arr[ii-1]+1 152 | var end = check_arr[ii]-1 153 | var range_char = char_obj.itemByRange( start, end ); 154 | try { 155 | range_char.remove(); 156 | }catch(e){} 157 | 158 | char_obj = app.selection[0].characters; // define again after remove 159 | 160 | }; 161 | if (check_arr[0] !== 0) { 162 | try { 163 | char_obj.itemByRange(0,check_arr[0]-1).remove(); 164 | }catch(e){} 165 | }; 166 | } -------------------------------------------------------------------------------- /text_edit/increase_decrease_textscale.js: -------------------------------------------------------------------------------- 1 | //選択部分のバラバラな長体率や平体率を個別に増減 2 | var n=-1; 3 | if(app.documents.length > 0 && app.selection.length > 0){ 4 | main(n); 5 | } 6 | 7 | function main (n){ 8 | var selObj=app.selection; 9 | for( var j=0; j < selObj.length; j++){ 10 | switch(selObj[j].constructor.name){ 11 | case "Character": 12 | case "Word": 13 | case "TextStyleRange": 14 | case "Line": 15 | case "Text": 16 | case "Paragraph": 17 | case "TextColumn": 18 | case "TextFrame": increaseEach (selObj[j], n); break; 19 | case "Table": 20 | case "Cell": increaseEachTable (selObj[j], n); break; 21 | //default : 22 | } 23 | } 24 | } 25 | 26 | function increaseEach (selObj, n, hv){ 27 | if(hv==undefined){ 28 | var HorV=selObj.parentStory.storyPreferences.storyOrientation==HorizontalOrVertical.HORIZONTAL ? 'horizontalScale':'verticalScale'; 29 | }else{HorV=hv;} 30 | //var colorLoop=["Cyan", "Magenta","Yellow"];// Text Style Rangeごとに3色をループ 31 | var txSRange=selObj.textStyleRanges; 32 | for(i=0, L=txSRange.length; i < L; i++){ 33 | //txSRange[i].fillColor=app.documents[0].colors.item(colorLoop[i%3]); // Text Style Rangeごとに3色をループ 34 | txSRange[i][HorV]+=n; 35 | } 36 | } 37 | 38 | function increaseEachTable(selObj, n){ 39 | var cellObj=selObj.cells; 40 | for(var ii=0, LL=cellObj.length; ii < LL; ii++){ 41 | var HorV=cellObj[ii].writingDirection==HorizontalOrVertical.HORIZONTAL ? 'horizontalScale':'verticalScale'; 42 | increaseEach (cellObj[ii].texts[0], n, HorV); 43 | } 44 | } -------------------------------------------------------------------------------- /text_edit/specialcharacter.js: -------------------------------------------------------------------------------- 1 | #target 'InDesign' 2 | //insert special characters to selected textframe 3 | 4 | 5 | var spchar=[ 6 | 1396798051, 1396798059, 1396797805, 1396798307, 1396797550, 1396862068, 1396927554, 1396929140, 1396991858, 1396983920, 1397777484, 1396984945, 1396986481, 1396986737, 1397518451, 1397058884, 1397058899, 1397059140, 1397059155, 1396855379, 1397059650, 1397122899, 1399746146, 1397124179, 1399221837, 1397124194, 1397125698, 1397256787, 1397253989, 1397254003, 1397252717, 1397319796, 1399616109, 1397649518, 1397645928, 1397645907, 1397715010, 1397778242, 1397776754, 1397780590, 1397780051, 1397847379, 1397904493, 1397909876, 1400007789, 1400073805, 1400073811, 1397967985, 1397969521, 1397969777, 1397975379, 1397781622, 1398042195, 1398040659, 1398041963, 1397780074 7 | ]; 8 | 9 | for(var i = 0; i< spchar.length; i++){ 10 | app.selection[0].insertionPoints[-1].contents = spchar[i]; 11 | } -------------------------------------------------------------------------------- /text_edit/unicode_salogate_pair.js: -------------------------------------------------------------------------------- 1 | //20000-2ffff 2 | 3 | iL = 0x2ffff - 0x20000; 4 | for (i=0; i < iL; i++){ 5 | x = "0x"+(0x20000 + i).toString(16); 6 | $.writeln( d(x) ); 7 | } 8 | 9 | salo(0x2000b); 10 | function salo(x){ 11 | var s; 12 | var a; //上位サロゲート 13 | var b; //下位サロゲート 14 | x -= 0x10000; 15 | a = Math.floor(x / 0x400); //Math.floor()で整数値に変換 16 | a += 0xD800; 17 | b = x % 0x400; 18 | b += 0xDC00; 19 | s = String.fromCharCode(a,b); 20 | return s; 21 | } -------------------------------------------------------------------------------- /textframe/break_textchain.js: -------------------------------------------------------------------------------- 1 | //選択オブジェクトのテキスト連結解除する 2 | var unlink_textframe = function() { 3 | if (app.documents.length === 0) {return}; 4 | if (app.selection.length === 0) {return}; 5 | 6 | var sel = app.selection; 7 | unlink_textframe(sel); 8 | 9 | function unlink_textframe(sel){ 10 | for(var i=0, iL=sel.length; i < iL; i++){ 11 | switch(sel[i].constructor.name){ 12 | case "InsertionPoint": 13 | case "Character": 14 | case "Word": 15 | case "TextStyleRange": 16 | case "Line": 17 | case "Paragraph": 18 | case "TextColumn": 19 | 20 | case "TextFrame": 21 | var target_frame = sel[i].parentStory.textContainers; 22 | for(var j = target_frame.length-1; j >0; j--){ 23 | target_frame[j].previousTextFrame=NothingEnum.NOTHING; 24 | } 25 | break; 26 | 27 | case "Group": 28 | arguments.callee(sel[i].textFrames); 29 | break; 30 | 31 | default: break; 32 | } 33 | } 34 | } 35 | }; 36 | 37 | // run 38 | unlink_textframe(); -------------------------------------------------------------------------------- /textframe/convert_to_graphic_frame.js: -------------------------------------------------------------------------------- 1 | // テキストフレームをグラフィックフレームに変換 2 | // 第二引数 true で中身の文字が会った場合、消去の前に確認しない、false で確認メッセージ 3 | var convert_to_graphicframe = function (sel, force_delete_text){ 4 | for(var i=0; i < sel.length; i++){ 5 | var target; 6 | switch(sel[i].constructor.name){ 7 | case "InsertionPoint": 8 | target = sel[i].parentTextFrames[0]; break; 9 | case "TextFrame": 10 | case "Rectangle": 11 | target = sel[i]; break; 12 | case "Group": break; 13 | // グループは処理しない 14 | 15 | default : break; 16 | } 17 | if (target == undefined) {return}; 18 | // target が undefinedの場合以下処理しない 19 | 20 | if(target.contentType == ContentType.TEXT_TYPE){ 21 | try{ 22 | target.contentType = ContentType.GRAPHIC_TYPE; 23 | } 24 | catch(e){ 25 | if(force_delete_text == true){ 26 | // textsだとオーバーフローした分が残ってエラーになる 27 | target.parentStory.contents = ""; 28 | target.contentType = ContentType.GRAPHIC_TYPE; 29 | } 30 | else{ 31 | var delete_text = confirm("\""+target.texts[0].contents+"\" 文字情報がありますが消してよいか?",true); 32 | if(delete_text == true){ 33 | target.parentStory.contents = ""; 34 | target.contentType = ContentType.GRAPHIC_TYPE; 35 | } 36 | } 37 | } 38 | } 39 | } 40 | } 41 | 42 | // run 43 | convert_to_graphicframe(app.selection, false); -------------------------------------------------------------------------------- /window/close_all_with_saving.js: -------------------------------------------------------------------------------- 1 | /* 2 | Close all documents with saving 3 | for Photoshop, Illustrator, InDesign 4 | */ 5 | switch(app.name){ 6 | case "Adobe Photoshop": 7 | case "Adobe Illustrator": 8 | while (app.documents.length > 0){ 9 | try { 10 | app.activeDocument.close(SaveOptions.SAVECHANGES); 11 | // if document has not saved yet, saving dialog appear 12 | } 13 | catch(e){ 14 | // if saving dialog was canceled 15 | alert("saving document was canceled by user"); 16 | break; 17 | } 18 | } 19 | break; 20 | 21 | case "Adobe InDesign": 22 | while (app.documents.length > 0){ 23 | var doc = app.documents[0]; 24 | if (has_fullpath (doc)) { 25 | doc.close(SaveOptions.yes); 26 | } 27 | else { 28 | // alert("Document doesn't saved yet. Saving document was canceled"); 29 | saved = doc.save(); 30 | // $.writeln(saved.name); 31 | if (saved) { 32 | doc.close(); 33 | } 34 | else { 35 | exit(); 36 | }; 37 | } 38 | }; 39 | break; 40 | } 41 | 42 | function has_fullpath (doc) { 43 | return doc.properties['fullName'] !== undefined 44 | } 45 | -------------------------------------------------------------------------------- /window/close_all_without_save.js: -------------------------------------------------------------------------------- 1 | /* 2 | 全てのドキュメントを保存せずに閉じる 3 | Photoshop, Illustrator, InDesign共用 4 | */ 5 | switch(app.name){ 6 | case "Adobe Photoshop": 7 | case "Adobe Illustrator": 8 | while (app.documents.length > 0){ 9 | app.activeDocument.close(SaveOptions.DONOTSAVECHANGES); 10 | }; break; 11 | 12 | case "Adobe InDesign": 13 | while (app.documents.length > 0){ 14 | app.activeDocument.close(SaveOptions.no); 15 | }; break; 16 | } -------------------------------------------------------------------------------- /window/display_setting.js: -------------------------------------------------------------------------------- 1 | /** 2 | * display setting memo 3 | */ 4 | var wins = app.layoutWindows; 5 | var display_set = app.displaySettings; 6 | 7 | // OPTIMIZED 8 | if (wins[0].viewDisplaySetting === ViewDisplaySettings.OPTIMIZED){ 9 | with (display_set[0]){ 10 | greekBelow = 20; 11 | } 12 | } 13 | var bk0 = {raster:1917284985, // TagRaster.GRAY_OUT 14 | vector:1917284985, // TagVector.GRAY_OUT 15 | transparency:1330005536, //TagTransparency.OFF 16 | antialiasing:false, 17 | greekBelow:7, 18 | }; 19 | 20 | // TYPICAL 21 | if (wins[0].viewDisplaySetting === ViewDisplaySettings.TYPICAL){ 22 | with (display_set[1]){ 23 | greekBelow = 5; 24 | antialiasing = false; 25 | } 26 | } 27 | var bk1 = {raster:1917874808, // TagRaster.PROXY 28 | vector:1917874808, // TagVector.PROXY 29 | transparency:1481663597, // TagTransparency.MEDIUM_QUALITY 30 | antialiasing:true, 31 | greekBelow:7, 32 | }; 33 | 34 | // HIGH_QUALITY 35 | if (wins[0].viewDisplaySetting === ViewDisplaySettings.HIGH_QUALITY){ 36 | display_set[2].greekBelow = 1; 37 | } 38 | var bk2 = {raster:1917348177, // TagRaster.HIGH_RESOLUDION 39 | vector:1917348177, // TagVector.HIGH_RESOLUDION 40 | transparency:1346922866, //TagTransparency.HIGH_QUALITY 41 | antialiasing:true, 42 | greekBelow:7, 43 | }; 44 | 45 | // RESTORE 46 | var bk_arr = [bk0, bk1, bk2]; 47 | for (var dsi=0, dsiL=display_set.length; dsi < dsiL ; dsi++) { 48 | display_set[dsi].properties = bk_arr[dsi]; 49 | }; -------------------------------------------------------------------------------- /window/goto_page_in_new_window.js: -------------------------------------------------------------------------------- 1 | //指定ページで新規ウィンドウ 2 | var goto_page_in_new_window = function() { 3 | if (app.documents.length === 0) {return}; 4 | var doc = app.documents[0]; 5 | var dlg = app.dialogs.add({name:"go to page"}); 6 | with(dlg){ 7 | with (dialogColumns.add()){ 8 | var page_no = textEditboxes.add({ 9 | //デフォルト表示は現在のアクティブページ 10 | editContents: app.windows[0].activePage.appliedSection.name+app.windows[0].activePage.name, 11 | minWidht:30 12 | }) 13 | } 14 | } 15 | if(dlg.show() == true){ 16 | var goto_page = page_no.editContents; 17 | var calc_page = eval(goto_page).toString(); 18 | dlg.destroy(); 19 | //新規ウインドウ 20 | var new_win = doc.windows.add(); 21 | try{ 22 | //ページに行ってみる 23 | new_win.activePage = doc.pages.item(goto_page); 24 | } 25 | catch(e){ 26 | //ページがなかったら 27 | try{ 28 | //計算してみる 29 | new_win.activePage = doc.pages.item(calc_page); 30 | } 31 | catch(e){ 32 | new_win.close(); 33 | alert("The page does not exist."); 34 | } 35 | } 36 | } 37 | else{ 38 | dlg.destroy(); 39 | } 40 | }; 41 | 42 | // run 43 | goto_page_in_new_window(); --------------------------------------------------------------------------------